103 Commits

Author SHA1 Message Date
tomoko-dev
fafcff9f58 Merge pull request #190 from cargoedit/master
chore: remove unused min/max func
2025-10-10 13:51:07 -04:00
cargoedit
50cb850273 chore: remove unused min/max func
Signed-off-by: cargoedit <cargoedit@outlook.com>
2025-09-25 17:22:41 +08:00
tomoko-dev
54b605329a Update README.md 2025-08-14 18:05:10 -04:00
tomoko-dev
6942dad3aa Update README.md
small thing added
2025-08-14 18:02:36 -04:00
tomoko-dev
99aeef0156 Merge pull request #188 from growfrow/master
chore: remove redundant words in comment
2025-03-16 19:09:59 -04:00
growfrow
1d44337dfd chore: remove redundant words in comment
Signed-off-by: growfrow <growfrow@outlook.com>
2025-03-17 00:48:27 +08:00
konamicode
ed15a54980 Update README.md 2025-03-06 21:16:25 -05:00
konamicode
c3e3113615 Update README.md 2025-03-06 21:15:53 -05:00
konamicode
bfc138bd9a Update README.md 2025-03-06 21:14:26 -05:00
konamicode
906e8783f3 Update README.md 2025-03-06 21:06:05 -05:00
konamicode
21c932cbeb Update README.md 2025-03-06 21:05:14 -05:00
konamicode
52d74995f5 Update Makefile 2025-03-06 21:01:53 -05:00
konamicode
387e57f54e Update Makefile
updating one more time
2025-03-06 19:59:47 -05:00
konamicode
fd8c1124f9 Update README.md 2025-03-06 19:24:40 -05:00
konamicode
f0d2cc0b02 Update Makefile
updated make file so golang version can work on older versions
2025-03-06 19:02:03 -05:00
konamicode
67faa7794d Add files via upload 2025-01-28 22:02:27 -05:00
konamicode
28e18703e5 Update frontpage.mustache 2025-01-28 22:01:20 -05:00
konamicode
ab795ba1ee Create 404chan.css 2025-01-28 21:59:58 -05:00
konamicode
8903661383 Update 404.mustache 2025-01-28 21:59:05 -05:00
konamicode
fa3b68c708 Update krane.css 2025-01-26 23:16:22 -05:00
konamicode
b7e43d3725 Update README.md 2025-01-25 23:12:50 -05:00
konamicode
e0469e8c7f Update README.md 2025-01-25 23:10:28 -05:00
konamicode
cba6de85af Update README.md 2025-01-25 23:08:35 -05:00
konamicode
d4a41db15f Update README.md 2025-01-25 23:07:39 -05:00
konamicode
5bbcfc8bef Update README.md 2025-01-25 23:06:56 -05:00
nesshy
a2cf5a419b Update frontpage.mustache
frontpage updated :-D
2025-01-25 14:03:30 -05:00
nesshy
aeee8a7e92 Update README.md 2025-01-21 22:14:20 -05:00
nesshy
922ebd727b Update frontpage.mustache 2025-01-21 20:51:48 -05:00
nesshy
e7f01ca35c Update README.md 2025-01-21 15:07:49 -05:00
nesshy
53acf0adf6 Create nntpchan.js
added javascript
2025-01-21 12:33:29 -05:00
nesshy
da10557324 Update README.md 2025-01-21 12:29:50 -05:00
nesshy
c3dec20a57 Update README.md
updated readme
2025-01-21 12:28:25 -05:00
nesshy
a8cd2a2c47 Update Makefile
updated makefile
2025-01-21 12:24:57 -05:00
jeff
306bfbaf50 Merge pull request #187 from nesshy9/patch-1
Update Makefile
2024-10-25 19:03:39 -04:00
nesshy
38f12d18aa Update Makefile
updated makefile
2024-10-25 15:06:08 -07:00
Jeff Becker
f92f68c3cd close connection 2020-03-07 09:07:23 -05:00
Jeff Becker
77fe66c330 log tls error 2020-03-07 09:05:21 -05:00
Jeff Becker
ff8c3e915a get rootiest post 2020-03-07 08:27:45 -05:00
Jeff Becker
2f5f84da4b Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2020-02-10 17:30:17 -05:00
Jeff Becker
477acabd19 current year 2020-02-10 17:30:06 -05:00
jeff
e2cbffea30 meh 2019-09-16 07:00:50 -04:00
jeff
0261f26043 fix style 2019-09-16 06:57:41 -04:00
jeff
5381c7b2a4 hide stuff 2019-09-16 06:53:53 -04:00
jeff
015c64139d fix mod action js 2019-09-16 06:51:11 -04:00
Jeff
4b08919f75 don't give out banned newsgroups in list 2019-08-31 15:17:54 -04:00
Jeff
15ccb7ad50 only force overchan prefix if no . is present 2019-08-31 07:56:07 -04:00
Jeff
12709d364b catch case 2019-08-30 18:54:00 -04:00
Jeff
34ce6f805a Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-05-15 07:12:19 -04:00
Jeff
40a5e9be3f don't always use lowercase 2019-05-15 07:12:00 -04:00
Jeff
8f39dec91b Update building.md 2019-04-07 08:52:49 -04:00
Jeff
afb98efb2a Merge pull request #177 from cathugger/master
srnd: saner default max message size
2019-04-06 15:13:41 -04:00
cathugger
d8f888dffa srnd: saner default max message size 2019-04-06 20:36:54 +03:00
Jeff Becker
a207f1aaea Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-04-04 07:25:45 -04:00
Jeff Becker
558dacac79 off 2019-04-04 07:25:38 -04:00
Jeff
f5d68e17f1 Merge pull request #176 from cathugger/master
srnd: change unicode tripcode rune range
2019-03-29 17:33:16 -04:00
cathugger
c8e3faa4c6 srnd: change unicode tripcode rune range 2019-03-29 23:13:32 +02:00
Jeff Becker
43ce4490ed fix crash 2019-03-03 12:55:54 -05:00
Jeff Becker
3f8c583791 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-03-03 12:51:35 -05:00
Jeff Becker
b4d2de6ec8 add limit to search 2019-03-03 12:51:25 -05:00
Jeff
0972f86714 more 2019-03-02 15:17:47 -05:00
Jeff
ab6fe44e8d more 2019-03-02 15:15:00 -05:00
Jeff
bf43469a89 more 2019-03-02 15:13:24 -05:00
Jeff Becker
41682f1712 more 2019-03-02 11:29:45 -05:00
Jeff Becker
0176b7f038 more 2019-03-02 11:28:48 -05:00
Jeff Becker
3807561ca1 more 2019-03-02 11:27:25 -05:00
Jeff Becker
cbc8528f4c more 2019-03-02 11:26:24 -05:00
Jeff Becker
97fccd342f more 2019-03-02 11:24:22 -05:00
Jeff Becker
118f7f4ee0 mroe 2019-03-02 11:22:59 -05:00
Jeff Becker
686cfb7831 more 2019-03-02 11:20:48 -05:00
Jeff Becker
d051ac77f7 more 2019-03-02 11:19:14 -05:00
Jeff Becker
4ae08d2c11 fix 2019-03-02 11:17:15 -05:00
Jeff Becker
794e2350cd meh 2019-03-02 11:13:26 -05:00
Jeff Becker
1d0f501968 fix 2019-03-02 11:11:37 -05:00
Jeff Becker
0252dfa512 add option to fetch referenced uri 2019-03-02 11:10:05 -05:00
Jeff Becker
8ef4322fba css fix 2019-03-02 10:25:06 -05:00
Jeff Becker
1b03dce124 update placebo theem 2019-03-02 10:24:18 -05:00
Jeff Becker
6807aaee3d fix stuff and add uri in post form 2019-03-02 10:21:45 -05:00
Jeff Becker
a00630a6b3 wut 2019-02-19 08:52:51 -05:00
Jeff Becker
9d43d84926 try fixing captcha 2019-02-19 08:45:10 -05:00
Jeff Becker
c1afacda17 more css 2019-02-16 06:41:10 -05:00
Jeff Becker
df93bf3f4b tweak css 2019-02-16 06:38:04 -05:00
Jeff Becker
88b869c4c8 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-02-15 07:19:38 -05:00
Jeff Becker
fedc284478 update docs 2019-02-15 07:19:29 -05:00
Jeff
f664bc6a9b fix og title on thread 2019-02-13 16:16:11 -05:00
Jeff Becker
af13a99954 remove uneeded rule 2019-02-13 12:15:45 -05:00
Jeff Becker
8f7d57f64d fix 2019-02-13 08:37:04 -05:00
Jeff Becker
e13dcf9e20 don't use bad locale 2019-02-13 08:34:54 -05:00
Jeff Becker
74ca4caca5 muck about 2019-02-13 08:29:55 -05:00
Jeff Becker
7e1a6cc8f5 disable functionality 2019-02-11 08:02:27 -05:00
Jeff Becker
04fc996c2d update style 2019-02-10 14:35:14 -05:00
Jeff Becker
8cad631e73 update templates 2019-02-10 14:33:06 -05:00
Jeff Becker
679382c7f5 meh 2019-02-10 14:31:57 -05:00
Jeff Becker
acb0b350e0 meh 2019-02-10 14:31:17 -05:00
Jeff Becker
de14087362 more 2019-02-10 14:30:11 -05:00
Jeff Becker
02e8089668 fug 2019-02-10 14:29:32 -05:00
Jeff Becker
fe68932c7b fug 2019-02-10 14:28:25 -05:00
Jeff Becker
54b8df91d4 tpyo 2019-02-10 14:27:45 -05:00
Jeff Becker
80bf47eec4 add more crap for mods 2019-02-10 14:25:51 -05:00
Jeff Becker
67e0f259b6 add reveal secrets in mod stream 2019-02-10 14:11:04 -05:00
Jeff Becker
59068bb961 eh 2019-01-29 06:57:08 -05:00
Jeff Becker
bcddab9af6 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-01-29 06:50:38 -05:00
Jeff
31b6f814d4 more 2019-01-28 13:39:03 -05:00
Jeff Becker
25cb6b7d3f bump version 2019-01-27 09:54:11 -05:00
36 changed files with 1934 additions and 187 deletions

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2015-2018 Jeff Becker
Copyright (c) 2015-2020 Jeff Becker
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -36,7 +36,8 @@ js: $(JS)
srnd: $(SRND)
$(MINIFY):
GOPATH=$(REPO_GOPATH) $(GO) get -v github.com/tdewolff/minify/cmd/minify
GO111MODULE=on GOPATH=$(REPO_GOPATH) go get -u github.com/tdewolff/minify
$(GOPHERJS):
GOROOT=$(GOPHERJS_GOROOT) GOPATH=$(GOPHERJS_GOPATH) $(GOPHERJS_GO) get -v github.com/gopherjs/gopherjs
@@ -51,11 +52,6 @@ $(MINER_JS): $(GOPHERJS) $(MINIFY)
rm -f miner.js.map miner.js
$(JS): js-deps
rm -f $(JS)
for f in $(CONTRIB_JS)/*.js ; do $(MINIFY) --mime=text/javascript >> $(JS) < $$f ; done
$(MINIFY) --mime=text/javascript >> $(JS) < $(REPO)/contrib/js/entry.js
for f in $(LOCAL_JS)/*.js ; do $(MINIFY) --mime=text/javascript >> $(JS) < $$f ; done
for f in $(VENDOR_JS)/*.js ; do $(MINIFY) --mime=text/javascript >> $(JS) < $$f ; done
$(SRND):

View File

@@ -7,19 +7,73 @@
**NNTPChan** (previously known as overchan) is a decentralized imageboard that uses the [NNTP protocol](https://en.wikipedia.org/wiki/Network_News_Transfer_Protocol) (network-news transfer protocol) to synchronize content between many different servers. It utilizes cryptographically signed posts to perform optional/opt-in decentralized moderation.
## Getting started
## Getting started Ubuntu 24.04 installation guide
[This](doc) is a step-by-step guide for getting up-and-running with NNTPChan as well as documentation for developers who want to either work on NNTPChan directly or use NNTPChan in their aplications with the API.
[This](doc) is a step-by-step guide for getting up-and-running with NNTPChan as well as documentation for developers who want to either work on NNTPChan directly or use NNTPChan in their aplications with the API. It works fine on ubuntu 24.04
TL;DR edition:
### Step 1: Download Go 1.15 Tarball
```
wget https://dl.google.com/go/go1.15.linux-amd64.tar.gz
```
### Step 2: Extract the Tarball
```
sudo tar -C /usr/local -xvzf go1.15.linux-amd64.tar.gz
```
### Set Up Go Environment Variables
```
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```
### Install the dependancies
sudo apt-get update
sudo apt-get --no-install-recommends install imagemagick ffmpeg sox build-essential git ca-certificates postgresql postgresql-client golang
### Get the NNTPChan source
git clone https://github.com/konamicode9/nntpchan
cd nntpchan
### Now compile!
Run `make`:
make
## now its time to create the database in postgres
```
CREATE DATABASE root;
CREATE USER root WITH PASSWORD 'root';
GRANT ALL PRIVILEGES ON DATABASE root TO root;
```
note this only allows db root and username root
not sure why but i will investigate oh and the default port is 5432
your gonna need it in the installation
Running NNTPChan
================
Once you have [built NNTPChan](building.md) and done [the initial setup you](setting-up.md) you can start NNTPChan.
Before running make sure you run the setup command, you only need to do this one time:
./srndv2 setup
You can now start the NNTPChan node (srndv2) by running:
./srndv2 run
Now you can check out the web-interface by navigating to 127.0.0.1:18000 (default address - unless you have changed it in your `srnd.ini`) or you can [configure your newsreader](extras/configure-newsreader.md).
$ sudo apt update
$ sudo apt install --no-install-recommends install imagemagick ffmpeg sox build-essential git ca-certificates postgresql postgresql-client
$ git clone https://github.com/majestrate/nntpchan
$ cd nntpchan
$ make
$ SRND_INSTALLER=0 ./srndv2 setup
## Support chat
https://discord.gg/Ydss9wTk7G
## Bugs and issues
@@ -35,14 +89,6 @@ Web:
* [Yukko](https://github.com/faissaloo/Yukko): ncurses based nntpchan web ui reader
## Support
Need help? Join us on IRC.
1. [freenode: #nntpchan](https://webchat.freenode.net/?channels=#nntpchan)
2. [rizon: #nntpchan](https://qchat.rizon.net/?channels=#nntpchan) - Most active
## History
* started in mid 2013 on anonet
@@ -55,13 +101,6 @@ This is a graph of the post flow of the `overchan.test` newsgroup over 4 years,
[source code for map generation](https://github.com/nilesr/nntpchan-mapper)
## Donations
Like this project? Why not help by funding it? This address pays for the server that runs `2hu-ch.org`
Bitcoin: 15yuMzuueV8y5vPQQ39ZqQVz5Ey98DNrjE
Monero: 46thSVXSPNhJkCgUsFD9WuCjW4K41DAHGL9khni2VEqmZZhfEZVvcukCp357rfhngZdviZMaeNdj5CLqhLyeK2qZRBCyL7Q
## Acknowledgements

View File

@@ -122,7 +122,7 @@ func (self *nntpAttachment) Save(dir string) (err error) {
fpath := filepath.Join(dir, self.filepath)
if !CheckFile(fpath) {
var f io.WriteCloser
// does not exist so will will write it
// does not exist so will write it
f, err = os.Create(fpath)
if err == nil {
_, err = f.Write(self.Bytes())

View File

@@ -581,7 +581,7 @@ func (self *NNTPDaemon) Run() {
self.register_connection = make(chan *nntpConnection)
self.deregister_connection = make(chan *nntpConnection)
self.send_all_feeds = make(chan ArticleEntry)
self.send_all_feeds = make(chan ArticleEntry, 128)
self.activeConnections = make(map[string]*nntpConnection)
self.loadedFeeds = make(map[string]*feedState)
self.register_feed = make(chan FeedConfig)
@@ -589,7 +589,7 @@ func (self *NNTPDaemon) Run() {
self.get_feeds = make(chan chan []*feedStatus)
self.get_feed = make(chan *feedStatusQuery)
self.modify_feed_policy = make(chan *modifyFeedPolicyEvent)
self.ask_for_article = make(chan string)
self.ask_for_article = make(chan string, 128)
self.pump_ticker = time.NewTicker(time.Millisecond * 100)
if self.conf.daemon["archive"] == "1" {
@@ -903,17 +903,17 @@ func (self *NNTPDaemon) processMessage(msgid string) {
if self.expire != nil {
// expire posts
log.Println("expire", group, "for", rollover, "threads")
self.expire.ExpireGroup(group, rollover)
go self.expire.ExpireGroup(group, rollover)
}
// send to mod panel
if group == "ctl" {
log.Println("process mod message", msgid)
self.mod.HandleMessage(msgid)
go self.mod.HandleMessage(msgid)
}
// inform callback hooks
go self.informHooks(group, msgid, ref)
// federate
self.sendAllFeeds(ArticleEntry{msgid, group})
go self.sendAllFeeds(ArticleEntry{msgid, group})
// send to frontend
if self.frontend != nil {
if self.frontend.AllowNewsgroup(group) {

View File

@@ -323,10 +323,10 @@ type Database interface {
GetPostingStats(granularity, begin, end int64) (PostingStats, error)
// peform search query
SearchQuery(prefix, group, text string, chnl chan PostModel) error
SearchQuery(prefix, group, text string, chnl chan PostModel, limit int) error
// find posts with similar hash
SearchByHash(prefix, group, posthash string, chnl chan PostModel) error
SearchByHash(prefix, group, posthash string, chnl chan PostModel, limit int) error
// get full thread model
GetThreadModel(prefix, root_msgid string) (ThreadModel, error)

View File

@@ -125,7 +125,7 @@ func (lc *liveChan) SendBanned() {
msg, _ := json.Marshal(map[string]string{
"Type": "ban",
// TODO: real ban message
"Reason": "your an faget, your IP was: " + lc.IP,
"Reason": "your an fagt, your IP was: " + lc.IP,
})
if lc.datachnl != nil {
lc.datachnl <- msg
@@ -392,6 +392,7 @@ func (self *httpFrontend) HandleNewPost(nntp frontendPost) {
if len(ref) > 0 {
msgid = ref
}
entry := ArticleEntry{msgid, group}
// regnerate thread
self.Regen(entry)
@@ -401,14 +402,22 @@ func (self *httpFrontend) HandleNewPost(nntp frontendPost) {
}
// regen front page
self.RegenFrontPage()
}
// create a new captcha, return as json object
func (self *httpFrontend) new_captcha_json(wr http.ResponseWriter, r *http.Request) {
s, err := self.store.Get(r, self.name)
if err != nil {
http.Error(wr, err.Error(), 500)
return
}
captcha_id := captcha.New()
resp := make(map[string]string)
// the captcha id
resp["id"] = captcha_id
s.Values["captcha_id"] = captcha_id
s.Save(r, wr)
// url of the image
resp["url"] = fmt.Sprintf("%scaptcha/%s.png", self.prefix, captcha_id)
wr.Header().Set("Content-Type", "text/json; encoding=UTF-8")
@@ -428,6 +437,7 @@ func (self *httpFrontend) handle_postform(wr http.ResponseWriter, r *http.Reques
// the post we will turn into an nntp article
pr := new(postRequest)
pr.ExtraHeaders = make(map[string]string)
if sendJson {
wr.Header().Add("Content-Type", "text/json; encoding=UTF-8")
@@ -511,6 +521,11 @@ func (self *httpFrontend) handle_postform(wr http.ResponseWriter, r *http.Reques
captcha_solution = part_buff.String()
} else if partname == "dubs" {
pr.Dubs = part_buff.String() == "on"
} else if partname == "uri" {
str := part_buff.String()
if len(str) > 0 {
pr.ExtraHeaders["X-References-Uri"] = safeHeader(str)
}
}
// we done
@@ -538,15 +553,26 @@ func (self *httpFrontend) handle_postform(wr http.ResponseWriter, r *http.Reques
}
}
sess, _ := self.store.Get(r, self.name)
sess, err := self.store.Get(r, self.name)
if err != nil {
errmsg := fmt.Sprintf("session store error: %s", err.Error())
if sendJson {
json.NewEncoder(wr).Encode(map[string]interface{}{"error": errmsg})
} else {
io.WriteString(wr, errmsg)
}
return
}
if checkCaptcha && len(captcha_id) == 0 {
cid, ok := sess.Values["captcha_id"]
if ok {
captcha_id = cid.(string)
} else {
log.Println("no captcha id in session?")
}
sess.Values["captcha_id"] = ""
}
log.Println("captcha", captcha_id, "try '", captcha_solution, "'")
if checkCaptcha && !captcha.VerifyString(captcha_id, captcha_solution) {
// captcha is not valid
captcha_retry = true
@@ -719,8 +745,7 @@ func (self *httpFrontend) handle_postRequest(pr *postRequest, b bannedFunc, e er
}
}
// always lower case newsgroups
board := strings.ToLower(pr.Group)
board := pr.Group
// post fail message
banned, err = self.daemon.database.NewsgroupBanned(board)
@@ -965,6 +990,7 @@ func (self *httpFrontend) serve_captcha(wr http.ResponseWriter, r *http.Request)
if err == nil {
captcha_id := captcha.New()
s.Values["captcha_id"] = captcha_id
log.Println("captcha_id", captcha_id)
s.Save(r, wr)
redirect_url := fmt.Sprintf("%scaptcha/%s.png", self.prefix, captcha_id)
// redirect to the image
@@ -1044,27 +1070,30 @@ func (self httpFrontend) handle_authed_api(wr http.ResponseWriter, r *http.Reque
func (self *httpFrontend) handle_api_find(wr http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
h := q.Get("hash")
msgid := q.Get("id")
if len(h) > 0 {
msgid := q.Get("id")
if len(h) > 0 {
e, err := self.daemon.database.GetMessageIDByHash(h)
if err == nil {
msgid = e.MessageID()
}
e, err := self.daemon.database.GetMessageIDByHash(h)
if err == nil {
msgid = e.MessageID()
}
if len(msgid) > 0 {
// found it (probaly)
model := self.daemon.database.GetPostModel(self.prefix, msgid)
if model == nil {
// no model
}
if !ValidMessageID(msgid) {
msgid = ""
}
if len(msgid) > 0 {
self.daemon.store.GetMessage(msgid, func(nntp NNTPMessage) {
if nntp == nil {
wr.WriteHeader(404)
} else {
// we found it
wr.Header().Add("Content-Type", "text/json; encoding=UTF-8")
json.NewEncoder(wr).Encode([]PostModel{model})
return
}
return
}
model := PostModelFromMessage(self.prefix, nntp)
// we found it
wr.Header().Add("Content-Type", "text/json; encoding=UTF-8")
json.NewEncoder(wr).Encode([]PostModel{model})
})
return
}
s := q.Get("text")
g := q.Get("group")
@@ -1091,13 +1120,14 @@ func (self *httpFrontend) handle_api_find(wr http.ResponseWriter, r *http.Reques
}
donechnl <- 0
}(wr)
limit := 50
if len(h) > 0 {
self.daemon.database.SearchByHash(self.prefix, g, h, chnl)
go self.daemon.database.SearchByHash(self.prefix, g, h, chnl, limit)
} else {
self.daemon.database.SearchQuery(self.prefix, g, s, chnl)
go self.daemon.database.SearchQuery(self.prefix, g, s, chnl, limit)
}
chnl <- nil
<-donechnl
close(donechnl)
io.WriteString(wr, " null ]")
return
}
@@ -1533,15 +1563,15 @@ func NewHTTPFrontend(daemon *NNTPDaemon, cache CacheInterface, config map[string
front.store = sessions.NewCookieStore([]byte(front.secret))
front.store.Options = &sessions.Options{
// TODO: detect http:// etc in prefix
Path: front.prefix,
Path: "/",
MaxAge: 600,
}
// liveui related members
front.liveui_chnl = make(chan PostModel, 128)
front.liveui_register = make(chan *liveChan)
front.liveui_deregister = make(chan *liveChan)
front.liveui_chans = make(map[string]*liveChan)
front.liveui_register = make(chan *liveChan, 128)
front.liveui_deregister = make(chan *liveChan, 128)
front.liveui_chans = make(map[string]*liveChan, 128)
front.end_liveui = make(chan bool)
return front
}

View File

@@ -1,13 +1,13 @@
package srnd
import (
"errors"
"github.com/majestrate/configparser"
"golang.org/x/text/language"
"io/ioutil"
"log"
"path/filepath"
"strings"
"errors"
)
type I18N struct {
@@ -43,23 +43,23 @@ func NewI18n(locale, dir string) (*I18N, error) {
return nil, err
}
found:= false
found := false
serverLangs := make([]language.Tag, 1)
// serverLangs[0] = language.AmericanEnglish // en-US fallback
serverLangs[0] = language.AmericanEnglish // en-US fallback
for _, file := range files {
if filepath.Ext(file.Name()) == ".ini" {
name := strings.TrimSuffix(file.Name(), ".ini")
tag, err := language.Parse(name)
if err == nil {
serverLangs = append(serverLangs, tag)
found = true;
found = true
}
}
}
if !found {
return nil, ErrNoLang
}
matcher := language.NewMatcher(serverLangs)
tag, _, _ := matcher.Match(pref)

View File

@@ -198,8 +198,6 @@ type ModEngine interface {
AllowBan(pubkey string) bool
// allow janitor
AllowJanitor(pubkey string) bool
// load a mod message
LoadMessage(msgid string) NNTPMessage
// execute 1 mod action line by a mod with pubkey
Execute(ev ModEvent, pubkey string)
// do a mod event unconditionally
@@ -227,10 +225,6 @@ func (self *modEngine) MarkSpam(msgid string) (err error) {
return
}
func (self *modEngine) LoadMessage(msgid string) NNTPMessage {
return self.store.GetMessage(msgid)
}
func (self *modEngine) BanAddress(cidr string) (err error) {
return self.database.BanAddr(cidr)
}
@@ -345,22 +339,23 @@ func (self *modEngine) AllowDelete(pubkey, msgid string) (allow bool) {
}
func (mod *modEngine) HandleMessage(msgid string) {
nntp := mod.store.GetMessage(msgid)
if nntp == nil {
log.Println("failed to load", msgid, "in mod engine, missing message")
return
}
// sanity check
if nntp.Newsgroup() == "ctl" {
pubkey := nntp.Pubkey()
for _, line := range strings.Split(nntp.Message(), "\n") {
line = strings.Trim(line, "\r\t\n ")
if len(line) > 0 {
ev := ParseModEvent(line)
mod.Execute(ev, pubkey)
mod.store.GetMessage(msgid, func(nntp NNTPMessage) {
if nntp == nil {
log.Println("failed to load", msgid, "in mod engine, missing message")
return
}
// sanity check
if nntp.Newsgroup() == "ctl" {
pubkey := nntp.Pubkey()
for _, line := range strings.Split(nntp.Message(), "\n") {
line = strings.Trim(line, "\r\t\n ")
if len(line) > 0 {
ev := ParseModEvent(line)
mod.Execute(ev, pubkey)
}
}
}
}
})
}
func (mod *modEngine) Do(ev ModEvent) {

View File

@@ -81,6 +81,9 @@ type PostModel interface {
// returns true if this post was truncated
IsTruncated() bool
// return true if this post is a mod message
IsCtl() bool
IsI2P() bool
IsTor() bool
IsClearnet() bool
@@ -244,7 +247,6 @@ func (self boardPageRows) Swap(i, j int) {
self[i], self[j] = self[j], self[i]
}
type postsGraphRow struct {
day time.Time
Num int64

View File

@@ -295,6 +295,11 @@ type post struct {
Type string
nntp_id int
FrontendPublicKey string
ReferencedURI string
}
func (p *post) IsCtl() bool {
return p.board == "ctl"
}
func (self *post) NNTPID() int {
@@ -407,7 +412,7 @@ func (self *attachment) Filename() string {
return self.Name
}
func PostModelFromMessage(parent, prefix string, nntp NNTPMessage) PostModel {
func PostModelFromMessage(prefix string, nntp NNTPMessage) PostModel {
p := new(post)
p.PostName = nntp.Name()
p.PostSubject = nntp.Subject()
@@ -418,10 +423,11 @@ func PostModelFromMessage(parent, prefix string, nntp NNTPMessage) PostModel {
p.Posted = nntp.Posted()
p.op = nntp.OP()
p.prefix = prefix
p.Parent = parent
p.Parent = nntp.Reference()
p.addr = nntp.Addr()
p.sage = nntp.Sage()
p.Key = nntp.Pubkey()
p.ReferencedURI = nntp.Headers().Get("X-References-Uri", "")
p.FrontendPublicKey = nntp.FrontendPubkey()
for _, att := range nntp.Attachments() {
p.Files = append(p.Files, att.ToModel(prefix))
@@ -623,6 +629,7 @@ func (self *post) Truncate() PostModel {
// TODO: copy?
Files: self.Files,
FrontendPublicKey: self.FrontendPublicKey,
ReferencedURI: self.ReferencedURI,
}
}

View File

@@ -718,7 +718,7 @@ func (self *nntpConnection) handleLine(daemon *NNTPDaemon, code int, line string
if len(reason) > 0 {
// discard, we do not want
log.Println(self.name, "rejected", msgid, reason)
conn.PrintfLine("439 %s %s", code, msgid, reason)
conn.PrintfLine("439 %s %s", msgid, reason)
_, err = io.Copy(ioutil.Discard, msg.Body)
if ban {
err = daemon.database.BanArticle(msgid, reason)
@@ -1240,10 +1240,14 @@ func (self *nntpConnection) handleLine(daemon *NNTPDaemon, code int, line string
log.Println(self.name, "got reply to", reference, "but we don't have it")
go daemon.askForArticle(reference)
} else {
h := daemon.store.GetMIMEHeader(reference)
if strings.Trim(h.Get("References"), " ") == "" {
hdr.Set("References", getMessageID(h))
// get rootiest post
ref := reference
var h textproto.MIMEHeader
for ref != "" {
h = daemon.store.GetMIMEHeader(ref)
ref = strings.Trim(h.Get("References"), " ")
}
hdr.Set("References", getMessageID(h))
}
} else if reference != "" {
// bad message id

View File

@@ -204,7 +204,7 @@ func (self *PostgresDatabase) prepareStatements() {
GetMessageIDByHash: "SELECT message_id, message_newsgroup FROM Articles WHERE message_id_hash = $1 LIMIT 1",
CheckEncIPBanned: "SELECT 1 FROM EncIPBans WHERE encaddr = $1",
GetFirstAndLastForGroup: "WITH x(min_no, max_no) AS ( SELECT MIN(message_no) AS min_no, MAX(message_no) AS max_no FROM ArticleNumbers WHERE newsgroup = $1) SELECT CASE WHEN min_no IS NULL THEN 0 ELSE min_no END AS min_no FROM x UNION SELECT CASE WHEN max_no IS NULL THEN 1 ELSE max_no END AS max_no FROM x",
GetNewsgroupList: "SELECT newsgroup, min(message_no), max(message_no) FROM ArticleNumbers GROUP BY newsgroup ORDER BY newsgroup",
GetNewsgroupList: "SELECT newsgroup, min(message_no), max(message_no) FROM ArticleNumbers WHERE newsgroup NOT IN ( SELECT newsgroup FROM bannedgroups ) GROUP BY newsgroup ORDER BY newsgroup",
GetMessageIDForNNTPID: "SELECT message_id FROM ArticleNumbers WHERE newsgroup = $1 AND message_no = $2 LIMIT 1",
GetNNTPIDForMessageID: "SELECT message_no FROM ArticleNumbers WHERE newsgroup = $1 AND message_id = $2 LIMIT 1",
IsExpired: "WITH x(msgid) AS ( SELECT message_id FROM Articles WHERE message_id = $1 INTERSECT ( SELECT message_id FROM ArticlePosts WHERE message_id = $1 ) ) SELECT COUNT(*) FROM x",
@@ -219,10 +219,10 @@ func (self *PostgresDatabase) prepareStatements() {
GetMessageIDByCIDR: "SELECT message_id FROM ArticlePosts WHERE addr IN ( SELECT encaddr FROM EncryptedAddrs WHERE addr_cidr <<= cidr($1) )",
GetMessageIDByEncryptedIP: "SELECT message_id FROM ArticlePosts WHERE addr = $1",
GetPostsBefore: "SELECT message_id FROM ArticlePosts WHERE time_posted < $1",
SearchQuery_1: "SELECT newsgroup, message_id, ref_id FROM ArticlePosts WHERE message LIKE $1 ORDER BY time_posted DESC",
SearchQuery_2: "SELECT newsgroup, message_id, ref_id FROM ArticlePosts WHERE newsgroup = $1 AND message LIKE $2 ORDER BY time_posted DESC",
SearchByHash_1: "SELECT message_newsgroup, message_id, message_ref_id FROM Articles WHERE message_id_hash LIKE $1 ORDER BY time_obtained DESC",
SearchByHash_2: "SELECT message_newsgroup, message_id, message_ref_id FROM Articles WHERE message_newsgroup = $2 AND message_id_hash LIKE $1 ORDER BY time_obtained DESC",
SearchQuery_1: "SELECT newsgroup, message_id, ref_id FROM ArticlePosts WHERE message LIKE $1 ORDER BY time_posted DESC LIMIT $2",
SearchQuery_2: "SELECT newsgroup, message_id, ref_id FROM ArticlePosts WHERE newsgroup = $1 AND message LIKE $2 ORDER BY time_posted DESC LIMIT $3",
SearchByHash_1: "SELECT message_newsgroup, message_id, message_ref_id FROM Articles WHERE message_id_hash LIKE $1 ORDER BY time_obtained DESC LIMIT $2",
SearchByHash_2: "SELECT message_newsgroup, message_id, message_ref_id FROM Articles WHERE message_newsgroup = $2 AND message_id_hash LIKE $1 ORDER BY time_obtained DESC LIMIT $3",
GetNNTPPostsInGroup: "SELECT message_no, ArticlePosts.message_id, subject, time_posted, ref_id, name, path FROM ArticleNumbers INNER JOIN ArticlePosts ON ArticleNumbers.message_id = ArticlePosts.message_id WHERE ArticlePosts.newsgroup = $1 ORDER BY message_no",
GetCitesByPostHashLike: "SELECT message_id, message_ref_id FROM Articles WHERE message_id_hash LIKE $1",
GetYearlyPostHistory: "WITH times(endtime, begintime) AS ( SELECT CAST(EXTRACT(epoch from i) AS BIGINT) AS endtime, CAST(EXTRACT(epoch from i - interval '1 month') AS BIGINT) AS begintime FROM generate_series(now() - interval '10 year', now(), '1 month'::interval) i ) SELECT begintime, endtime, ( SELECT count(*) FROM ArticlePosts WHERE time_posted > begintime AND time_posted < endtime) FROM times",
@@ -1970,14 +1970,14 @@ func (self *PostgresDatabase) GetPostingStats(gran, begin, end int64) (st Postin
return
}
func (self *PostgresDatabase) SearchQuery(prefix, group string, text string, chnl chan PostModel) (err error) {
func (self *PostgresDatabase) SearchQuery(prefix, group string, text string, chnl chan PostModel, limit int) (err error) {
if text != "" && strings.Count(text, "%") == 0 {
text = "%" + text + "%"
var rows *sql.Rows
if group == "" {
rows, err = self.conn.Query(self.stmt[SearchQuery_1], text)
rows, err = self.conn.Query(self.stmt[SearchQuery_1], text, limit)
} else {
rows, err = self.conn.Query(self.stmt[SearchQuery_2], group, text)
rows, err = self.conn.Query(self.stmt[SearchQuery_2], group, text, limit)
}
if err == nil {
for rows.Next() {
@@ -1991,15 +1991,15 @@ func (self *PostgresDatabase) SearchQuery(prefix, group string, text string, chn
close(chnl)
return
}
func (self *PostgresDatabase) SearchByHash(prefix, group, text string, chnl chan PostModel) (err error) {
func (self *PostgresDatabase) SearchByHash(prefix, group, text string, chnl chan PostModel, limit int) (err error) {
if text != "" && strings.Count(text, "%") == 0 {
text = "%" + text + "%"
var rows *sql.Rows
if group == "" {
rows, err = self.conn.Query(self.stmt[SearchByHash_1], text)
rows, err = self.conn.Query(self.stmt[SearchByHash_1], text, limit)
} else {
rows, err = self.conn.Query(self.stmt[SearchByHash_2], text, group)
rows, err = self.conn.Query(self.stmt[SearchByHash_2], text, group, limit)
}
if err == nil {
for rows.Next() {

View File

@@ -26,8 +26,17 @@ import (
var ErrOversizedMessage = errors.New("oversized message")
// ~ 10 MB unbased64'd
const DefaultMaxMessageSize = 1024 * 1024 * 10
// (cathugger)
// my test showed that 8MiB of attachments split in 5 parts
// plus some text produce something close to typhical big message
// resulted in 11483923 bytes.
// that's consistent with rough size calculation mentioned in
// <https://en.wikipedia.org/wiki/Base64#MIME>
// ((origlen * 1.37) + 814)
// which resulted in 11493206 bytes for 8MiB of data.
// previous default of 10MiB (10485760) was too low in practice.
// use 11MiB (11534336) to leave some space for longer than usual texts.
const DefaultMaxMessageSize = 11 * 1024 * 1024
// HARD max message size
const MaxMessageSize = 1024 * 1024 * 1024
@@ -75,7 +84,7 @@ type ArticleStore interface {
// register signed message
RegisterSigned(msgid, pk string) error
GetMessage(msgid string) NNTPMessage
GetMessage(msgid string, visit func(NNTPMessage))
// get size of message on disk
GetMessageSize(msgid string) (int64, error)
@@ -584,7 +593,7 @@ func (self *articleStore) ProcessMessage(wr io.Writer, msg io.Reader, spamfilter
return
}
func (self *articleStore) GetMessage(msgid string) (nntp NNTPMessage) {
func (self *articleStore) GetMessage(msgid string, visit func(NNTPMessage)) {
r, err := self.OpenMessage(msgid)
if err == nil {
defer r.Close()
@@ -597,7 +606,7 @@ func (self *articleStore) GetMessage(msgid string) (nntp NNTPMessage) {
// inject pubkey for mod
n.Headers().Set("X-PubKey-Ed25519", hdr.Get("X-PubKey-Ed25519"))
}
nntp = n
visit(n)
})
}
}

View File

@@ -42,6 +42,7 @@ func HandleStartTLS(conn net.Conn, config *tls.Config) (econn *textproto.Conn, s
econn = textproto.NewConn(tconn)
return
} else {
log.Println("tls handshake error: ", err.Error())
certs := state.PeerCertificates
if len(certs) == 0 {
log.Println("starttls failed, no peer certs provided")
@@ -53,6 +54,7 @@ func HandleStartTLS(conn net.Conn, config *tls.Config) (econn *textproto.Conn, s
}
}
tconn.Close()
conn.Close()
}
}
}

View File

@@ -477,28 +477,47 @@ func newNaclSignKeypair() (string, string) {
return hex.EncodeToString(pk), hex.EncodeToString(sk)
}
func makeTripcodeLen(pubkey string, length int) string {
var b strings.Builder
data, err := hex.DecodeString(pubkey)
if err != nil {
return "[invalid]"
}
if length <= 0 || length > len(data) {
length = len(data)
}
// originally srnd (and srndv2) used 9600==0x2580
// however, range shifted by 0x10 looks better to me (cathugger)
// (instead of `▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏` it'll use `⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏`)
// and display equaly good both in torbrowser+DejaVuSans and phone
// since jeff ack'd it (he doesn't care probably), I'll just use it
const rstart = 0x2590
// 0x2500 can display with TBB font whitelist, but looks too cryptic.
// startin from 0x2600 needs more than DejaVuSans so I'll avoid it
// logic (same as in srnd):
// it first writes length/2 chars of begining
// and then length/2 chars of ending
// if length==len(data), that essentially means just using whole
i := 0
for ; i < length/2; i++ {
b.WriteRune(rstart + rune(data[i]))
b.WriteRune(0xFE0E) // text style variant
}
for ; i < length; i++ {
b.WriteRune(rstart + rune(data[len(data)-length+i]))
b.WriteRune(0xFE0E) // text style variant
}
return b.String()
}
// make a utf-8 tripcode
func makeTripcode(pk string) string {
data, err := hex.DecodeString(pk)
if err == nil {
tripcode := ""
// here is the python code this is based off of
// i do something slightly different but this is the base
//
// for x in range(0, length / 2):
// pub_short += '&#%i;' % (9600 + int(full_pubkey_hex[x*2:x*2+2], 16))
// length -= length / 2
// for x in range(0, length):
// pub_short += '&#%i;' % (9600 + int(full_pubkey_hex[-(length*2):][x*2:x*2+2], 16))
//
for _, c := range data {
ch := 9600
ch += int(c)
tripcode += fmt.Sprintf("&#%04d;", ch)
}
return tripcode
}
return "[invalid]"
return makeTripcodeLen(pk, 0)
}
// generate a new message id with base name

View File

@@ -432,17 +432,3 @@ func fmtB(dst []byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte {
return dst
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}

View File

@@ -7,7 +7,7 @@ package srnd
import "fmt"
const major_version = 3
const minor_version = 0
const minor_version = 1
const patch_verson = 0
const program_name = "srnd"

View File

@@ -497,7 +497,7 @@ Connection.prototype.onclose = function(callback) {
/* @brief Initializes the websocket connection.
*
* @param channel The channel to open a connection to.
* @return A connection the the websocket.
* @return A connection the websocket.
*/
function initWebSocket(chat, url, connection) {
var ws = null;

587
contrib/static/404chan.css Normal file
View File

@@ -0,0 +1,587 @@
@media (max-width: 65em){
.usage_td {visibility: hidden;position: absolute;}
.board_td {visibility: hidden;position: absolute;left: 0px;}
.post_td {padding: 0px !important;}
}
body {
background-image: none;
background-color: #1D1F21;
color: #C5C8C6;
font-family: "Trebuchet MS",Trebuchet,tahoma,serif;
font-size: 1em;
margin-left: 0;
margin-right: 0;
margin-top: 5px;
}
a {
color: #81A2BE;
padding: 0px;
text-decoration: none;
}
a:hover {
color: #5F89AC;
text-decoration: none;
}
a.post-reply-link {
color: #5F89AC;
text-decoration: underline;
}
a.post-reply-link:hover {
color: #81A2BE;
text-decoration: underline;
}
hr {
border: none;
border-top: 1px solid #282a2e;
height: 0;
margin-left: 1em;
margin-right: 1.5em;
}
.sitetitle {
text-align: center;
color: #ABABAB;
margin: 10px 20px 20px 20px;
}
.sitetitle h2 {
margin: 0px;
}
.sitetitle a {
color: #ABABAB;
text-decoration: none;
}
.filedescription {
font-style: italic;
}
.messageroot, .highlightroot {
margin-bottom: 1px;
border: none;
padding: 9px 9px 1em;
}
.message, .highlight {
margin-left: 25px;
margin-bottom: 6px;
border: 1px solid #363636;
background: #1c1c1c;
border-radius: 5px;
padding: 10px 10px 1.5em;
}
.highlight, .highlightroot {
border: 1px double red;
}
.highlightroot {
border-bottom: 0px;
border-right: 0px;
}
.image_link, a.image_link {
float: left;
margin-right: 10px;
outline: none;
position: relative;
}
.image_root {
border-radius: 5px;
border: 1px solid #363636;
}
.image {
border-radius: 5px;
}
.thread {
padding-top: 15px;
padding-left: 10px;
padding-right: 20px;
}
.message_span {
white-space: pre-wrap;
word-wrap: break-word;
}
.topicline b{
background: inherit;
font-size: 1.1em;
color: #b294bb;
font-weight: inherit;
}
.postform {
padding: 0.5em;
}
.postform th {
background: #1c1c1c;
border: 1px solid #363636;
text-align: left;
padding-left: 4px;
padding-right: 5px;
}
.posttext {
width: 500px;
height: 1.5em;
padding: 0px;
border: 1px solid #363636;
background: #ffffff;
margin: 0px;
}
.postbutton {
width: 100px;
border: 1px solid #363636;
background: #ffffff;
}
#newthread {
background: #F7ACB1;
}
.postarea {
width: 500px;
height: 11em;
border: 1px solid #363636;
background: #ffffff;
margin: 0px;
padding: 0px;
}
.postfile {
}
.boards {
padding: 0.5em 2.5em 0px 1em;
display: inline-block;
}
.pagelist {
margin-left: 25px;
}
.boards a, .pagelist a {
text-decoration: none;
}
.evilstuff {
background-color: #333333;
border: 1px solid #666666;
border-radius: 30px;
padding: 10px;
margin-right: 10px;
position: fixed;
right: 0px;
top: 2.5em;
display: none;
}
.stillevil {
display: none;
}
.evilmod {
position: fixed;
right: 20px;
top: 0.5em;
}
.evilmod:checked ~ form .evilstuff {
display: block;
}
.evilmod:checked ~ form .stillevil {
display: inline;
}
.stillevil input {
margin: 0px;
}
.warning {
color: #FF0000;
display: none;
}
.purge_root:checked ~ .warning {
display: inline;
}
.sig_label {
color: #00FF00;
cursor: pointer;
font-weight: bold;
}
.sig_chk {
position: absolute;
opacity: 0;
z-index: -1;
}
.sig_key {
padding-left: 5px;
display: none;
}
.sig_chk:checked ~ .sig_key {
display: inline;
}
.lblhelp {
position: fixed;
top: 0.5em;
right: 10px;
cursor: pointer;
font-weight: bold;
}
a.lblhelp, a.lblhelp:hover {
color: #C5C8C6;
padding: 0px;
text-decoration: none;
}
.quote {
color: #789922;
}
.code {
background-color: #303030;
color: #FFFFFF;
border: 1px solid #404040;
clear: right;
font-family: monospace;
font-size: 9pt;
overflow: auto;
width: 80%;
display: block;
margin: 0;
}
.datatable {
border: 1px solid #3B3B3B;
border-collapse: collapse;
}
.datatable th {
background: #1C1C1C;
}
.datatable td, .datatable th {
border: 1px dotted #3B3B3B;
padding: 1px 4px;
vertical-align: top;
}
.mod {
font-family: monospace;
font-size: 9pt;
margin: 20px 10px 10px;
}
.mod tr:hover {
background-color: #282828 !important;
}
.mod table {
border-collapse: collapse;
font-size: 9pt; /* damn you chromium */
}
.dontwrap {
white-space: nowrap;
}
.right {
text-align: right;
}
.spoiler, .spoiler a:link, .spoiler a:visited {
color: #5F686E;
background: #5F686E;
}
.spoiler:hover {
color: #FFFFFF;
}
.spoiler:hover a:link, .spoiler:hover a:visited {
color: #81A2BE;
}
.spoiler:hover a:hover {
color: #5F89AC;
text-decoration: none;
}
.details {
color: #354C60;
margin-left: 0.5em;
display: block;
}
.menu-footer {
font-size: 0.7em;
text-align: center;
margin: 0.3em;
bottom: 5em;
position: fixed;
padding-left: 1em;
}
.frontend {
font-size: 0.8em;
font-family: sans-serif;
}
.published {
font-size: 0.85em;
color: #898E93;
}
.menu-left {
font-size: 0.9em;
white-space: nowrap;
overflow: hidden;
}
.menu-left ul {
list-style: none;
padding-left: 1em;
}
.zoi {
color: purple;
}
.op-kyn {
color: skyblue;
}
.board_description {
width: 500px;
padding: 10px;
font-size: 0.75em;
font-family: sans-serif;
white-space: pre-wrap;
word-wrap: break-word;
}
.play_button {
background-image: url("img/playbutton.png");
height: 53px;
width: 70px;
position: absolute;
top: calc(50% - 26px);
left: calc(50% - 35px);
}
.play_button:hover {
opacity: 0.7;
}
.news {
border: 1px solid #3b3b3b;
background: #1c1c1c;
margin: 10px 20px 10px 20px;
padding: 0.3em;
}
.news .header {
font-style: italic;
padding: 3px 5px 0px 5px;
text-align: right;
border: 1px dotted #3b3b3b;
}
.news .author {
font-style: italic;
font-weight: bold;
}
.news .header .topicline .subject {
font-style: normal;
float: left;
}
.news .message_span {
padding: 10px 5px 0px 5px;
}
.news .footer {
text-align: right;
font-style: italic;
padding: 0px 5px 5px;
}
.activity {
padding: 10px 20px;
}
.activity td, .activity th {
vertical-align: top;
white-space: nowrap;
}
.post_td {
width: 100%;
padding: 0px 10px;
}
.post_td td {
text-align: right;
}
.post_td .subject {
text-align: left;
white-space: normal;
padding-left: 10px;
}
.aa {
font-family: "IPAMonaPGothic","Monapo","Mona","MS PGothic";
overflow: auto;
display: block;
margin: 0;
}
[data-subject="None"] { display: none; }
[data-sage="1"] { filter: saturate(0); }
.overboard, .threadpage, .boardpage {
background-image: url('/static/changolia-logo.png');
background-repeat: no-repeat;
background-position: right top;
background-attachment: fixed;
background-size: 128px;
}
.message {
float: left;
clear: left;
}
.hider {
float: right;
}
.messageroot > .hider {
float: left;
}
#faq {
margin-left: 3em;
width: 75%;
}
.topicline {
padding-right: 30px;
}
[data-origin="tor"] {
background-image: url('/static/tor.png');
background-repeat: no-repeat;
background-position: top right;
}
[data-origin="i2p"] {
background-image: url('/static/i2p.png');
background-repeat: no-repeat;
background-position: top right;
}
[data-origin="clearnet"] {
background-image: url('/static/clearnet.png');
background-repeat: no-repeat;
background-position: top right;
}
[data-name~="nigger"] {
background-image: url('/static/blackface.png');
background-size: 25%;
background-repeat: repeat;
}
/** change me as needed, admin's pubkey */
[data-pubkey~="039a876792db66966241e63140e7df79df488033360064b67d890635814e925e"] {
background-image: url('/static/admin.png');
background-size: 25%;
background-repeat: repeat;
}
/** another mod */
[data-pubkey~="f59602a8497d21c0bda92c01cf33d1d0b2e41d5065eebcafdcbf99f973d1c105"]{
background-image: url('/static/mgs_mod.png');
background-size: 20%;
background-repeat: no-repeat;
background-position: right bottom;
}
.fagarrows {
color: #E0727F;
}
.message_span {
white-space: pre-line;
word-break: break-word;
}
#captcha_img {
background-color: white;
}
@keyframes ebin {
0% {transform: rotate(-10deg);}
50% {transform: rotate(10deg);}
100% {transform: rotate(-10deg);}
}
.wobble {
animation: ebin 0.25s infinite;
animation-timing-function: linear;
text-align: center;
}
@keyframes expl {
0% { transform: scale(1,1); }
50% { transform: scale(1.5,1.5); }
100% { transform: scale(1,1); }
}
.explode {
animation: expl 0.5s infinite;
text-align: center;
}
@keyframes flash {
0% { opacity: 1;}
49% { opacity: 1; }
50% { opacity: 0; }
100% { opacity: 0; }
}
.flashy {
animation: flash 1s infinite;
animation-timing-function: linear;
}
.tripcode {
color: #de04ef;
}
@keyframes psych
{
0% {background-color: red; color: blue; }
10% {background-color: yellow; color: red; }
20% {background-color: blue; color: green; }
30% {background-color: green; color: yellow; }
40% {background-color: red; color: blue; }
50% {background-color: yellow; color: green; }
60% {background-color: blue; color: yellow; }
70% {background-color: green; color: blue; }
80% {background-color: red; color: green; }
90% {background-color: yellow; color: red; }
95% {background-color: blue; color: yellow; }
100% {background-color: green; color: white; }
}
.psy {
animation: psych 2s linear infinite;
display: inline-block;
}
.memearrows {
color: #789922;
margin-left: none;
}
.redtext {
color: #AF0A0F;
font-size: 12pt;
font-weight: bold;
margin-left: none;
}
.bumplock {
background-image: url('/static/sage.png');
filter: saturate(0.15);
}
.post {
max-width: 90%;
}
.messageroot {
border: solid #333 1px;
padding-left: 1em;
}
:target {
background-color: #493769;
}
.mod {
color: red;
}
.post-link {
font-size: 24pt;
float: right;
}
.spam-button {
display: none;
}
@keyframes rotate {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
#logo:hover {
animation-name: rotate;
animation-duration: 2s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
#paginator {
margin-left: 4em;
}

View File

@@ -87,10 +87,11 @@
padding-right: 5px;
}
.posttext {
width: 400px;
width: 350px;
height: 20px;
border: 1px solid #363636;
background: #ffffff;
background-color:#111;
color:#ddd;
}
.postbutton {
width: 100px;
@@ -102,9 +103,10 @@
}
.postarea {
width: 400px;
height: 48px;
height: 100px;
border: 1px solid #363636;
background: #ffffff;
background-color:#111;
color:#ddd;
padding: 0px;
margin: 0px;
}
@@ -545,9 +547,15 @@ background-repeat: repeat;
background-color: #493769;
}
body {
display: inline-flex;
flex-direction: column;
flex-wrap: wrap;
flex-flow: wrap;
.mod {
color: red;
}
.post-link {
font-size: 24pt;
float: right;
}
.spam-button {
display: none;
}

View File

@@ -2,7 +2,7 @@ function createBoard() {
var form = document.getElementById("postform");
var e = document.getElementById("boardname");
var board = e.value;
if ( ! board.startsWith("overchan.") ) {
if ( board.indexOf(".") == -1 ) {
board = "overchan." + board;
}
form.action = form.action + board;

900
contrib/static/nntpchan.js Normal file
View File

@@ -0,0 +1,900 @@
var _____WB$wombat$assign$function_____ = function(name) {return (self._wb_wombat && self._wb_wombat.local_init && self._wb_wombat.local_init(name)) || self[name]; };
if (!self.__WB_pmw) { self.__WB_pmw = function(obj) { this.__WB_source = obj; return this; } }
{
let window = _____WB$wombat$assign$function_____("window");
let self = _____WB$wombat$assign$function_____("self");
let document = _____WB$wombat$assign$function_____("document");
let location = _____WB$wombat$assign$function_____("location");
let top = _____WB$wombat$assign$function_____("top");
let parent = _____WB$wombat$assign$function_____("parent");
let frames = _____WB$wombat$assign$function_____("frames");
let opener = _____WB$wombat$assign$function_____("opener");
/*
* For source code and license information please check https://github.com/majestrate/nntpchan
*/
/* begin ./contrib/js/contrib/jquery.js */
/*!* jQuery JavaScript Library v2.2.3
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2016-04-05T19:26Z*/(function(global,factory){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=global.document?factory(global,true):function(w){if(!w.document){throw new Error("jQuery requires a window with a document");}
return factory(w);};}else{factory(global);}}(typeof window!=="undefined"?window:this,function(window,noGlobal){var arr=[];var document=window.document;var slice=arr.slice;var concat=arr.concat;var push=arr.push;var indexOf=arr.indexOf;var class2type={};var toString=class2type.toString;var hasOwn=class2type.hasOwnProperty;var support={};var
version="2.2.3",jQuery=function(selector,context){return new jQuery.fn.init(selector,context);},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return letter.toUpperCase();};jQuery.fn=jQuery.prototype={jquery:version,constructor:jQuery,selector:"",length:0,toArray:function(){return slice.call(this);},get:function(num){return num!=null?(num<0?this[num+this.length]:this[num]):slice.call(this);},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);ret.prevObject=this;ret.context=this.context;return ret;},each:function(callback){return jQuery.each(this,callback);},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},slice:function(){return this.pushStack(slice.apply(this,arguments));},first:function(){return this.eq(0);},last:function(){return this.eq(-1);},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j<len?[this[j]]:[]);},end:function(){return this.prevObject||this.constructor();},push:push,sort:arr.sort,splice:arr.splice};jQuery.extend=jQuery.fn.extend=function(){var options,name,src,copy,copyIsArray,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[i]||{};i++;}
if(typeof target!=="object"&&!jQuery.isFunction(target)){target={};}
if(i===length){target=this;i--;}
for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue;}
if(deep&&copy&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery.isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&jQuery.isArray(src)?src:[];}else{clone=src&&jQuery.isPlainObject(src)?src:{};}
target[name]=jQuery.extend(deep,clone,copy);}else if(copy!==undefined){target[name]=copy;}}}}
return target;};jQuery.extend({expando:"jQuery"+(version+Math.random()).replace(/\D/g,""),isReady:true,error:function(msg){throw new Error(msg);},noop:function(){},isFunction:function(obj){return jQuery.type(obj)==="function";},isArray:Array.isArray,isWindow:function(obj){return obj!=null&&obj===obj.window;},isNumeric:function(obj){var realStringObj=obj&&obj.toString();return!jQuery.isArray(obj)&&(realStringObj-parseFloat(realStringObj)+1)>=0;},isPlainObject:function(obj){var key;if(jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false;}
if(obj.constructor&&!hasOwn.call(obj,"constructor")&&!hasOwn.call(obj.constructor.prototype||{},"isPrototypeOf")){return false;}
for(key in obj){}
return key===undefined||hasOwn.call(obj,key);},isEmptyObject:function(obj){var name;for(name in obj){return false;}
return true;},type:function(obj){if(obj==null){return obj+"";}
return typeof obj==="object"||typeof obj==="function"?class2type[toString.call(obj)]||"object":typeof obj;},globalEval:function(code){var script,indirect=eval;code=jQuery.trim(code);if(code){if(code.indexOf("use strict")===1){script=document.createElement("script");script.text=code;document.head.appendChild(script).parentNode.removeChild(script);}else{indirect(code);}}},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase);},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase();},each:function(obj,callback){var length,i=0;if(isArrayLike(obj)){length=obj.length;for(;i<length;i++){if(callback.call(obj[i],i,obj[i])===false){break;}}}else{for(i in obj){if(callback.call(obj[i],i,obj[i])===false){break;}}}
return obj;},trim:function(text){return text==null?"":(text+"").replace(rtrim,"");},makeArray:function(arr,results){var ret=results||[];if(arr!=null){if(isArrayLike(Object(arr))){jQuery.merge(ret,typeof arr==="string"?[arr]:arr);}else{push.call(ret,arr);}}
return ret;},inArray:function(elem,arr,i){return arr==null?-1:indexOf.call(arr,elem,i);},merge:function(first,second){var len=+second.length,j=0,i=first.length;for(;j<len;j++){first[i++]=second[j];}
first.length=i;return first;},grep:function(elems,callback,invert){var callbackInverse,matches=[],i=0,length=elems.length,callbackExpect=!invert;for(;i<length;i++){callbackInverse=!callback(elems[i],i);if(callbackInverse!==callbackExpect){matches.push(elems[i]);}}
return matches;},map:function(elems,callback,arg){var length,value,i=0,ret=[];if(isArrayLike(elems)){length=elems.length;for(;i<length;i++){value=callback(elems[i],i,arg);if(value!=null){ret.push(value);}}}else{for(i in elems){value=callback(elems[i],i,arg);if(value!=null){ret.push(value);}}}
return concat.apply([],ret);},guid:1,proxy:function(fn,context){var tmp,args,proxy;if(typeof context==="string"){tmp=fn[context];context=fn;fn=tmp;}
if(!jQuery.isFunction(fn)){return undefined;}
args=slice.call(arguments,2);proxy=function(){return fn.apply(context||this,args.concat(slice.call(arguments)));};proxy.guid=fn.guid=fn.guid||jQuery.guid++;return proxy;},now:Date.now,support:support});if(typeof Symbol==="function"){jQuery.fn[Symbol.iterator]=arr[Symbol.iterator];}
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase();});function isArrayLike(obj){var length=!!obj&&"length"in obj&&obj.length,type=jQuery.type(obj);if(type==="function"||jQuery.isWindow(obj)){return false;}
return type==="array"||length===0||typeof length==="number"&&length>0&&(length-1)in obj;}
var Sizzle=/*!* Sizzle CSS Selector Engine v2.2.1
* http://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: 2015-10-17*/(function(window){var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date(),preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){if(a===b){hasDuplicate=true;}
return 0;},MAX_NEGATIVE=1<<31,hasOwn=({}).hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){var i=0,len=list.length;for(;i<len;i++){if(list[i]===elem){return i;}}
return-1;},booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",whitespace="[\\x20\\t\\r\\n\\f]",identifier="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",attributes="\\["+whitespace+"*("+identifier+")(?:"+whitespace+"*([*^$|!~]?=)"+whitespace+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+identifier+"))|)"+whitespace+"*\\]",pseudos=":("+identifier+")(?:\\(("+"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|"+"((?:\\\\.|[^\\\\()[\\]]|"+attributes+")*)|"+".*"+")\\)|)",rwhitespace=new RegExp(whitespace+"+","g"),rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([>+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={"ID":new RegExp("^#("+identifier+")"),"CLASS":new RegExp("^\\.("+identifier+")"),"TAG":new RegExp("^("+identifier+"|[*])"),"ATTR":new RegExp("^"+attributes),"PSEUDO":new RegExp("^"+pseudos),"CHILD":new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),"bool":new RegExp("^(?:"+booleans+")$","i"),"needsContext":new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+
whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,rescape=/'|\\/g,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-0x10000;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+0x10000):String.fromCharCode(high>>10|0xD800,high&0x3FF|0xDC00);},unloadHandler=function(){setDocument();};try{push.apply((arr=slice.call(preferredDoc.childNodes)),preferredDoc.childNodes);arr[preferredDoc.childNodes.length].nodeType;}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els));}:function(target,els){var j=target.length,i=0;while((target[j++]=els[i++])){}
target.length=j-1;}};}
function Sizzle(selector,context,results,seed){var m,i,elem,nid,nidselect,match,groups,newSelector,newContext=context&&context.ownerDocument,nodeType=context?context.nodeType:9;results=results||[];if(typeof selector!=="string"||!selector||nodeType!==1&&nodeType!==9&&nodeType!==11){return results;}
if(!seed){if((context?context.ownerDocument||context:preferredDoc)!==document){setDocument(context);}
context=context||document;if(documentIsHTML){if(nodeType!==11&&(match=rquickExpr.exec(selector))){if((m=match[1])){if(nodeType===9){if((elem=context.getElementById(m))){if(elem.id===m){results.push(elem);return results;}}else{return results;}}else{if(newContext&&(elem=newContext.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results;}}}else if(match[2]){push.apply(results,context.getElementsByTagName(selector));return results;}else if((m=match[3])&&support.getElementsByClassName&&context.getElementsByClassName){push.apply(results,context.getElementsByClassName(m));return results;}}
if(support.qsa&&!compilerCache[selector+" "]&&(!rbuggyQSA||!rbuggyQSA.test(selector))){if(nodeType!==1){newContext=context;newSelector=selector;}else if(context.nodeName.toLowerCase()!=="object"){if((nid=context.getAttribute("id"))){nid=nid.replace(rescape,"\\$&");}else{context.setAttribute("id",(nid=expando));}
groups=tokenize(selector);i=groups.length;nidselect=ridentifier.test(nid)?"#"+nid:"[id='"+nid+"']";while(i--){groups[i]=nidselect+" "+toSelector(groups[i]);}
newSelector=groups.join(",");newContext=rsibling.test(selector)&&testContext(context.parentNode)||context;}
if(newSelector){try{push.apply(results,newContext.querySelectorAll(newSelector));return results;}catch(qsaError){}finally{if(nid===expando){context.removeAttribute("id");}}}}}}
return select(selector.replace(rtrim,"$1"),context,results,seed);}
function createCache(){var keys=[];function cache(key,value){if(keys.push(key+" ")>Expr.cacheLength){delete cache[keys.shift()];}
return(cache[key+" "]=value);}
return cache;}
function markFunction(fn){fn[expando]=true;return fn;}
function assert(fn){var div=document.createElement("div");try{return!!fn(div);}catch(e){return false;}finally{if(div.parentNode){div.parentNode.removeChild(div);}
div=null;}}
function addHandle(attrs,handler){var arr=attrs.split("|"),i=arr.length;while(i--){Expr.attrHandle[arr[i]]=handler;}}
function siblingCheck(a,b){var cur=b&&a,diff=cur&&a.nodeType===1&&b.nodeType===1&&(~b.sourceIndex||MAX_NEGATIVE)-
(~a.sourceIndex||MAX_NEGATIVE);if(diff){return diff;}
if(cur){while((cur=cur.nextSibling)){if(cur===b){return-1;}}}
return a?1:-1;}
function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type;};}
function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type;};}
function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[(j=matchIndexes[i])]){seed[j]=!(matches[j]=seed[j]);}}});});}
function testContext(context){return context&&typeof context.getElementsByTagName!=="undefined"&&context;}
support=Sizzle.support={};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false;};setDocument=Sizzle.setDocument=function(node){var hasCompare,parent,doc=node?node.ownerDocument||node:preferredDoc;if(doc===document||doc.nodeType!==9||!doc.documentElement){return document;}
document=doc;docElem=document.documentElement;documentIsHTML=!isXML(document);if((parent=document.defaultView)&&parent.top!==parent){if(parent.addEventListener){parent.addEventListener("unload",unloadHandler,false);}else if(parent.attachEvent){parent.attachEvent("onunload",unloadHandler);}}
support.attributes=assert(function(div){div.className="i";return!div.getAttribute("className");});support.getElementsByTagName=assert(function(div){div.appendChild(document.createComment(""));return!div.getElementsByTagName("*").length;});support.getElementsByClassName=rnative.test(document.getElementsByClassName);support.getById=assert(function(div){docElem.appendChild(div).id=expando;return!document.getElementsByName||!document.getElementsByName(expando).length;});if(support.getById){Expr.find["ID"]=function(id,context){if(typeof context.getElementById!=="undefined"&&documentIsHTML){var m=context.getElementById(id);return m?[m]:[];}};Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId;};};}else{delete Expr.find["ID"];Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id");return node&&node.value===attrId;};};}
Expr.find["TAG"]=support.getElementsByTagName?function(tag,context){if(typeof context.getElementsByTagName!=="undefined"){return context.getElementsByTagName(tag);}else if(support.qsa){return context.querySelectorAll(tag);}}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if(tag==="*"){while((elem=results[i++])){if(elem.nodeType===1){tmp.push(elem);}}
return tmp;}
return results;};Expr.find["CLASS"]=support.getElementsByClassName&&function(className,context){if(typeof context.getElementsByClassName!=="undefined"&&documentIsHTML){return context.getElementsByClassName(className);}};rbuggyMatches=[];rbuggyQSA=[];if((support.qsa=rnative.test(document.querySelectorAll))){assert(function(div){docElem.appendChild(div).innerHTML="<a id='"+expando+"'></a>"+"<select id='"+expando+"-\r\\' msallowcapture=''>"+"<option selected=''></option></select>";if(div.querySelectorAll("[msallowcapture^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")");}
if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")");}
if(!div.querySelectorAll("[id~="+expando+"-]").length){rbuggyQSA.push("~=");}
if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked");}
if(!div.querySelectorAll("a#"+expando+"+*").length){rbuggyQSA.push(".#.+[+~]");}});assert(function(div){var input=document.createElement("input");input.setAttribute("type","hidden");div.appendChild(input).setAttribute("name","D");if(div.querySelectorAll("[name=d]").length){rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?=");}
if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled");}
div.querySelectorAll("*,:x");rbuggyQSA.push(",.*:");});}
if((support.matchesSelector=rnative.test((matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector)))){assert(function(div){support.disconnectedMatch=matches.call(div,"div");matches.call(div,"[s!='']:x");rbuggyMatches.push("!=",pseudos);});}
rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|"));rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|"));hasCompare=rnative.test(docElem.compareDocumentPosition);contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=a.nodeType===9?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!!(bup&&bup.nodeType===1&&(adown.contains?adown.contains(bup):a.compareDocumentPosition&&a.compareDocumentPosition(bup)&16));}:function(a,b){if(b){while((b=b.parentNode)){if(b===a){return true;}}}
return false;};sortOrder=hasCompare?function(a,b){if(a===b){hasDuplicate=true;return 0;}
var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;if(compare){return compare;}
compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1;if(compare&1||(!support.sortDetached&&b.compareDocumentPosition(a)===compare)){if(a===document||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)){return-1;}
if(b===document||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)){return 1;}
return sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0;}
return compare&4?-1:1;}:function(a,b){if(a===b){hasDuplicate=true;return 0;}
var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup){return a===document?-1:b===document?1:aup?-1:bup?1:sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0;}else if(aup===bup){return siblingCheck(a,b);}
cur=a;while((cur=cur.parentNode)){ap.unshift(cur);}
cur=b;while((cur=cur.parentNode)){bp.unshift(cur);}
while(ap[i]===bp[i]){i++;}
return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0;};return document;};Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements);};Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document){setDocument(elem);}
expr=expr.replace(rattributeQuotes,"='$1']");if(support.matchesSelector&&documentIsHTML&&!compilerCache[expr+" "]&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr))){try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret;}}catch(e){}}
return Sizzle(expr,document,null,[elem]).length>0;};Sizzle.contains=function(context,elem){if((context.ownerDocument||context)!==document){setDocument(context);}
return contains(context,elem);};Sizzle.attr=function(elem,name){if((elem.ownerDocument||elem)!==document){setDocument(elem);}
var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):undefined;return val!==undefined?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null;};Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg);};Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;hasDuplicate=!support.detectDuplicates;sortInput=!support.sortStable&&results.slice(0);results.sort(sortOrder);if(hasDuplicate){while((elem=results[i++])){if(elem===results[i]){j=duplicates.push(i);}}
while(j--){results.splice(duplicates[j],1);}}
sortInput=null;return results;};getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(!nodeType){while((node=elem[i++])){ret+=getText(node);}}else if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent;}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem);}}}else if(nodeType===3||nodeType===4){return elem.nodeValue;}
return ret;};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{"ATTR":function(match){match[1]=match[1].replace(runescape,funescape);match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape);if(match[2]==="~="){match[3]=" "+match[3]+" ";}
return match.slice(0,4);},"CHILD":function(match){match[1]=match[1].toLowerCase();if(match[1].slice(0,3)==="nth"){if(!match[3]){Sizzle.error(match[0]);}
match[4]=+(match[4]?match[5]+(match[6]||1):2*(match[3]==="even"||match[3]==="odd"));match[5]=+((match[7]+match[8])||match[3]==="odd");}else if(match[3]){Sizzle.error(match[0]);}
return match;},"PSEUDO":function(match){var excess,unquoted=!match[6]&&match[2];if(matchExpr["CHILD"].test(match[0])){return null;}
if(match[3]){match[2]=match[4]||match[5]||"";}else if(unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){match[0]=match[0].slice(0,excess);match[2]=unquoted.slice(0,excess);}
return match.slice(0,3);}},filter:{"TAG":function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return nodeNameSelector==="*"?function(){return true;}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName;};},"CLASS":function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(typeof elem.className==="string"&&elem.className||typeof elem.getAttribute!=="undefined"&&elem.getAttribute("class")||"");});},"ATTR":function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);if(result==null){return operator==="!=";}
if(!operator){return true;}
result+="";return operator==="="?result===check:operator==="!="?result!==check:operator==="^="?check&&result.indexOf(check)===0:operator==="*="?check&&result.indexOf(check)>-1:operator==="$="?check&&result.slice(-check.length)===check:operator==="~="?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:operator==="|="?result===check||result.slice(0,check.length+1)===check+"-":false;};},"CHILD":function(type,what,argument,first,last){var simple=type.slice(0,3)!=="nth",forward=type.slice(-4)!=="last",ofType=what==="of-type";return first===1&&last===0?function(elem){return!!elem.parentNode;}:function(elem,context,xml){var cache,uniqueCache,outerCache,node,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType,diff=false;if(parent){if(simple){while(dir){node=elem;while((node=node[dir])){if(ofType?node.nodeName.toLowerCase()===name:node.nodeType===1){return false;}}
start=dir=type==="only"&&!start&&"nextSibling";}
return true;}
start=[forward?parent.firstChild:parent.lastChild];if(forward&&useCache){node=parent;outerCache=node[expando]||(node[expando]={});uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={});cache=uniqueCache[type]||[];nodeIndex=cache[0]===dirruns&&cache[1];diff=nodeIndex&&cache[2];node=nodeIndex&&parent.childNodes[nodeIndex];while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if(node.nodeType===1&&++diff&&node===elem){uniqueCache[type]=[dirruns,nodeIndex,diff];break;}}}else{if(useCache){node=elem;outerCache=node[expando]||(node[expando]={});uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={});cache=uniqueCache[type]||[];nodeIndex=cache[0]===dirruns&&cache[1];diff=nodeIndex;}
if(diff===false){while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if((ofType?node.nodeName.toLowerCase()===name:node.nodeType===1)&&++diff){if(useCache){outerCache=node[expando]||(node[expando]={});uniqueCache=outerCache[node.uniqueID]||(outerCache[node.uniqueID]={});uniqueCache[type]=[dirruns,diff];}
if(node===elem){break;}}}}}
diff-=last;return diff===first||(diff%first===0&&diff/first>=0);}};},"PSEUDO":function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument);}
if(fn.length>1){args=[pseudo,pseudo,"",argument];return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){var idx,matched=fn(seed,argument),i=matched.length;while(i--){idx=indexOf(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i]);}}):function(elem){return fn(elem,0,args);};}
return fn;}},pseudos:{"not":markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;while(i--){if((elem=unmatched[i])){seed[i]=!(matches[i]=elem);}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);input[0]=null;return!results.pop();};}),"has":markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0;};}),"contains":markFunction(function(text){text=text.replace(runescape,funescape);return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1;};}),"lang":markFunction(function(lang){if(!ridentifier.test(lang||"")){Sizzle.error("unsupported lang: "+lang);}
lang=lang.replace(runescape,funescape).toLowerCase();return function(elem){var elemLang;do{if((elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))){elemLang=elemLang.toLowerCase();return elemLang===lang||elemLang.indexOf(lang+"-")===0;}}while((elem=elem.parentNode)&&elem.nodeType===1);return false;};}),"target":function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id;},"root":function(elem){return elem===docElem;},"focus":function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex);},"enabled":function(elem){return elem.disabled===false;},"disabled":function(elem){return elem.disabled===true;},"checked":function(elem){var nodeName=elem.nodeName.toLowerCase();return(nodeName==="input"&&!!elem.checked)||(nodeName==="option"&&!!elem.selected);},"selected":function(elem){if(elem.parentNode){elem.parentNode.selectedIndex;}
return elem.selected===true;},"empty":function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling){if(elem.nodeType<6){return false;}}
return true;},"parent":function(elem){return!Expr.pseudos["empty"](elem);},"header":function(elem){return rheader.test(elem.nodeName);},"input":function(elem){return rinputs.test(elem.nodeName);},"button":function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button";},"text":function(elem){var attr;return elem.nodeName.toLowerCase()==="input"&&elem.type==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()==="text");},"first":createPositionalPseudo(function(){return[0];}),"last":createPositionalPseudo(function(matchIndexes,length){return[length-1];}),"eq":createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument];}),"even":createPositionalPseudo(function(matchIndexes,length){var i=0;for(;i<length;i+=2){matchIndexes.push(i);}
return matchIndexes;}),"odd":createPositionalPseudo(function(matchIndexes,length){var i=1;for(;i<length;i+=2){matchIndexes.push(i);}
return matchIndexes;}),"lt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;--i>=0;){matchIndexes.push(i);}
return matchIndexes;}),"gt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;++i<length;){matchIndexes.push(i);}
return matchIndexes;})}};Expr.pseudos["nth"]=Expr.pseudos["eq"];for(i in{radio:true,checkbox:true,file:true,password:true,image:true}){Expr.pseudos[i]=createInputPseudo(i);}
for(i in{submit:true,reset:true}){Expr.pseudos[i]=createButtonPseudo(i);}
function setFilters(){}
setFilters.prototype=Expr.filters=Expr.pseudos;Expr.setFilters=new setFilters();tokenize=Sizzle.tokenize=function(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[selector+" "];if(cached){return parseOnly?0:cached.slice(0);}
soFar=selector;groups=[];preFilters=Expr.preFilter;while(soFar){if(!matched||(match=rcomma.exec(soFar))){if(match){soFar=soFar.slice(match[0].length)||soFar;}
groups.push((tokens=[]));}
matched=false;if((match=rcombinators.exec(soFar))){matched=match.shift();tokens.push({value:matched,type:match[0].replace(rtrim," ")});soFar=soFar.slice(matched.length);}
for(type in Expr.filter){if((match=matchExpr[type].exec(soFar))&&(!preFilters[type]||(match=preFilters[type](match)))){matched=match.shift();tokens.push({value:matched,type:type,matches:match});soFar=soFar.slice(matched.length);}}
if(!matched){break;}}
return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0);};function toSelector(tokens){var i=0,len=tokens.length,selector="";for(;i<len;i++){selector+=tokens[i].value;}
return selector;}
function addCombinator(matcher,combinator,base){var dir=combinator.dir,checkNonElements=base&&dir==="parentNode",doneName=done++;return combinator.first?function(elem,context,xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){return matcher(elem,context,xml);}}}:function(elem,context,xml){var oldCache,uniqueCache,outerCache,newCache=[dirruns,doneName];if(xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){if(matcher(elem,context,xml)){return true;}}}}else{while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){outerCache=elem[expando]||(elem[expando]={});uniqueCache=outerCache[elem.uniqueID]||(outerCache[elem.uniqueID]={});if((oldCache=uniqueCache[dir])&&oldCache[0]===dirruns&&oldCache[1]===doneName){return(newCache[2]=oldCache[2]);}else{uniqueCache[dir]=newCache;if((newCache[2]=matcher(elem,context,xml))){return true;}}}}}};}
function elementMatcher(matchers){return matchers.length>1?function(elem,context,xml){var i=matchers.length;while(i--){if(!matchers[i](elem,context,xml)){return false;}}
return true;}:matchers[0];}
function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i<len;i++){Sizzle(selector,contexts[i],results);}
return results;}
function condense(unmatched,map,filter,context,xml){var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=map!=null;for(;i<len;i++){if((elem=unmatched[i])){if(!filter||filter(elem,context,xml)){newUnmatched.push(elem);if(mapped){map.push(i);}}}}
return newUnmatched;}
function setMatcher(preFilter,selector,matcher,postFilter,postFinder,postSelector){if(postFilter&&!postFilter[expando]){postFilter=setMatcher(postFilter);}
if(postFinder&&!postFinder[expando]){postFinder=setMatcher(postFinder,postSelector);}
return markFunction(function(seed,results,context,xml){var temp,i,elem,preMap=[],postMap=[],preexisting=results.length,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=preFilter&&(seed||!selector)?condense(elems,preMap,preFilter,context,xml):elems,matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher){matcher(matcherIn,matcherOut,context,xml);}
if(postFilter){temp=condense(matcherOut,postMap);postFilter(temp,[],context,xml);i=temp.length;while(i--){if((elem=temp[i])){matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem);}}}
if(seed){if(postFinder||preFilter){if(postFinder){temp=[];i=matcherOut.length;while(i--){if((elem=matcherOut[i])){temp.push((matcherIn[i]=elem));}}
postFinder(null,(matcherOut=[]),temp,xml);}
i=matcherOut.length;while(i--){if((elem=matcherOut[i])&&(temp=postFinder?indexOf(seed,elem):preMap[i])>-1){seed[temp]=!(results[temp]=elem);}}}}else{matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut);if(postFinder){postFinder(null,results,matcherOut,xml);}else{push.apply(results,matcherOut);}}});}
function matcherFromTokens(tokens){var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext;},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1;},implicitRelative,true),matchers=[function(elem,context,xml){var ret=(!leadingRelative&&(xml||context!==outermostContext))||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));checkContext=null;return ret;}];for(;i<len;i++){if((matcher=Expr.relative[tokens[i].type])){matchers=[addCombinator(elementMatcher(matchers),matcher)];}else{matcher=Expr.filter[tokens[i].type].apply(null,tokens[i].matches);if(matcher[expando]){j=++i;for(;j<len;j++){if(Expr.relative[tokens[j].type]){break;}}
return setMatcher(i>1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:tokens[i-2].type===" "?"*":""})).replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens((tokens=tokens.slice(j))),j<len&&toSelector(tokens));}
matchers.push(matcher);}}
return elementMatcher(matchers);}
function matcherFromGroupMatchers(elementMatchers,setMatchers){var bySet=setMatchers.length>0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",outermost),dirrunsUnique=(dirruns+=contextBackup==null?1:Math.random()||0.1),len=elems.length;if(outermost){outermostContext=context===document||context||outermost;}
for(;i!==len&&(elem=elems[i])!=null;i++){if(byElement&&elem){j=0;if(!context&&elem.ownerDocument!==document){setDocument(elem);xml=!documentIsHTML;}
while((matcher=elementMatchers[j++])){if(matcher(elem,context||document,xml)){results.push(elem);break;}}
if(outermost){dirruns=dirrunsUnique;}}
if(bySet){if((elem=!matcher&&elem)){matchedCount--;}
if(seed){unmatched.push(elem);}}}
matchedCount+=i;if(bySet&&i!==matchedCount){j=0;while((matcher=setMatchers[j++])){matcher(unmatched,setMatched,context,xml);}
if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results);}}}
setMatched=condense(setMatched);}
push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&(matchedCount+setMatchers.length)>1){Sizzle.uniqueSort(results);}}
if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup;}
return unmatched;};return bySet?markFunction(superMatcher):superMatcher;}
compile=Sizzle.compile=function(selector,match){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[selector+" "];if(!cached){if(!match){match=tokenize(selector);}
i=match.length;while(i--){cached=matcherFromTokens(match[i]);if(cached[expando]){setMatchers.push(cached);}else{elementMatchers.push(cached);}}
cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers));cached.selector=selector;}
return cached;};select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled=typeof selector==="function"&&selector,match=!seed&&tokenize((selector=compiled.selector||selector));results=results||[];if(match.length===1){tokens=match[0]=match[0].slice(0);if(tokens.length>2&&(token=tokens[0]).type==="ID"&&support.getById&&context.nodeType===9&&documentIsHTML&&Expr.relative[tokens[1].type]){context=(Expr.find["ID"](token.matches[0].replace(runescape,funescape),context)||[])[0];if(!context){return results;}else if(compiled){context=context.parentNode;}
selector=selector.slice(tokens.shift().value.length);}
i=matchExpr["needsContext"].test(selector)?0:tokens.length;while(i--){token=tokens[i];if(Expr.relative[(type=token.type)]){break;}
if((find=Expr.find[type])){if((seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){tokens.splice(i,1);selector=seed.length&&toSelector(tokens);if(!selector){push.apply(results,seed);return results;}
break;}}}}
(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,!context||rsibling.test(selector)&&testContext(context.parentNode)||context);return results;};support.sortStable=expando.split("").sort(sortOrder).join("")===expando;support.detectDuplicates=!!hasDuplicate;setDocument();support.sortDetached=assert(function(div1){return div1.compareDocumentPosition(document.createElement("div"))&1;});if(!assert(function(div){div.innerHTML="<a href='#'></a>";return div.firstChild.getAttribute("href")==="#";})){addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML){return elem.getAttribute(name,name.toLowerCase()==="type"?1:2);}});}
if(!support.attributes||!assert(function(div){div.innerHTML="<input/>";div.firstChild.setAttribute("value","");return div.firstChild.getAttribute("value")==="";})){addHandle("value",function(elem,name,isXML){if(!isXML&&elem.nodeName.toLowerCase()==="input"){return elem.defaultValue;}});}
if(!assert(function(div){return div.getAttribute("disabled")==null;})){addHandle(booleans,function(elem,name,isXML){var val;if(!isXML){return elem[name]===true?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null;}});}
return Sizzle;})(window);jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.uniqueSort=jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains;var dir=function(elem,dir,until){var matched=[],truncate=until!==undefined;while((elem=elem[dir])&&elem.nodeType!==9){if(elem.nodeType===1){if(truncate&&jQuery(elem).is(until)){break;}
matched.push(elem);}}
return matched;};var siblings=function(n,elem){var matched=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){matched.push(n);}}
return matched;};var rneedsContext=jQuery.expr.match.needsContext;var rsingleTag=(/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/);var risSimple=/^.[^:#\[\.,]*$/;function winnow(elements,qualifier,not){if(jQuery.isFunction(qualifier)){return jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not;});}
if(qualifier.nodeType){return jQuery.grep(elements,function(elem){return(elem===qualifier)!==not;});}
if(typeof qualifier==="string"){if(risSimple.test(qualifier)){return jQuery.filter(qualifier,elements,not);}
qualifier=jQuery.filter(qualifier,elements);}
return jQuery.grep(elements,function(elem){return(indexOf.call(qualifier,elem)>-1)!==not;});}
jQuery.filter=function(expr,elems,not){var elem=elems[0];if(not){expr=":not("+expr+")";}
return elems.length===1&&elem.nodeType===1?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return elem.nodeType===1;}));};jQuery.fn.extend({find:function(selector){var i,len=this.length,ret=[],self=this;if(typeof selector!=="string"){return this.pushStack(jQuery(selector).filter(function(){for(i=0;i<len;i++){if(jQuery.contains(self[i],this)){return true;}}}));}
for(i=0;i<len;i++){jQuery.find(selector,self[i],ret);}
ret=this.pushStack(len>1?jQuery.unique(ret):ret);ret.selector=this.selector?this.selector+" "+selector:selector;return ret;},filter:function(selector){return this.pushStack(winnow(this,selector||[],false));},not:function(selector){return this.pushStack(winnow(this,selector||[],true));},is:function(selector){return!!winnow(this,typeof selector==="string"&&rneedsContext.test(selector)?jQuery(selector):selector||[],false).length;}});var rootjQuery,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,init=jQuery.fn.init=function(selector,context,root){var match,elem;if(!selector){return this;}
root=root||rootjQuery;if(typeof selector==="string"){if(selector[0]==="<"&&selector[selector.length-1]===">"&&selector.length>=3){match=[null,selector,null];}else{match=rquickExpr.exec(selector);}
if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,true));if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){for(match in context){if(jQuery.isFunction(this[match])){this[match](context[match]);}else{this.attr(match,context[match]);}}}
return this;}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){this.length=1;this[0]=elem;}
this.context=document;this.selector=selector;return this;}}else if(!context||context.jquery){return(context||root).find(selector);}else{return this.constructor(context).find(selector);}}else if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this;}else if(jQuery.isFunction(selector)){return root.ready!==undefined?root.ready(selector):selector(jQuery);}
if(selector.selector!==undefined){this.selector=selector.selector;this.context=selector.context;}
return jQuery.makeArray(selector,this);};init.prototype=jQuery.fn;rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.fn.extend({has:function(target){var targets=jQuery(target,this),l=targets.length;return this.filter(function(){var i=0;for(;i<l;i++){if(jQuery.contains(this,targets[i])){return true;}}});},closest:function(selectors,context){var cur,i=0,l=this.length,matched=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i<l;i++){for(cur=this[i];cur&&cur!==context;cur=cur.parentNode){if(cur.nodeType<11&&(pos?pos.index(cur)>-1:cur.nodeType===1&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break;}}}
return this.pushStack(matched.length>1?jQuery.uniqueSort(matched):matched);},index:function(elem){if(!elem){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1;}
if(typeof elem==="string"){return indexOf.call(jQuery(elem),this[0]);}
return indexOf.call(this,elem.jquery?elem[0]:elem);},add:function(selector,context){return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(),jQuery(selector,context))));},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector));}});function sibling(cur,dir){while((cur=cur[dir])&&cur.nodeType!==1){}
return cur;}
jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null;},parents:function(elem){return dir(elem,"parentNode");},parentsUntil:function(elem,i,until){return dir(elem,"parentNode",until);},next:function(elem){return sibling(elem,"nextSibling");},prev:function(elem){return sibling(elem,"previousSibling");},nextAll:function(elem){return dir(elem,"nextSibling");},prevAll:function(elem){return dir(elem,"previousSibling");},nextUntil:function(elem,i,until){return dir(elem,"nextSibling",until);},prevUntil:function(elem,i,until){return dir(elem,"previousSibling",until);},siblings:function(elem){return siblings((elem.parentNode||{}).firstChild,elem);},children:function(elem){return siblings(elem.firstChild);},contents:function(elem){return elem.contentDocument||jQuery.merge([],elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(until,selector){var matched=jQuery.map(this,fn,until);if(name.slice(-5)!=="Until"){selector=until;}
if(selector&&typeof selector==="string"){matched=jQuery.filter(selector,matched);}
if(this.length>1){if(!guaranteedUnique[name]){jQuery.uniqueSort(matched);}
if(rparentsprev.test(name)){matched.reverse();}}
return this.pushStack(matched);};});var rnotwhite=(/\S+/g);function createOptions(options){var object={};jQuery.each(options.match(rnotwhite)||[],function(_,flag){object[flag]=true;});return object;}
jQuery.Callbacks=function(options){options=typeof options==="string"?createOptions(options):jQuery.extend({},options);var
firing,memory,fired,locked,list=[],queue=[],firingIndex=-1,fire=function(){locked=options.once;fired=firing=true;for(;queue.length;firingIndex=-1){memory=queue.shift();while(++firingIndex<list.length){if(list[firingIndex].apply(memory[0],memory[1])===false&&options.stopOnFalse){firingIndex=list.length;memory=false;}}}
if(!options.memory){memory=false;}
firing=false;if(locked){if(memory){list=[];}else{list="";}}},self={add:function(){if(list){if(memory&&!firing){firingIndex=list.length-1;queue.push(memory);}
(function add(args){jQuery.each(args,function(_,arg){if(jQuery.isFunction(arg)){if(!options.unique||!self.has(arg)){list.push(arg);}}else if(arg&&arg.length&&jQuery.type(arg)!=="string"){add(arg);}});})(arguments);if(memory&&!firing){fire();}}
return this;},remove:function(){jQuery.each(arguments,function(_,arg){var index;while((index=jQuery.inArray(arg,list,index))>-1){list.splice(index,1);if(index<=firingIndex){firingIndex--;}}});return this;},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:list.length>0;},empty:function(){if(list){list=[];}
return this;},disable:function(){locked=queue=[];list=memory="";return this;},disabled:function(){return!list;},lock:function(){locked=queue=[];if(!memory){list=memory="";}
return this;},locked:function(){return!!locked;},fireWith:function(context,args){if(!locked){args=args||[];args=[context,args.slice?args.slice():args];queue.push(args);if(!firing){fire();}}
return this;},fire:function(){self.fireWith(this,arguments);return this;},fired:function(){return!!fired;}};return self;};jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state;},always:function(){deferred.done(arguments).fail(arguments);return this;},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[i])&&fns[i];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);}else{newDefer[tuple[0]+"With"](this===promise?newDefer.promise():this,fn?[returned]:arguments);}});});fns=null;}).promise();},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise;}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString;},tuples[i^1][2].disable,tuples[2][2].lock);}
deferred[tuple[0]]=function(){deferred[tuple[0]+"With"](this===deferred?promise:this,arguments);return this;};deferred[tuple[0]+"With"]=list.fireWith;});promise.promise(deferred);if(func){func.call(deferred,deferred);}
return deferred;},when:function(subordinate){var i=0,resolveValues=slice.call(arguments),length=resolveValues.length,remaining=length!==1||(subordinate&&jQuery.isFunction(subordinate.promise))?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values);}else if(!(--remaining)){deferred.resolveWith(contexts,values);}};},progressValues,progressContexts,resolveContexts;if(length>1){progressValues=new Array(length);progressContexts=new Array(length);resolveContexts=new Array(length);for(;i<length;i++){if(resolveValues[i]&&jQuery.isFunction(resolveValues[i].promise)){resolveValues[i].promise().progress(updateFunc(i,progressContexts,progressValues)).done(updateFunc(i,resolveContexts,resolveValues)).fail(deferred.reject);}else{--remaining;}}}
if(!remaining){deferred.resolveWith(resolveContexts,resolveValues);}
return deferred.promise();}});var readyList;jQuery.fn.ready=function(fn){jQuery.ready.promise().done(fn);return this;};jQuery.extend({isReady:false,readyWait:1,holdReady:function(hold){if(hold){jQuery.readyWait++;}else{jQuery.ready(true);}},ready:function(wait){if(wait===true?--jQuery.readyWait:jQuery.isReady){return;}
jQuery.isReady=true;if(wait!==true&&--jQuery.readyWait>0){return;}
readyList.resolveWith(document,[jQuery]);if(jQuery.fn.triggerHandler){jQuery(document).triggerHandler("ready");jQuery(document).off("ready");}}});function completed(){document.removeEventListener("DOMContentLoaded",completed);window.removeEventListener("load",completed);jQuery.ready();}
jQuery.ready.promise=function(obj){if(!readyList){readyList=jQuery.Deferred();if(document.readyState==="complete"||(document.readyState!=="loading"&&!document.documentElement.doScroll)){window.setTimeout(jQuery.ready);}else{document.addEventListener("DOMContentLoaded",completed);window.addEventListener("load",completed);}}
return readyList.promise(obj);};jQuery.ready.promise();var access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,len=elems.length,bulk=key==null;if(jQuery.type(key)==="object"){chainable=true;for(i in key){access(elems,fn,i,key[i],true,emptyGet,raw);}}else if(value!==undefined){chainable=true;if(!jQuery.isFunction(value)){raw=true;}
if(bulk){if(raw){fn.call(elems,value);fn=null;}else{bulk=fn;fn=function(elem,key,value){return bulk.call(jQuery(elem),value);};}}
if(fn){for(;i<len;i++){fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)));}}}
return chainable?elems:bulk?fn.call(elems):len?fn(elems[0],key):emptyGet;};var acceptData=function(owner){return owner.nodeType===1||owner.nodeType===9||!(+owner.nodeType);};function Data(){this.expando=jQuery.expando+Data.uid++;}
Data.uid=1;Data.prototype={register:function(owner,initial){var value=initial||{};if(owner.nodeType){owner[this.expando]=value;}else{Object.defineProperty(owner,this.expando,{value:value,writable:true,configurable:true});}
return owner[this.expando];},cache:function(owner){if(!acceptData(owner)){return{};}
var value=owner[this.expando];if(!value){value={};if(acceptData(owner)){if(owner.nodeType){owner[this.expando]=value;}else{Object.defineProperty(owner,this.expando,{value:value,configurable:true});}}}
return value;},set:function(owner,data,value){var prop,cache=this.cache(owner);if(typeof data==="string"){cache[data]=value;}else{for(prop in data){cache[prop]=data[prop];}}
return cache;},get:function(owner,key){return key===undefined?this.cache(owner):owner[this.expando]&&owner[this.expando][key];},access:function(owner,key,value){var stored;if(key===undefined||((key&&typeof key==="string")&&value===undefined)){stored=this.get(owner,key);return stored!==undefined?stored:this.get(owner,jQuery.camelCase(key));}
this.set(owner,key,value);return value!==undefined?value:key;},remove:function(owner,key){var i,name,camel,cache=owner[this.expando];if(cache===undefined){return;}
if(key===undefined){this.register(owner);}else{if(jQuery.isArray(key)){name=key.concat(key.map(jQuery.camelCase));}else{camel=jQuery.camelCase(key);if(key in cache){name=[key,camel];}else{name=camel;name=name in cache?[name]:(name.match(rnotwhite)||[]);}}
i=name.length;while(i--){delete cache[name[i]];}}
if(key===undefined||jQuery.isEmptyObject(cache)){if(owner.nodeType){owner[this.expando]=undefined;}else{delete owner[this.expando];}}},hasData:function(owner){var cache=owner[this.expando];return cache!==undefined&&!jQuery.isEmptyObject(cache);}};var dataPriv=new Data();var dataUser=new Data();var rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,rmultiDash=/[A-Z]/g;function dataAttr(elem,key,data){var name;if(data===undefined&&elem.nodeType===1){name="data-"+key.replace(rmultiDash,"-$&").toLowerCase();data=elem.getAttribute(name);if(typeof data==="string"){try{data=data==="true"?true:data==="false"?false:data==="null"?null:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data;}catch(e){}
dataUser.set(elem,key,data);}else{data=undefined;}}
return data;}
jQuery.extend({hasData:function(elem){return dataUser.hasData(elem)||dataPriv.hasData(elem);},data:function(elem,name,data){return dataUser.access(elem,name,data);},removeData:function(elem,name){dataUser.remove(elem,name);},_data:function(elem,name,data){return dataPriv.access(elem,name,data);},_removeData:function(elem,name){dataPriv.remove(elem,name);}});jQuery.fn.extend({data:function(key,value){var i,name,data,elem=this[0],attrs=elem&&elem.attributes;if(key===undefined){if(this.length){data=dataUser.get(elem);if(elem.nodeType===1&&!dataPriv.get(elem,"hasDataAttrs")){i=attrs.length;while(i--){if(attrs[i]){name=attrs[i].name;if(name.indexOf("data-")===0){name=jQuery.camelCase(name.slice(5));dataAttr(elem,name,data[name]);}}}
dataPriv.set(elem,"hasDataAttrs",true);}}
return data;}
if(typeof key==="object"){return this.each(function(){dataUser.set(this,key);});}
return access(this,function(value){var data,camelKey;if(elem&&value===undefined){data=dataUser.get(elem,key)||dataUser.get(elem,key.replace(rmultiDash,"-$&").toLowerCase());if(data!==undefined){return data;}
camelKey=jQuery.camelCase(key);data=dataUser.get(elem,camelKey);if(data!==undefined){return data;}
data=dataAttr(elem,camelKey,undefined);if(data!==undefined){return data;}
return;}
camelKey=jQuery.camelCase(key);this.each(function(){var data=dataUser.get(this,camelKey);dataUser.set(this,camelKey,value);if(key.indexOf("-")>-1&&data!==undefined){dataUser.set(this,key,value);}});},null,value,arguments.length>1,null,true);},removeData:function(key){return this.each(function(){dataUser.remove(this,key);});}});jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=dataPriv.get(elem,type);if(data){if(!queue||jQuery.isArray(data)){queue=dataPriv.access(elem,type,jQuery.makeArray(data));}else{queue.push(data);}}
return queue||[];}},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type);};if(fn==="inprogress"){fn=queue.shift();startLength--;}
if(fn){if(type==="fx"){queue.unshift("inprogress");}
delete hooks.stop;fn.call(elem,next,hooks);}
if(!startLength&&hooks){hooks.empty.fire();}},_queueHooks:function(elem,type){var key=type+"queueHooks";return dataPriv.get(elem,key)||dataPriv.access(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){dataPriv.remove(elem,[type+"queue",key]);})});}});jQuery.fn.extend({queue:function(type,data){var setter=2;if(typeof type!=="string"){data=type;type="fx";setter--;}
if(arguments.length<setter){return jQuery.queue(this[0],type);}
return data===undefined?this:this.each(function(){var queue=jQuery.queue(this,type,data);jQuery._queueHooks(this,type);if(type==="fx"&&queue[0]!=="inprogress"){jQuery.dequeue(this,type);}});},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type);});},clearQueue:function(type){return this.queue(type||"fx",[]);},promise:function(type,obj){var tmp,count=1,defer=jQuery.Deferred(),elements=this,i=this.length,resolve=function(){if(!(--count)){defer.resolveWith(elements,[elements]);}};if(typeof type!=="string"){obj=type;type=undefined;}
type=type||"fx";while(i--){tmp=dataPriv.get(elements[i],type+"queueHooks");if(tmp&&tmp.empty){count++;tmp.empty.add(resolve);}}
resolve();return defer.promise(obj);}});var pnum=(/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;var rcssNum=new RegExp("^(?:([+-])=|)("+pnum+")([a-z%]*)$","i");var cssExpand=["Top","Right","Bottom","Left"];var isHidden=function(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem);};function adjustCSS(elem,prop,valueParts,tween){var adjusted,scale=1,maxIterations=20,currentValue=tween?function(){return tween.cur();}:function(){return jQuery.css(elem,prop,"");},initial=currentValue(),unit=valueParts&&valueParts[3]||(jQuery.cssNumber[prop]?"":"px"),initialInUnit=(jQuery.cssNumber[prop]||unit!=="px"&&+initial)&&rcssNum.exec(jQuery.css(elem,prop));if(initialInUnit&&initialInUnit[3]!==unit){unit=unit||initialInUnit[3];valueParts=valueParts||[];initialInUnit=+initial||1;do{scale=scale||".5";initialInUnit=initialInUnit/scale;jQuery.style(elem,prop,initialInUnit+unit);}while(scale!==(scale=currentValue()/initial)&&scale!==1&&--maxIterations);}
if(valueParts){initialInUnit=+initialInUnit||+initial||0;adjusted=valueParts[1]?initialInUnit+(valueParts[1]+1)*valueParts[2]:+valueParts[2];if(tween){tween.unit=unit;tween.start=initialInUnit;tween.end=adjusted;}}
return adjusted;}
var rcheckableType=(/^(?:checkbox|radio)$/i);var rtagName=(/<([\w:-]+)/);var rscriptType=(/^$|\/(?:java|ecma)script/i);var wrapMap={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;function getAll(context,tag){var ret=typeof context.getElementsByTagName!=="undefined"?context.getElementsByTagName(tag||"*"):typeof context.querySelectorAll!=="undefined"?context.querySelectorAll(tag||"*"):[];return tag===undefined||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],ret):ret;}
function setGlobalEval(elems,refElements){var i=0,l=elems.length;for(;i<l;i++){dataPriv.set(elems[i],"globalEval",!refElements||dataPriv.get(refElements[i],"globalEval"));}}
var rhtml=/<|&#?\w+;/;function buildFragment(elems,context,scripts,selection,ignored){var elem,tmp,tag,wrap,contains,j,fragment=context.createDocumentFragment(),nodes=[],i=0,l=elems.length;for(;i<l;i++){elem=elems[i];if(elem||elem===0){if(jQuery.type(elem)==="object"){jQuery.merge(nodes,elem.nodeType?[elem]:elem);}else if(!rhtml.test(elem)){nodes.push(context.createTextNode(elem));}else{tmp=tmp||fragment.appendChild(context.createElement("div"));tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;tmp.innerHTML=wrap[1]+jQuery.htmlPrefilter(elem)+wrap[2];j=wrap[0];while(j--){tmp=tmp.lastChild;}
jQuery.merge(nodes,tmp.childNodes);tmp=fragment.firstChild;tmp.textContent="";}}}
fragment.textContent="";i=0;while((elem=nodes[i++])){if(selection&&jQuery.inArray(elem,selection)>-1){if(ignored){ignored.push(elem);}
continue;}
contains=jQuery.contains(elem.ownerDocument,elem);tmp=getAll(fragment.appendChild(elem),"script");if(contains){setGlobalEval(tmp);}
if(scripts){j=0;while((elem=tmp[j++])){if(rscriptType.test(elem.type||"")){scripts.push(elem);}}}}
return fragment;}
(function(){var fragment=document.createDocumentFragment(),div=fragment.appendChild(document.createElement("div")),input=document.createElement("input");input.setAttribute("type","radio");input.setAttribute("checked","checked");input.setAttribute("name","t");div.appendChild(input);support.checkClone=div.cloneNode(true).cloneNode(true).lastChild.checked;div.innerHTML="<textarea>x</textarea>";support.noCloneChecked=!!div.cloneNode(true).lastChild.defaultValue;})();var
rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,rtypenamespace=/^([^.]*)(?:\.(.+)|)/;function returnTrue(){return true;}
function returnFalse(){return false;}
function safeActiveElement(){try{return document.activeElement;}catch(err){}}
function on(elem,types,selector,data,fn,one){var origFn,type;if(typeof types==="object"){if(typeof selector!=="string"){data=data||selector;selector=undefined;}
for(type in types){on(elem,type,selector,data,types[type],one);}
return elem;}
if(data==null&&fn==null){fn=selector;data=selector=undefined;}else if(fn==null){if(typeof selector==="string"){fn=data;data=undefined;}else{fn=data;data=selector;selector=undefined;}}
if(fn===false){fn=returnFalse;}else if(!fn){return elem;}
if(one===1){origFn=fn;fn=function(event){jQuery().off(event);return origFn.apply(this,arguments);};fn.guid=origFn.guid||(origFn.guid=jQuery.guid++);}
return elem.each(function(){jQuery.event.add(this,types,fn,data,selector);});}
jQuery.event={global:{},add:function(elem,types,handler,data,selector){var handleObjIn,eventHandle,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.get(elem);if(!elemData){return;}
if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector;}
if(!handler.guid){handler.guid=jQuery.guid++;}
if(!(events=elemData.events)){events=elemData.events={};}
if(!(eventHandle=elemData.handle)){eventHandle=elemData.handle=function(e){return typeof jQuery!=="undefined"&&jQuery.event.triggered!==e.type?jQuery.event.dispatch.apply(elem,arguments):undefined;};}
types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){continue;}
special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;special=jQuery.event.special[type]||{};handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn);if(!(handlers=events[type])){handlers=events[type]=[];handlers.delegateCount=0;if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===false){if(elem.addEventListener){elem.addEventListener(type,eventHandle);}}}
if(special.add){special.add.call(elem,handleObj);if(!handleObj.handler.guid){handleObj.handler.guid=handler.guid;}}
if(selector){handlers.splice(handlers.delegateCount++,0,handleObj);}else{handlers.push(handleObj);}
jQuery.event.global[type]=true;}},remove:function(elem,types,handler,selector,mappedTypes){var j,origCount,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.hasData(elem)&&dataPriv.get(elem);if(!elemData||!(events=elemData.events)){return;}
types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){for(type in events){jQuery.event.remove(elem,type+types[t],handler,selector,true);}
continue;}
special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;handlers=events[type]||[];tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)");origCount=j=handlers.length;while(j--){handleObj=handlers[j];if((mappedTypes||origType===handleObj.origType)&&(!handler||handler.guid===handleObj.guid)&&(!tmp||tmp.test(handleObj.namespace))&&(!selector||selector===handleObj.selector||selector==="**"&&handleObj.selector)){handlers.splice(j,1);if(handleObj.selector){handlers.delegateCount--;}
if(special.remove){special.remove.call(elem,handleObj);}}}
if(origCount&&!handlers.length){if(!special.teardown||special.teardown.call(elem,namespaces,elemData.handle)===false){jQuery.removeEvent(elem,type,elemData.handle);}
delete events[type];}}
if(jQuery.isEmptyObject(events)){dataPriv.remove(elem,"handle events");}},dispatch:function(event){event=jQuery.event.fix(event);var i,j,ret,matched,handleObj,handlerQueue=[],args=slice.call(arguments),handlers=(dataPriv.get(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};args[0]=event;event.delegateTarget=this;if(special.preDispatch&&special.preDispatch.call(this,event)===false){return;}
handlerQueue=jQuery.event.handlers.call(this,event,handlers);i=0;while((matched=handlerQueue[i++])&&!event.isPropagationStopped()){event.currentTarget=matched.elem;j=0;while((handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped()){if(!event.rnamespace||event.rnamespace.test(handleObj.namespace)){event.handleObj=handleObj;event.data=handleObj.data;ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args);if(ret!==undefined){if((event.result=ret)===false){event.preventDefault();event.stopPropagation();}}}}}
if(special.postDispatch){special.postDispatch.call(this,event);}
return event.result;},handlers:function(event,handlers){var i,matches,sel,handleObj,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&(event.type!=="click"||isNaN(event.button)||event.button<1)){for(;cur!==this;cur=cur.parentNode||this){if(cur.nodeType===1&&(cur.disabled!==true||event.type!=="click")){matches=[];for(i=0;i<delegateCount;i++){handleObj=handlers[i];sel=handleObj.selector+" ";if(matches[sel]===undefined){matches[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>-1:jQuery.find(sel,this,null,[cur]).length;}
if(matches[sel]){matches.push(handleObj);}}
if(matches.length){handlerQueue.push({elem:cur,handlers:matches});}}}}
if(delegateCount<handlers.length){handlerQueue.push({elem:this,handlers:handlers.slice(delegateCount)});}
return handlerQueue;},props:("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase "+"metaKey relatedTarget shiftKey target timeStamp view which").split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(event,original){if(event.which==null){event.which=original.charCode!=null?original.charCode:original.keyCode;}
return event;}},mouseHooks:{props:("button buttons clientX clientY offsetX offsetY pageX pageY "+"screenX screenY toElement").split(" "),filter:function(event,original){var eventDoc,doc,body,button=original.button;if(event.pageX==null&&original.clientX!=null){eventDoc=event.target.ownerDocument||document;doc=eventDoc.documentElement;body=eventDoc.body;event.pageX=original.clientX+
(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-
(doc&&doc.clientLeft||body&&body.clientLeft||0);event.pageY=original.clientY+
(doc&&doc.scrollTop||body&&body.scrollTop||0)-
(doc&&doc.clientTop||body&&body.clientTop||0);}
if(!event.which&&button!==undefined){event.which=(button&1?1:(button&2?3:(button&4?2:0)));}
return event;}},fix:function(event){if(event[jQuery.expando]){return event;}
var i,prop,copy,type=event.type,originalEvent=event,fixHook=this.fixHooks[type];if(!fixHook){this.fixHooks[type]=fixHook=rmouseEvent.test(type)?this.mouseHooks:rkeyEvent.test(type)?this.keyHooks:{};}
copy=fixHook.props?this.props.concat(fixHook.props):this.props;event=new jQuery.Event(originalEvent);i=copy.length;while(i--){prop=copy[i];event[prop]=originalEvent[prop];}
if(!event.target){event.target=document;}
if(event.target.nodeType===3){event.target=event.target.parentNode;}
return fixHook.filter?fixHook.filter(event,originalEvent):event;},special:{load:{noBubble:true},focus:{trigger:function(){if(this!==safeActiveElement()&&this.focus){this.focus();return false;}},delegateType:"focusin"},blur:{trigger:function(){if(this===safeActiveElement()&&this.blur){this.blur();return false;}},delegateType:"focusout"},click:{trigger:function(){if(this.type==="checkbox"&&this.click&&jQuery.nodeName(this,"input")){this.click();return false;}},_default:function(event){return jQuery.nodeName(event.target,"a");}},beforeunload:{postDispatch:function(event){if(event.result!==undefined&&event.originalEvent){event.originalEvent.returnValue=event.result;}}}}};jQuery.removeEvent=function(elem,type,handle){if(elem.removeEventListener){elem.removeEventListener(type,handle);}};jQuery.Event=function(src,props){if(!(this instanceof jQuery.Event)){return new jQuery.Event(src,props);}
if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=src.defaultPrevented||src.defaultPrevented===undefined&&src.returnValue===false?returnTrue:returnFalse;}else{this.type=src;}
if(props){jQuery.extend(this,props);}
this.timeStamp=src&&src.timeStamp||jQuery.now();this[jQuery.expando]=true;};jQuery.Event.prototype={constructor:jQuery.Event,isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=returnTrue;if(e){e.preventDefault();}},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=returnTrue;if(e){e.stopPropagation();}},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=returnTrue;if(e){e.stopImmediatePropagation();}
this.stopPropagation();}};jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj;if(!related||(related!==target&&!jQuery.contains(target,related))){event.type=handleObj.origType;ret=handleObj.handler.apply(this,arguments);event.type=fix;}
return ret;}};});jQuery.fn.extend({on:function(types,selector,data,fn){return on(this,types,selector,data,fn);},one:function(types,selector,data,fn){return on(this,types,selector,data,fn,1);},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj){handleObj=types.handleObj;jQuery(types.delegateTarget).off(handleObj.namespace?handleObj.origType+"."+handleObj.namespace:handleObj.origType,handleObj.selector,handleObj.handler);return this;}
if(typeof types==="object"){for(type in types){this.off(type,selector,types[type]);}
return this;}
if(selector===false||typeof selector==="function"){fn=selector;selector=undefined;}
if(fn===false){fn=returnFalse;}
return this.each(function(){jQuery.event.remove(this,types,fn,selector);});}});var
rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,rnoInnerhtml=/<script|<style|<link/i,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptTypeMasked=/^true\/(.*)/,rcleanScript=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(content.nodeType!==11?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody")):elem;}
function disableScript(elem){elem.type=(elem.getAttribute("type")!==null)+"/"+elem.type;return elem;}
function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);if(match){elem.type=match[1];}else{elem.removeAttribute("type");}
return elem;}
function cloneCopyEvent(src,dest){var i,l,type,pdataOld,pdataCur,udataOld,udataCur,events;if(dest.nodeType!==1){return;}
if(dataPriv.hasData(src)){pdataOld=dataPriv.access(src);pdataCur=dataPriv.set(dest,pdataOld);events=pdataOld.events;if(events){delete pdataCur.handle;pdataCur.events={};for(type in events){for(i=0,l=events[type].length;i<l;i++){jQuery.event.add(dest,type,events[type][i]);}}}}
if(dataUser.hasData(src)){udataOld=dataUser.access(src);udataCur=jQuery.extend({},udataOld);dataUser.set(dest,udataCur);}}
function fixInput(src,dest){var nodeName=dest.nodeName.toLowerCase();if(nodeName==="input"&&rcheckableType.test(src.type)){dest.checked=src.checked;}else if(nodeName==="input"||nodeName==="textarea"){dest.defaultValue=src.defaultValue;}}
function domManip(collection,args,callback,ignored){args=concat.apply([],args);var fragment,first,scripts,hasScripts,node,doc,i=0,l=collection.length,iNoClone=l-1,value=args[0],isFunction=jQuery.isFunction(value);if(isFunction||(l>1&&typeof value==="string"&&!support.checkClone&&rchecked.test(value))){return collection.each(function(index){var self=collection.eq(index);if(isFunction){args[0]=value.call(this,index,self.html());}
domManip(self,args,callback,ignored);});}
if(l){fragment=buildFragment(args,collection[0].ownerDocument,false,collection,ignored);first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first;}
if(first||ignored){scripts=jQuery.map(getAll(fragment,"script"),disableScript);hasScripts=scripts.length;for(;i<l;i++){node=fragment;if(i!==iNoClone){node=jQuery.clone(node,true,true);if(hasScripts){jQuery.merge(scripts,getAll(node,"script"));}}
callback.call(collection[i],node,i);}
if(hasScripts){doc=scripts[scripts.length-1].ownerDocument;jQuery.map(scripts,restoreScript);for(i=0;i<hasScripts;i++){node=scripts[i];if(rscriptType.test(node.type||"")&&!dataPriv.access(node,"globalEval")&&jQuery.contains(doc,node)){if(node.src){if(jQuery._evalUrl){jQuery._evalUrl(node.src);}}else{jQuery.globalEval(node.textContent.replace(rcleanScript,""));}}}}}}
return collection;}
function remove(elem,selector,keepData){var node,nodes=selector?jQuery.filter(selector,elem):elem,i=0;for(;(node=nodes[i])!=null;i++){if(!keepData&&node.nodeType===1){jQuery.cleanData(getAll(node));}
if(node.parentNode){if(keepData&&jQuery.contains(node.ownerDocument,node)){setGlobalEval(getAll(node,"script"));}
node.parentNode.removeChild(node);}}
return elem;}
jQuery.extend({htmlPrefilter:function(html){return html.replace(rxhtmlTag,"<$1></$2>");},clone:function(elem,dataAndEvents,deepDataAndEvents){var i,l,srcElements,destElements,clone=elem.cloneNode(true),inPage=jQuery.contains(elem.ownerDocument,elem);if(!support.noCloneChecked&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){destElements=getAll(clone);srcElements=getAll(elem);for(i=0,l=srcElements.length;i<l;i++){fixInput(srcElements[i],destElements[i]);}}
if(dataAndEvents){if(deepDataAndEvents){srcElements=srcElements||getAll(elem);destElements=destElements||getAll(clone);for(i=0,l=srcElements.length;i<l;i++){cloneCopyEvent(srcElements[i],destElements[i]);}}else{cloneCopyEvent(elem,clone);}}
destElements=getAll(clone,"script");if(destElements.length>0){setGlobalEval(destElements,!inPage&&getAll(elem,"script"));}
return clone;},cleanData:function(elems){var data,elem,type,special=jQuery.event.special,i=0;for(;(elem=elems[i])!==undefined;i++){if(acceptData(elem)){if((data=elem[dataPriv.expando])){if(data.events){for(type in data.events){if(special[type]){jQuery.event.remove(elem,type);}else{jQuery.removeEvent(elem,type,data.handle);}}}
elem[dataPriv.expando]=undefined;}
if(elem[dataUser.expando]){elem[dataUser.expando]=undefined;}}}}});jQuery.fn.extend({domManip:domManip,detach:function(selector){return remove(this,selector,true);},remove:function(selector){return remove(this,selector);},text:function(value){return access(this,function(value){return value===undefined?jQuery.text(this):this.empty().each(function(){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){this.textContent=value;}});},null,value,arguments.length);},append:function(){return domManip(this,arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.appendChild(elem);}});},prepend:function(){return domManip(this,arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild);}});},before:function(){return domManip(this,arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this);}});},after:function(){return domManip(this,arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this.nextSibling);}});},empty:function(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false));elem.textContent="";}}
return this;},clone:function(dataAndEvents,deepDataAndEvents){dataAndEvents=dataAndEvents==null?false:dataAndEvents;deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents;return this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents);});},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(value===undefined&&elem.nodeType===1){return elem.innerHTML;}
if(typeof value==="string"&&!rnoInnerhtml.test(value)&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=jQuery.htmlPrefilter(value);try{for(;i<l;i++){elem=this[i]||{};if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false));elem.innerHTML=value;}}
elem=0;}catch(e){}}
if(elem){this.empty().append(value);}},null,value,arguments.length);},replaceWith:function(){var ignored=[];return domManip(this,arguments,function(elem){var parent=this.parentNode;if(jQuery.inArray(this,ignored)<0){jQuery.cleanData(getAll(this));if(parent){parent.replaceChild(elem,this);}}},ignored);}});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){var elems,ret=[],insert=jQuery(selector),last=insert.length-1,i=0;for(;i<=last;i++){elems=i===last?this:this.clone(true);jQuery(insert[i])[original](elems);push.apply(ret,elems.get());}
return this.pushStack(ret);};});var iframe,elemdisplay={HTML:"block",BODY:"block"};function actualDisplay(name,doc){var elem=jQuery(doc.createElement(name)).appendTo(doc.body),display=jQuery.css(elem[0],"display");elem.detach();return display;}
function defaultDisplay(nodeName){var doc=document,display=elemdisplay[nodeName];if(!display){display=actualDisplay(nodeName,doc);if(display==="none"||!display){iframe=(iframe||jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);doc=iframe[0].contentDocument;doc.write();doc.close();display=actualDisplay(nodeName,doc);iframe.detach();}
elemdisplay[nodeName]=display;}
return display;}
var rmargin=(/^margin/);var rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");var getStyles=function(elem){var view=elem.ownerDocument.defaultView;if(!view||!view.opener){view=window;}
return view.getComputedStyle(elem);};var swap=function(elem,options,callback,args){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name];}
ret=callback.apply(elem,args||[]);for(name in options){elem.style[name]=old[name];}
return ret;};var documentElement=document.documentElement;(function(){var pixelPositionVal,boxSizingReliableVal,pixelMarginRightVal,reliableMarginLeftVal,container=document.createElement("div"),div=document.createElement("div");if(!div.style){return;}
div.style.backgroundClip="content-box";div.cloneNode(true).style.backgroundClip="";support.clearCloneStyle=div.style.backgroundClip==="content-box";container.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;"+"padding:0;margin-top:1px;position:absolute";container.appendChild(div);function computeStyleTests(){div.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;"+"position:relative;display:block;"+"margin:auto;border:1px;padding:1px;"+"top:1%;width:50%";div.innerHTML="";documentElement.appendChild(container);var divStyle=window.getComputedStyle(div);pixelPositionVal=divStyle.top!=="1%";reliableMarginLeftVal=divStyle.marginLeft==="2px";boxSizingReliableVal=divStyle.width==="4px";div.style.marginRight="50%";pixelMarginRightVal=divStyle.marginRight==="4px";documentElement.removeChild(container);}
jQuery.extend(support,{pixelPosition:function(){computeStyleTests();return pixelPositionVal;},boxSizingReliable:function(){if(boxSizingReliableVal==null){computeStyleTests();}
return boxSizingReliableVal;},pixelMarginRight:function(){if(boxSizingReliableVal==null){computeStyleTests();}
return pixelMarginRightVal;},reliableMarginLeft:function(){if(boxSizingReliableVal==null){computeStyleTests();}
return reliableMarginLeftVal;},reliableMarginRight:function(){var ret,marginDiv=div.appendChild(document.createElement("div"));marginDiv.style.cssText=div.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;"+"display:block;margin:0;border:0;padding:0";marginDiv.style.marginRight=marginDiv.style.width="0";div.style.width="1px";documentElement.appendChild(container);ret=!parseFloat(window.getComputedStyle(marginDiv).marginRight);documentElement.removeChild(container);div.removeChild(marginDiv);return ret;}});})();function curCSS(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed.getPropertyValue(name)||computed[name]:undefined;if((ret===""||ret===undefined)&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name);}
if(computed){if(!support.pixelMarginRight()&&rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth;}}
return ret!==undefined?ret+"":ret;}
function addGetHookIf(conditionFn,hookFn){return{get:function(){if(conditionFn()){delete this.get;return;}
return(this.get=hookFn).apply(this,arguments);}};}
var
rdisplayswap=/^(none|table(?!-c[ea]).+)/,cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","O","Moz","ms"],emptyStyle=document.createElement("div").style;function vendorPropName(name){if(name in emptyStyle){return name;}
var capName=name[0].toUpperCase()+name.slice(1),i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in emptyStyle){return name;}}}
function setPositiveNumber(elem,value,subtract){var matches=rcssNum.exec(value);return matches?Math.max(0,matches[2]-(subtract||0))+(matches[3]||"px"):value;}
function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true,styles);}
if(isBorderBox){if(extra==="content"){val-=jQuery.css(elem,"padding"+cssExpand[i],true,styles);}
if(extra!=="margin"){val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles);}}else{val+=jQuery.css(elem,"padding"+cssExpand[i],true,styles);if(extra!=="padding"){val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles);}}}
return val;}
function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=true,val=name==="width"?elem.offsetWidth:elem.offsetHeight,styles=getStyles(elem),isBorderBox=jQuery.css(elem,"boxSizing",false,styles)==="border-box";if(document.msFullscreenElement&&window.top!==window){if(elem.getClientRects().length){val=Math.round(elem.getBoundingClientRect()[name]*100);}}
if(val<=0||val==null){val=curCSS(elem,name,styles);if(val<0||val==null){val=elem.style[name];}
if(rnumnonpx.test(val)){return val;}
valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]);val=parseFloat(val)||0;}
return(val+
augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles))+"px";}
function showHide(elements,show){var display,elem,hidden,values=[],index=0,length=elements.length;for(;index<length;index++){elem=elements[index];if(!elem.style){continue;}
values[index]=dataPriv.get(elem,"olddisplay");display=elem.style.display;if(show){if(!values[index]&&display==="none"){elem.style.display="";}
if(elem.style.display===""&&isHidden(elem)){values[index]=dataPriv.access(elem,"olddisplay",defaultDisplay(elem.nodeName));}}else{hidden=isHidden(elem);if(display!=="none"||!hidden){dataPriv.set(elem,"olddisplay",hidden?display:jQuery.css(elem,"display"));}}}
for(index=0;index<length;index++){elem=elements[index];if(!elem.style){continue;}
if(!show||elem.style.display==="none"||elem.style.display===""){elem.style.display=show?values[index]||"":"none";}}
return elements;}
jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret;}}}},cssNumber:{"animationIterationCount":true,"columnCount":true,"fillOpacity":true,"flexGrow":true,"flexShrink":true,"fontWeight":true,"lineHeight":true,"opacity":true,"order":true,"orphans":true,"widows":true,"zIndex":true,"zoom":true},cssProps:{"float":"cssFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return;}
var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(origName)||origName);hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rcssNum.exec(value))&&ret[1]){value=adjustCSS(elem,name,ret);type="number";}
if(value==null||value!==value){return;}
if(type==="number"){value+=ret&&ret[3]||(jQuery.cssNumber[origName]?"":"px");}
if(!support.clearCloneStyle&&value===""&&name.indexOf("background")===0){style[name]="inherit";}
if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){style[name]=value;}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret;}
return style[name];}},css:function(elem,name,extra,styles){var val,num,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(origName)||origName);hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra);}
if(val===undefined){val=curCSS(elem,name,styles);}
if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name];}
if(extra===""||extra){num=parseFloat(val);return extra===true||isFinite(num)?num||0:val;}
return val;}});jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){return rdisplayswap.test(jQuery.css(elem,"display"))&&elem.offsetWidth===0?swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra);}):getWidthOrHeight(elem,name,extra);}},set:function(elem,value,extra){var matches,styles=extra&&getStyles(elem),subtract=extra&&augmentWidthOrHeight(elem,name,extra,jQuery.css(elem,"boxSizing",false,styles)==="border-box",styles);if(subtract&&(matches=rcssNum.exec(value))&&(matches[3]||"px")!=="px"){elem.style[name]=value;value=jQuery.css(elem,name);}
return setPositiveNumber(elem,value,subtract);}};});jQuery.cssHooks.marginLeft=addGetHookIf(support.reliableMarginLeft,function(elem,computed){if(computed){return(parseFloat(curCSS(elem,"marginLeft"))||elem.getBoundingClientRect().left-
swap(elem,{marginLeft:0},function(){return elem.getBoundingClientRect().left;}))+"px";}});jQuery.cssHooks.marginRight=addGetHookIf(support.reliableMarginRight,function(elem,computed){if(computed){return swap(elem,{"display":"inline-block"},curCSS,[elem,"marginRight"]);}});jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i=0,expanded={},parts=typeof value==="string"?value.split(" "):[value];for(;i<4;i++){expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0];}
return expanded;}};if(!rmargin.test(prefix)){jQuery.cssHooks[prefix+suffix].set=setPositiveNumber;}});jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(jQuery.isArray(name)){styles=getStyles(elem);len=name.length;for(;i<len;i++){map[name[i]]=jQuery.css(elem,name[i],false,styles);}
return map;}
return value!==undefined?jQuery.style(elem,name,value):jQuery.css(elem,name);},name,value,arguments.length>1);},show:function(){return showHide(this,true);},hide:function(){return showHide(this);},toggle:function(state){if(typeof state==="boolean"){return state?this.show():this.hide();}
return this.each(function(){if(isHidden(this)){jQuery(this).show();}else{jQuery(this).hide();}});}});function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing);}
jQuery.Tween=Tween;Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem;this.prop=prop;this.easing=easing||jQuery.easing._default;this.options=options;this.start=this.now=this.cur();this.end=end;this.unit=unit||(jQuery.cssNumber[prop]?"":"px");},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this);},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];if(this.options.duration){this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration);}else{this.pos=eased=percent;}
this.now=(this.end-this.start)*eased+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this);}
if(hooks&&hooks.set){hooks.set(this);}else{Tween.propHooks._default.set(this);}
return this;}};Tween.prototype.init.prototype=Tween.prototype;Tween.propHooks={_default:{get:function(tween){var result;if(tween.elem.nodeType!==1||tween.elem[tween.prop]!=null&&tween.elem.style[tween.prop]==null){return tween.elem[tween.prop];}
result=jQuery.css(tween.elem,tween.prop,"");return!result||result==="auto"?0:result;},set:function(tween){if(jQuery.fx.step[tween.prop]){jQuery.fx.step[tween.prop](tween);}else if(tween.elem.nodeType===1&&(tween.elem.style[jQuery.cssProps[tween.prop]]!=null||jQuery.cssHooks[tween.prop])){jQuery.style(tween.elem,tween.prop,tween.now+tween.unit);}else{tween.elem[tween.prop]=tween.now;}}}};Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){if(tween.elem.nodeType&&tween.elem.parentNode){tween.elem[tween.prop]=tween.now;}}};jQuery.easing={linear:function(p){return p;},swing:function(p){return 0.5-Math.cos(p*Math.PI)/2;},_default:"swing"};jQuery.fx=Tween.prototype.init;jQuery.fx.step={};var
fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rrun=/queueHooks$/;function createFxNow(){window.setTimeout(function(){fxNow=undefined;});return(fxNow=jQuery.now());}
function genFx(type,includeWidth){var which,i=0,attrs={height:type};includeWidth=includeWidth?1:0;for(;i<4;i+=2-includeWidth){which=cssExpand[i];attrs["margin"+which]=attrs["padding"+which]=type;}
if(includeWidth){attrs.opacity=attrs.width=type;}
return attrs;}
function createTween(value,prop,animation){var tween,collection=(Animation.tweeners[prop]||[]).concat(Animation.tweeners["*"]),index=0,length=collection.length;for(;index<length;index++){if((tween=collection[index].call(animation,prop,value))){return tween;}}}
function defaultPrefilter(elem,props,opts){var prop,value,toggle,tween,hooks,oldfire,display,checkDisplay,anim=this,orig={},style=elem.style,hidden=elem.nodeType&&isHidden(elem),dataShow=dataPriv.get(elem,"fxshow");if(!opts.queue){hooks=jQuery._queueHooks(elem,"fx");if(hooks.unqueued==null){hooks.unqueued=0;oldfire=hooks.empty.fire;hooks.empty.fire=function(){if(!hooks.unqueued){oldfire();}};}
hooks.unqueued++;anim.always(function(){anim.always(function(){hooks.unqueued--;if(!jQuery.queue(elem,"fx").length){hooks.empty.fire();}});});}
if(elem.nodeType===1&&("height"in props||"width"in props)){opts.overflow=[style.overflow,style.overflowX,style.overflowY];display=jQuery.css(elem,"display");checkDisplay=display==="none"?dataPriv.get(elem,"olddisplay")||defaultDisplay(elem.nodeName):display;if(checkDisplay==="inline"&&jQuery.css(elem,"float")==="none"){style.display="inline-block";}}
if(opts.overflow){style.overflow="hidden";anim.always(function(){style.overflow=opts.overflow[0];style.overflowX=opts.overflow[1];style.overflowY=opts.overflow[2];});}
for(prop in props){value=props[prop];if(rfxtypes.exec(value)){delete props[prop];toggle=toggle||value==="toggle";if(value===(hidden?"hide":"show")){if(value==="show"&&dataShow&&dataShow[prop]!==undefined){hidden=true;}else{continue;}}
orig[prop]=dataShow&&dataShow[prop]||jQuery.style(elem,prop);}else{display=undefined;}}
if(!jQuery.isEmptyObject(orig)){if(dataShow){if("hidden"in dataShow){hidden=dataShow.hidden;}}else{dataShow=dataPriv.access(elem,"fxshow",{});}
if(toggle){dataShow.hidden=!hidden;}
if(hidden){jQuery(elem).show();}else{anim.done(function(){jQuery(elem).hide();});}
anim.done(function(){var prop;dataPriv.remove(elem,"fxshow");for(prop in orig){jQuery.style(elem,prop,orig[prop]);}});for(prop in orig){tween=createTween(hidden?dataShow[prop]:0,prop,anim);if(!(prop in dataShow)){dataShow[prop]=tween.start;if(hidden){tween.end=tween.start;tween.start=prop==="width"||prop==="height"?1:0;}}}}else if((display==="none"?defaultDisplay(elem.nodeName):display)==="inline"){style.display=display;}}
function propFilter(props,specialEasing){var index,name,easing,value,hooks;for(index in props){name=jQuery.camelCase(index);easing=specialEasing[name];value=props[index];if(jQuery.isArray(value)){easing=value[1];value=props[index]=value[0];}
if(index!==name){props[name]=value;delete props[index];}
hooks=jQuery.cssHooks[name];if(hooks&&"expand"in hooks){value=hooks.expand(value);delete props[name];for(index in value){if(!(index in props)){props[index]=value[index];specialEasing[index]=easing;}}}else{specialEasing[name]=easing;}}}
function Animation(elem,properties,options){var result,stopped,index=0,length=Animation.prefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem;}),tick=function(){if(stopped){return false;}
var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),temp=remaining/animation.duration||0,percent=1-temp,index=0,length=animation.tweens.length;for(;index<length;index++){animation.tweens[index].run(percent);}
deferred.notifyWith(elem,[animation,percent,remaining]);if(percent<1&&length){return remaining;}else{deferred.resolveWith(elem,[animation]);return false;}},animation=deferred.promise({elem:elem,props:jQuery.extend({},properties),opts:jQuery.extend(true,{specialEasing:{},easing:jQuery.easing._default},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end){var tween=jQuery.Tween(elem,animation.opts,prop,end,animation.opts.specialEasing[prop]||animation.opts.easing);animation.tweens.push(tween);return tween;},stop:function(gotoEnd){var index=0,length=gotoEnd?animation.tweens.length:0;if(stopped){return this;}
stopped=true;for(;index<length;index++){animation.tweens[index].run(1);}
if(gotoEnd){deferred.notifyWith(elem,[animation,1,0]);deferred.resolveWith(elem,[animation,gotoEnd]);}else{deferred.rejectWith(elem,[animation,gotoEnd]);}
return this;}}),props=animation.props;propFilter(props,animation.opts.specialEasing);for(;index<length;index++){result=Animation.prefilters[index].call(animation,elem,props,animation.opts);if(result){if(jQuery.isFunction(result.stop)){jQuery._queueHooks(animation.elem,animation.opts.queue).stop=jQuery.proxy(result.stop,result);}
return result;}}
jQuery.map(props,createTween,animation);if(jQuery.isFunction(animation.opts.start)){animation.opts.start.call(elem,animation);}
jQuery.fx.timer(jQuery.extend(tick,{elem:elem,anim:animation,queue:animation.opts.queue}));return animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);}
jQuery.Animation=jQuery.extend(Animation,{tweeners:{"*":[function(prop,value){var tween=this.createTween(prop,value);adjustCSS(tween.elem,prop,rcssNum.exec(value),tween);return tween;}]},tweener:function(props,callback){if(jQuery.isFunction(props)){callback=props;props=["*"];}else{props=props.match(rnotwhite);}
var prop,index=0,length=props.length;for(;index<length;index++){prop=props[index];Animation.tweeners[prop]=Animation.tweeners[prop]||[];Animation.tweeners[prop].unshift(callback);}},prefilters:[defaultPrefilter],prefilter:function(callback,prepend){if(prepend){Animation.prefilters.unshift(callback);}else{Animation.prefilters.push(callback);}}});jQuery.speed=function(speed,easing,fn){var opt=speed&&typeof speed==="object"?jQuery.extend({},speed):{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};opt.duration=jQuery.fx.off?0:typeof opt.duration==="number"?opt.duration:opt.duration in jQuery.fx.speeds?jQuery.fx.speeds[opt.duration]:jQuery.fx.speeds._default;if(opt.queue==null||opt.queue===true){opt.queue="fx";}
opt.old=opt.complete;opt.complete=function(){if(jQuery.isFunction(opt.old)){opt.old.call(this);}
if(opt.queue){jQuery.dequeue(this,opt.queue);}};return opt;};jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHidden).css("opacity",0).show().end().animate({opacity:to},speed,easing,callback);},animate:function(prop,speed,easing,callback){var empty=jQuery.isEmptyObject(prop),optall=jQuery.speed(speed,easing,callback),doAnimation=function(){var anim=Animation(this,jQuery.extend({},prop),optall);if(empty||dataPriv.get(this,"finish")){anim.stop(true);}};doAnimation.finish=doAnimation;return empty||optall.queue===false?this.each(doAnimation):this.queue(optall.queue,doAnimation);},stop:function(type,clearQueue,gotoEnd){var stopQueue=function(hooks){var stop=hooks.stop;delete hooks.stop;stop(gotoEnd);};if(typeof type!=="string"){gotoEnd=clearQueue;clearQueue=type;type=undefined;}
if(clearQueue&&type!==false){this.queue(type||"fx",[]);}
return this.each(function(){var dequeue=true,index=type!=null&&type+"queueHooks",timers=jQuery.timers,data=dataPriv.get(this);if(index){if(data[index]&&data[index].stop){stopQueue(data[index]);}}else{for(index in data){if(data[index]&&data[index].stop&&rrun.test(index)){stopQueue(data[index]);}}}
for(index=timers.length;index--;){if(timers[index].elem===this&&(type==null||timers[index].queue===type)){timers[index].anim.stop(gotoEnd);dequeue=false;timers.splice(index,1);}}
if(dequeue||!gotoEnd){jQuery.dequeue(this,type);}});},finish:function(type){if(type!==false){type=type||"fx";}
return this.each(function(){var index,data=dataPriv.get(this),queue=data[type+"queue"],hooks=data[type+"queueHooks"],timers=jQuery.timers,length=queue?queue.length:0;data.finish=true;jQuery.queue(this,type,[]);if(hooks&&hooks.stop){hooks.stop.call(this,true);}
for(index=timers.length;index--;){if(timers[index].elem===this&&timers[index].queue===type){timers[index].anim.stop(true);timers.splice(index,1);}}
for(index=0;index<length;index++){if(queue[index]&&queue[index].finish){queue[index].finish.call(this);}}
delete data.finish;});}});jQuery.each(["toggle","show","hide"],function(i,name){var cssFn=jQuery.fn[name];jQuery.fn[name]=function(speed,easing,callback){return speed==null||typeof speed==="boolean"?cssFn.apply(this,arguments):this.animate(genFx(name,true),speed,easing,callback);};});jQuery.each({slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(name,props){jQuery.fn[name]=function(speed,easing,callback){return this.animate(props,speed,easing,callback);};});jQuery.timers=[];jQuery.fx.tick=function(){var timer,i=0,timers=jQuery.timers;fxNow=jQuery.now();for(;i<timers.length;i++){timer=timers[i];if(!timer()&&timers[i]===timer){timers.splice(i--,1);}}
if(!timers.length){jQuery.fx.stop();}
fxNow=undefined;};jQuery.fx.timer=function(timer){jQuery.timers.push(timer);if(timer()){jQuery.fx.start();}else{jQuery.timers.pop();}};jQuery.fx.interval=13;jQuery.fx.start=function(){if(!timerId){timerId=window.setInterval(jQuery.fx.tick,jQuery.fx.interval);}};jQuery.fx.stop=function(){window.clearInterval(timerId);timerId=null;};jQuery.fx.speeds={slow:600,fast:200,_default:400};jQuery.fn.delay=function(time,type){time=jQuery.fx?jQuery.fx.speeds[time]||time:time;type=type||"fx";return this.queue(type,function(next,hooks){var timeout=window.setTimeout(next,time);hooks.stop=function(){window.clearTimeout(timeout);};});};(function(){var input=document.createElement("input"),select=document.createElement("select"),opt=select.appendChild(document.createElement("option"));input.type="checkbox";support.checkOn=input.value!=="";support.optSelected=opt.selected;select.disabled=true;support.optDisabled=!opt.disabled;input=document.createElement("input");input.value="t";input.type="radio";support.radioValue=input.value==="t";})();var boolHook,attrHandle=jQuery.expr.attrHandle;jQuery.fn.extend({attr:function(name,value){return access(this,jQuery.attr,name,value,arguments.length>1);},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name);});}});jQuery.extend({attr:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(nType===3||nType===8||nType===2){return;}
if(typeof elem.getAttribute==="undefined"){return jQuery.prop(elem,name,value);}
if(nType!==1||!jQuery.isXMLDoc(elem)){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(jQuery.expr.match.bool.test(name)?boolHook:undefined);}
if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name);return;}
if(hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined){return ret;}
elem.setAttribute(name,value+"");return value;}
if(hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null){return ret;}
ret=jQuery.find.attr(elem,name);return ret==null?undefined:ret;},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&value==="radio"&&jQuery.nodeName(elem,"input")){var val=elem.value;elem.setAttribute("type",value);if(val){elem.value=val;}
return value;}}}},removeAttr:function(elem,value){var name,propName,i=0,attrNames=value&&value.match(rnotwhite);if(attrNames&&elem.nodeType===1){while((name=attrNames[i++])){propName=jQuery.propFix[name]||name;if(jQuery.expr.match.bool.test(name)){elem[propName]=false;}
elem.removeAttribute(name);}}}});boolHook={set:function(elem,value,name){if(value===false){jQuery.removeAttr(elem,name);}else{elem.setAttribute(name,name);}
return name;}};jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=function(elem,name,isXML){var ret,handle;if(!isXML){handle=attrHandle[name];attrHandle[name]=ret;ret=getter(elem,name,isXML)!=null?name.toLowerCase():null;attrHandle[name]=handle;}
return ret;};});var rfocusable=/^(?:input|select|textarea|button)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1);},removeProp:function(name){return this.each(function(){delete this[jQuery.propFix[name]||name];});}});jQuery.extend({prop:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(nType===3||nType===8||nType===2){return;}
if(nType!==1||!jQuery.isXMLDoc(elem)){name=jQuery.propFix[name]||name;hooks=jQuery.propHooks[name];}
if(value!==undefined){if(hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined){return ret;}
return(elem[name]=value);}
if(hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null){return ret;}
return elem[name];},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1;}}},propFix:{"for":"htmlFor","class":"className"}});if(!support.optSelected){jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;if(parent&&parent.parentNode){parent.parentNode.selectedIndex;}
return null;},set:function(elem){var parent=elem.parentNode;if(parent){parent.selectedIndex;if(parent.parentNode){parent.parentNode.selectedIndex;}}}};}
jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this;});var rclass=/[\t\r\n\f]/g;function getClass(elem){return elem.getAttribute&&elem.getAttribute("class")||"";}
jQuery.fn.extend({addClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).addClass(value.call(this,j,getClass(this)));});}
if(typeof value==="string"&&value){classes=value.match(rnotwhite)||[];while((elem=this[i++])){curValue=getClass(elem);cur=elem.nodeType===1&&(" "+curValue+" ").replace(rclass," ");if(cur){j=0;while((clazz=classes[j++])){if(cur.indexOf(" "+clazz+" ")<0){cur+=clazz+" ";}}
finalValue=jQuery.trim(cur);if(curValue!==finalValue){elem.setAttribute("class",finalValue);}}}}
return this;},removeClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).removeClass(value.call(this,j,getClass(this)));});}
if(!arguments.length){return this.attr("class","");}
if(typeof value==="string"&&value){classes=value.match(rnotwhite)||[];while((elem=this[i++])){curValue=getClass(elem);cur=elem.nodeType===1&&(" "+curValue+" ").replace(rclass," ");if(cur){j=0;while((clazz=classes[j++])){while(cur.indexOf(" "+clazz+" ")>-1){cur=cur.replace(" "+clazz+" "," ");}}
finalValue=jQuery.trim(cur);if(curValue!==finalValue){elem.setAttribute("class",finalValue);}}}}
return this;},toggleClass:function(value,stateVal){var type=typeof value;if(typeof stateVal==="boolean"&&type==="string"){return stateVal?this.addClass(value):this.removeClass(value);}
if(jQuery.isFunction(value)){return this.each(function(i){jQuery(this).toggleClass(value.call(this,i,getClass(this),stateVal),stateVal);});}
return this.each(function(){var className,i,self,classNames;if(type==="string"){i=0;self=jQuery(this);classNames=value.match(rnotwhite)||[];while((className=classNames[i++])){if(self.hasClass(className)){self.removeClass(className);}else{self.addClass(className);}}}else if(value===undefined||type==="boolean"){className=getClass(this);if(className){dataPriv.set(this,"__className__",className);}
if(this.setAttribute){this.setAttribute("class",className||value===false?"":dataPriv.get(this,"__className__")||"");}}});},hasClass:function(selector){var className,elem,i=0;className=" "+selector+" ";while((elem=this[i++])){if(elem.nodeType===1&&(" "+getClass(elem)+" ").replace(rclass," ").indexOf(className)>-1){return true;}}
return false;}});var rreturn=/\r/g,rspaces=/[\x20\t\r\n\f]+/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];if(!arguments.length){if(elem){hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()];if(hooks&&"get"in hooks&&(ret=hooks.get(elem,"value"))!==undefined){return ret;}
ret=elem.value;return typeof ret==="string"?ret.replace(rreturn,""):ret==null?"":ret;}
return;}
isFunction=jQuery.isFunction(value);return this.each(function(i){var val;if(this.nodeType!==1){return;}
if(isFunction){val=value.call(this,i,jQuery(this).val());}else{val=value;}
if(val==null){val="";}else if(typeof val==="number"){val+="";}else if(jQuery.isArray(val)){val=jQuery.map(val,function(value){return value==null?"":value+"";});}
hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()];if(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val;}});}});jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return val!=null?val:jQuery.trim(jQuery.text(elem)).replace(rspaces," ");}},select:{get:function(elem){var value,option,options=elem.options,index=elem.selectedIndex,one=elem.type==="select-one"||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;for(;i<max;i++){option=options[i];if((option.selected||i===index)&&(support.optDisabled?!option.disabled:option.getAttribute("disabled")===null)&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){value=jQuery(option).val();if(one){return value;}
values.push(value);}}
return values;},set:function(elem,value){var optionSet,option,options=elem.options,values=jQuery.makeArray(value),i=options.length;while(i--){option=options[i];if(option.selected=jQuery.inArray(jQuery.valHooks.option.get(option),values)>-1){optionSet=true;}}
if(!optionSet){elem.selectedIndex=-1;}
return values;}}}});jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value)){return(elem.checked=jQuery.inArray(jQuery(elem).val(),value)>-1);}}};if(!support.checkOn){jQuery.valHooks[this].get=function(elem){return elem.getAttribute("value")===null?"on":elem.value;};}});var rfocusMorph=/^(?:focusinfocus|focusoutblur)$/;jQuery.extend(jQuery.event,{trigger:function(event,data,elem,onlyHandlers){var i,cur,tmp,bubbleType,ontype,handle,special,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];cur=tmp=elem=elem||document;if(elem.nodeType===3||elem.nodeType===8){return;}
if(rfocusMorph.test(type+jQuery.event.triggered)){return;}
if(type.indexOf(".")>-1){namespaces=type.split(".");type=namespaces.shift();namespaces.sort();}
ontype=type.indexOf(":")<0&&"on"+type;event=event[jQuery.expando]?event:new jQuery.Event(type,typeof event==="object"&&event);event.isTrigger=onlyHandlers?2:3;event.namespace=namespaces.join(".");event.rnamespace=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;event.result=undefined;if(!event.target){event.target=elem;}
data=data==null?[event]:jQuery.makeArray(data,[event]);special=jQuery.event.special[type]||{};if(!onlyHandlers&&special.trigger&&special.trigger.apply(elem,data)===false){return;}
if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;if(!rfocusMorph.test(bubbleType+type)){cur=cur.parentNode;}
for(;cur;cur=cur.parentNode){eventPath.push(cur);tmp=cur;}
if(tmp===(elem.ownerDocument||document)){eventPath.push(tmp.defaultView||tmp.parentWindow||window);}}
i=0;while((cur=eventPath[i++])&&!event.isPropagationStopped()){event.type=i>1?bubbleType:special.bindType||type;handle=(dataPriv.get(cur,"events")||{})[event.type]&&dataPriv.get(cur,"handle");if(handle){handle.apply(cur,data);}
handle=ontype&&cur[ontype];if(handle&&handle.apply&&acceptData(cur)){event.result=handle.apply(cur,data);if(event.result===false){event.preventDefault();}}}
event.type=type;if(!onlyHandlers&&!event.isDefaultPrevented()){if((!special._default||special._default.apply(eventPath.pop(),data)===false)&&acceptData(elem)){if(ontype&&jQuery.isFunction(elem[type])&&!jQuery.isWindow(elem)){tmp=elem[ontype];if(tmp){elem[ontype]=null;}
jQuery.event.triggered=type;elem[type]();jQuery.event.triggered=undefined;if(tmp){elem[ontype]=tmp;}}}}
return event.result;},simulate:function(type,elem,event){var e=jQuery.extend(new jQuery.Event(),event,{type:type,isSimulated:true});jQuery.event.trigger(e,null,elem);if(e.isDefaultPrevented()){event.preventDefault();}}});jQuery.fn.extend({trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this);});},triggerHandler:function(type,data){var elem=this[0];if(elem){return jQuery.event.trigger(type,data,elem,true);}}});jQuery.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(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name);};});jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver);}});support.focusin="onfocusin"in window;if(!support.focusin){jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event));};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix);if(!attaches){doc.addEventListener(orig,handler,true);}
dataPriv.access(doc,fix,(attaches||0)+1);},teardown:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix)-1;if(!attaches){doc.removeEventListener(orig,handler,true);dataPriv.remove(doc,fix);}else{dataPriv.access(doc,fix,attaches);}}};});}
var location=window.location;var nonce=jQuery.now();var rquery=(/\?/);jQuery.parseJSON=function(data){return JSON.parse(data+"");};jQuery.parseXML=function(data){var xml;if(!data||typeof data!=="string"){return null;}
try{xml=(new window.DOMParser()).parseFromString(data,"text/xml");}catch(e){xml=undefined;}
if(!xml||xml.getElementsByTagName("parsererror").length){jQuery.error("Invalid XML: "+data);}
return xml;};var
rhash=/#.*$/,rts=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)$/mg,rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,prefilters={},transports={},allTypes="*/".concat("*"),originAnchor=document.createElement("a");originAnchor.href=location.href;function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*";}
var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnotwhite)||[];if(jQuery.isFunction(func)){while((dataType=dataTypes[i++])){if(dataType[0]==="+"){dataType=dataType.slice(1)||"*";(structure[dataType]=structure[dataType]||[]).unshift(func);}else{(structure[dataType]=structure[dataType]||[]).push(func);}}}};}
function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=(structure===transports);function inspect(dataType){var selected;inspected[dataType]=true;jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);if(typeof dataTypeOrTransport==="string"&&!seekingTransport&&!inspected[dataTypeOrTransport]){options.dataTypes.unshift(dataTypeOrTransport);inspect(dataTypeOrTransport);return false;}else if(seekingTransport){return!(selected=dataTypeOrTransport);}});return selected;}
return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*");}
function ajaxExtend(target,src){var key,deep,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src){if(src[key]!==undefined){(flatOptions[key]?target:(deep||(deep={})))[key]=src[key];}}
if(deep){jQuery.extend(true,target,deep);}
return target;}
function ajaxHandleResponses(s,jqXHR,responses){var ct,type,finalDataType,firstDataType,contents=s.contents,dataTypes=s.dataTypes;while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("Content-Type");}}
if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break;}}}
if(dataTypes[0]in responses){finalDataType=dataTypes[0];}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break;}
if(!firstDataType){firstDataType=type;}}
finalDataType=finalDataType||firstDataType;}
if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType);}
return responses[finalDataType];}}
function ajaxConvert(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv];}}
current=dataTypes.shift();while(current){if(s.responseFields[current]){jqXHR[s.responseFields[current]]=response;}
if(!prev&&isSuccess&&s.dataFilter){response=s.dataFilter(response,s.dataType);}
prev=current;current=dataTypes.shift();if(current){if(current==="*"){current=prev;}else if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2];}else if(converters[conv2]!==true){current=tmp[0];dataTypes.unshift(tmp[1]);}
break;}}}}
if(conv!==true){if(conv&&s.throws){response=conv(response);}else{try{response=conv(response);}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current};}}}}}}
return{state:"success",data:response};}
jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:location.href,type:"GET",isLocal:rlocalProtocol.test(location.protocol),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target);},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined;}
options=options||{};var transport,cacheURL,responseHeadersString,responseHeaders,timeoutTimer,urlAnchor,fireGlobals,i,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(state===2){if(!responseHeaders){responseHeaders={};while((match=rheaders.exec(responseHeadersString))){responseHeaders[match[1].toLowerCase()]=match[2];}}
match=responseHeaders[key.toLowerCase()];}
return match==null?null:match;},getAllResponseHeaders:function(){return state===2?responseHeadersString:null;},setRequestHeader:function(name,value){var lname=name.toLowerCase();if(!state){name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value;}
return this;},overrideMimeType:function(type){if(!state){s.mimeType=type;}
return this;},statusCode:function(map){var code;if(map){if(state<2){for(code in map){statusCode[code]=[statusCode[code],map[code]];}}else{jqXHR.always(map[jqXHR.status]);}}
return this;},abort:function(statusText){var finalText=statusText||strAbort;if(transport){transport.abort(finalText);}
done(0,finalText);return this;}};deferred.promise(jqXHR).complete=completeDeferred.add;jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;s.url=((url||s.url||location.href)+"").replace(rhash,"").replace(rprotocol,location.protocol+"//");s.type=options.method||options.type||s.method||s.type;s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(rnotwhite)||[""];if(s.crossDomain==null){urlAnchor=document.createElement("a");try{urlAnchor.href=s.url;urlAnchor.href=urlAnchor.href;s.crossDomain=originAnchor.protocol+"//"+originAnchor.host!==urlAnchor.protocol+"//"+urlAnchor.host;}catch(e){s.crossDomain=true;}}
if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional);}
inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR;}
fireGlobals=jQuery.event&&s.global;if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart");}
s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);cacheURL=s.url;if(!s.hasContent){if(s.data){cacheURL=(s.url+=(rquery.test(cacheURL)?"&":"?")+s.data);delete s.data;}
if(s.cache===false){s.url=rts.test(cacheURL)?cacheURL.replace(rts,"$1_="+nonce++):cacheURL+(rquery.test(cacheURL)?"&":"?")+"_="+nonce++;}}
if(s.ifModified){if(jQuery.lastModified[cacheURL]){jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL]);}
if(jQuery.etag[cacheURL]){jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL]);}}
if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType);}
jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+
(s.dataTypes[0]!=="*"?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i]);}
if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort();}
strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i]);}
transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport");}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s]);}
if(state===2){return jqXHR;}
if(s.async&&s.timeout>0){timeoutTimer=window.setTimeout(function(){jqXHR.abort("timeout");},s.timeout);}
try{state=1;transport.send(requestHeaders,done);}catch(e){if(state<2){done(-1,e);}else{throw e;}}}
function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return;}
state=2;if(timeoutTimer){window.clearTimeout(timeoutTimer);}
transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;isSuccess=status>=200&&status<300||status===304;if(responses){response=ajaxHandleResponses(s,jqXHR,responses);}
response=ajaxConvert(s,response,jqXHR,isSuccess);if(isSuccess){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[cacheURL]=modified;}
modified=jqXHR.getResponseHeader("etag");if(modified){jQuery.etag[cacheURL]=modified;}}
if(status===204||s.type==="HEAD"){statusText="nocontent";}else if(status===304){statusText="notmodified";}else{statusText=response.state;success=response.data;error=response.error;isSuccess=!error;}}else{error=statusText;if(status||!statusText){statusText="error";if(status<0){status=0;}}}
jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR]);}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error]);}
jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error]);}
completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!(--jQuery.active)){jQuery.event.trigger("ajaxStop");}}}
return jqXHR;},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},getScript:function(url,callback){return jQuery.get(url,undefined,callback,"script");}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){if(jQuery.isFunction(data)){type=type||callback;callback=data;data=undefined;}
return jQuery.ajax(jQuery.extend({url:url,type:method,dataType:type,data:data,success:callback},jQuery.isPlainObject(url)&&url));};});jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",async:false,global:false,"throws":true});};jQuery.fn.extend({wrapAll:function(html){var wrap;if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i));});}
if(this[0]){wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){wrap.insertBefore(this[0]);}
wrap.map(function(){var elem=this;while(elem.firstElementChild){elem=elem.firstElementChild;}
return elem;}).append(this);}
return this;},wrapInner:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapInner(html.call(this,i));});}
return this.each(function(){var self=jQuery(this),contents=self.contents();if(contents.length){contents.wrapAll(html);}else{self.append(html);}});},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html);});},unwrap:function(){return this.parent().each(function(){if(!jQuery.nodeName(this,"body")){jQuery(this).replaceWith(this.childNodes);}}).end();}});jQuery.expr.filters.hidden=function(elem){return!jQuery.expr.filters.visible(elem);};jQuery.expr.filters.visible=function(elem){return elem.offsetWidth>0||elem.offsetHeight>0||elem.getClientRects().length>0;};var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v);}else{buildParams(prefix+"["+(typeof v==="object"&&v!=null?i:"")+"]",v,traditional,add);}});}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add);}}else{add(prefix,obj);}}
jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():(value==null?"":value);s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value);};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional;}
if(jQuery.isArray(a)||(a.jquery&&!jQuery.isPlainObject(a))){jQuery.each(a,function(){add(this.name,this.value);});}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add);}}
return s.join("&").replace(r20,"+");};jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this;}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")};}):{name:elem.name,value:val.replace(rCRLF,"\r\n")};}).get();}});jQuery.ajaxSettings.xhr=function(){try{return new window.XMLHttpRequest();}catch(e){}};var xhrSuccessStatus={0:200,1223:204},xhrSupported=jQuery.ajaxSettings.xhr();support.cors=!!xhrSupported&&("withCredentials"in xhrSupported);support.ajax=xhrSupported=!!xhrSupported;jQuery.ajaxTransport(function(options){var callback,errorCallback;if(support.cors||xhrSupported&&!options.crossDomain){return{send:function(headers,complete){var i,xhr=options.xhr();xhr.open(options.type,options.url,options.async,options.username,options.password);if(options.xhrFields){for(i in options.xhrFields){xhr[i]=options.xhrFields[i];}}
if(options.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(options.mimeType);}
if(!options.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest";}
for(i in headers){xhr.setRequestHeader(i,headers[i]);}
callback=function(type){return function(){if(callback){callback=errorCallback=xhr.onload=xhr.onerror=xhr.onabort=xhr.onreadystatechange=null;if(type==="abort"){xhr.abort();}else if(type==="error"){if(typeof xhr.status!=="number"){complete(0,"error");}else{complete(xhr.status,xhr.statusText);}}else{complete(xhrSuccessStatus[xhr.status]||xhr.status,xhr.statusText,(xhr.responseType||"text")!=="text"||typeof xhr.responseText!=="string"?{binary:xhr.response}:{text:xhr.responseText},xhr.getAllResponseHeaders());}}};};xhr.onload=callback();errorCallback=xhr.onerror=callback("error");if(xhr.onabort!==undefined){xhr.onabort=errorCallback;}else{xhr.onreadystatechange=function(){if(xhr.readyState===4){window.setTimeout(function(){if(callback){errorCallback();}});}};}
callback=callback("abort");try{xhr.send(options.hasContent&&options.data||null);}catch(e){if(callback){throw e;}}},abort:function(){if(callback){callback();}}};}});jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, "+"application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(text){jQuery.globalEval(text);return text;}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false;}
if(s.crossDomain){s.type="GET";}});jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,callback;return{send:function(_,complete){script=jQuery("<script>").prop({charset:s.scriptCharset,src:s.url}).on("load error",callback=function(evt){script.remove();callback=null;if(evt){complete(evt.type==="error"?404:200,evt.type);}});document.head.appendChild(script[0]);},abort:function(){if(callback){callback();}}};}});var oldCallbacks=[],rjsonp=/(=)\?(?=&|$)|\?\?/;jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||(jQuery.expando+"_"+(nonce++));this[callback]=true;return callback;}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,jsonProp=s.jsonp!==false&&(rjsonp.test(s.url)?"url":typeof s.data==="string"&&(s.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&rjsonp.test(s.data)&&"data");if(jsonProp||s.dataTypes[0]==="jsonp"){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;if(jsonProp){s[jsonProp]=s[jsonProp].replace(rjsonp,"$1"+callbackName);}else if(s.jsonp!==false){s.url+=(rquery.test(s.url)?"&":"?")+s.jsonp+"="+callbackName;}
s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called");}
return responseContainer[0];};s.dataTypes[0]="json";overwritten=window[callbackName];window[callbackName]=function(){responseContainer=arguments;};jqXHR.always(function(){if(overwritten===undefined){jQuery(window).removeProp(callbackName);}else{window[callbackName]=overwritten;}
if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName);}
if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0]);}
responseContainer=overwritten=undefined;});return"script";}});jQuery.parseHTML=function(data,context,keepScripts){if(!data||typeof data!=="string"){return null;}
if(typeof context==="boolean"){keepScripts=context;context=false;}
context=context||document;var parsed=rsingleTag.exec(data),scripts=!keepScripts&&[];if(parsed){return[context.createElement(parsed[1])];}
parsed=buildFragment([data],context,scripts);if(scripts&&scripts.length){jQuery(scripts).remove();}
return jQuery.merge([],parsed.childNodes);};var _load=jQuery.fn.load;jQuery.fn.load=function(url,params,callback){if(typeof url!=="string"&&_load){return _load.apply(this,arguments);}
var selector,type,response,self=this,off=url.indexOf(" ");if(off>-1){selector=jQuery.trim(url.slice(off));url=url.slice(0,off);}
if(jQuery.isFunction(params)){callback=params;params=undefined;}else if(params&&typeof params==="object"){type="POST";}
if(self.length>0){jQuery.ajax({url:url,type:type||"GET",dataType:"html",data:params}).done(function(responseText){response=arguments;self.html(selector?jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector):responseText);}).always(callback&&function(jqXHR,status){self.each(function(){callback.apply(this,response||[jqXHR.responseText,status,jqXHR]);});});}
return this;};jQuery.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(i,type){jQuery.fn[type]=function(fn){return this.on(type,fn);};});jQuery.expr.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem;}).length;};function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9&&elem.defaultView;}
jQuery.offset={setOffset:function(elem,options,i){var curPosition,curLeft,curCSSTop,curTop,curOffset,curCSSLeft,calculatePosition,position=jQuery.css(elem,"position"),curElem=jQuery(elem),props={};if(position==="static"){elem.style.position="relative";}
curOffset=curElem.offset();curCSSTop=jQuery.css(elem,"top");curCSSLeft=jQuery.css(elem,"left");calculatePosition=(position==="absolute"||position==="fixed")&&(curCSSTop+curCSSLeft).indexOf("auto")>-1;if(calculatePosition){curPosition=curElem.position();curTop=curPosition.top;curLeft=curPosition.left;}else{curTop=parseFloat(curCSSTop)||0;curLeft=parseFloat(curCSSLeft)||0;}
if(jQuery.isFunction(options)){options=options.call(elem,i,jQuery.extend({},curOffset));}
if(options.top!=null){props.top=(options.top-curOffset.top)+curTop;}
if(options.left!=null){props.left=(options.left-curOffset.left)+curLeft;}
if("using"in options){options.using.call(elem,props);}else{curElem.css(props);}}};jQuery.fn.extend({offset:function(options){if(arguments.length){return options===undefined?this:this.each(function(i){jQuery.offset.setOffset(this,options,i);});}
var docElem,win,elem=this[0],box={top:0,left:0},doc=elem&&elem.ownerDocument;if(!doc){return;}
docElem=doc.documentElement;if(!jQuery.contains(docElem,elem)){return box;}
box=elem.getBoundingClientRect();win=getWindow(doc);return{top:box.top+win.pageYOffset-docElem.clientTop,left:box.left+win.pageXOffset-docElem.clientLeft};},position:function(){if(!this[0]){return;}
var offsetParent,offset,elem=this[0],parentOffset={top:0,left:0};if(jQuery.css(elem,"position")==="fixed"){offset=elem.getBoundingClientRect();}else{offsetParent=this.offsetParent();offset=this.offset();if(!jQuery.nodeName(offsetParent[0],"html")){parentOffset=offsetParent.offset();}
parentOffset.top+=jQuery.css(offsetParent[0],"borderTopWidth",true);parentOffset.left+=jQuery.css(offsetParent[0],"borderLeftWidth",true);}
return{top:offset.top-parentOffset.top-jQuery.css(elem,"marginTop",true),left:offset.left-parentOffset.left-jQuery.css(elem,"marginLeft",true)};},offsetParent:function(){return this.map(function(){var offsetParent=this.offsetParent;while(offsetParent&&jQuery.css(offsetParent,"position")==="static"){offsetParent=offsetParent.offsetParent;}
return offsetParent||documentElement;});}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top="pageYOffset"===prop;jQuery.fn[method]=function(val){return access(this,function(elem,method,val){var win=getWindow(elem);if(val===undefined){return win?win[prop]:elem[method];}
if(win){win.scrollTo(!top?val:win.pageXOffset,top?val:win.pageYOffset);}else{elem[method]=val;}},method,val,arguments.length);};});jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]=addGetHookIf(support.pixelPosition,function(elem,computed){if(computed){computed=curCSS(elem,prop);return rnumnonpx.test(computed)?jQuery(elem).position()[prop]+"px":computed;}});});jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name];}
if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name]);}
return value===undefined?jQuery.css(elem,type,extra):jQuery.style(elem,type,value,extra);},type,chainable?margin:undefined,chainable,null);};});});jQuery.fn.extend({bind:function(types,data,fn){return this.on(types,null,data,fn);},unbind:function(types,fn){return this.off(types,null,fn);},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn);},undelegate:function(selector,types,fn){return arguments.length===1?this.off(selector,"**"):this.off(types,selector||"**",fn);},size:function(){return this.length;}});jQuery.fn.andSelf=jQuery.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return jQuery;});}
var
_jQuery=window.jQuery,_$=window.$;jQuery.noConflict=function(deep){if(window.$===jQuery){window.$=_$;}
if(deep&&window.jQuery===jQuery){window.jQuery=_jQuery;}
return jQuery;};if(!noGlobal){window.jQuery=window.$=jQuery;}
return jQuery;}));
/* end ./contrib/js/contrib/jquery.js */
/* begin ./contrib/js/entry.js */
onready_callbacks=[];function onready(fnc){onready_callbacks.push(fnc);}
function ready(prefix){configRoot=prefix||"/";for(var i=0;i<onready_callbacks.length;i++){onready_callbacks[i]();}}
/* end ./contrib/js/entry.js */
/* begin ./contrib/js/nntpchan/api.js */
function nntpchan_apicall(url,handler,err_handler,method,data){var ajax=new XMLHttpRequest();ajax.onreadystatechange=function(){if(ajax.readyState==XMLHttpRequest.DONE){var status=ajax.status;var j=null;if(status==200||status==201){try{j=JSON.parse(ajax.responseText);}catch(e){}}else if(status==410){if(err_handler){err_handler("cannot fetch post: api disabled");}
return;}
handler(j);}};var meth=method||"GET";ajax.open(meth,url);if(data)
ajax.send(data);else
ajax.send();}
function nntpchan_buildpost(parent,j){var post=document.createElement("div");if(j){post.innerHTML=j.PostMarkup;inject_hover_for_element(post);}else{post.setAttribute("class","notfound post");post.appendChild(document.createTextNode("post not found"));}
parent.appendChild(post);}
/* end ./contrib/js/nntpchan/api.js */
/* begin ./contrib/js/nntpchan/banner.js */
var banner_count=8;function nntpchan_inject_banners(elem,prefix){var n=Math.floor(Math.random()*banner_count);var banner=prefix+"static/banner_"+n+".jpg";var e=document.createElement("img");e.src=banner;e.id="nntpchan_banner";e.height="150";e.width="300";elem.appendChild(e);}
/* end ./contrib/js/nntpchan/banner.js */
/* begin ./contrib/js/nntpchan/captcha-reload.js */
function setSrcQuery(e,q){var src=e.src;var p=src.indexOf('?');if(p>=0){src=src.substr(0,p);}
e.src=src+"?"+q}
function reload(el){setSrcQuery(el,"reload="+(new Date()).getTime());return false;}
onready(function(){var e=document.getElementById("captcha_img");if(e){e.onclick=function(){reload(e);};}});
/* end ./contrib/js/nntpchan/captcha-reload.js */
/* begin ./contrib/js/nntpchan/expand-image.js */
function filenameIsImage(fname){return/\.(gif|jpeg|jpg|png|webp)/.test(fname.toLowerCase());}
function setupInlineImage(thumb,url){if(thumb.inlineIsSetUp)return;thumb.inlineIsSetUp=true;var img=thumb.querySelector("img.thumbnail");var expanded=false;var oldurl=img.src;thumb.onclick=function(){if(expanded){img.setAttribute("class","thumbnail");img.src=oldurl;expanded=false;}else{img.setAttribute("class","expanded-thumbnail");img.src=url;expanded=true;}
return false;}}
function setupInlineImageIn(element){var thumbs=element.querySelectorAll("a.file");for(var i=0;i<thumbs.length;i++){var url=thumbs[i].href;if(filenameIsImage(url)){console.log("matched url",url);setupInlineImage(thumbs[i],url);}}}
onready(function(){setupInlineImageIn(document);if(window.MutationObserver){var observer=new MutationObserver(function(mutations){for(var i=0;i<mutations.length;i++){var additions=mutations[i].addedNodes;if(additions==null)continue;for(var j=0;j<additions.length;j++){var node=additions[j];if(node.nodeType==1){setupInlineImageIn(node);}}}});observer.observe(document.body,{childList:true,subtree:true});}});
/* end ./contrib/js/nntpchan/expand-image.js */
/* begin ./contrib/js/nntpchan/expand-video.js */
var configRoot="";if(typeof _=='undefined'){var _=function(a){return a;};}
function setupVideo(thumb,url){if(thumb.videoAlreadySetUp)return;thumb.videoAlreadySetUp=true;var video=null;var videoContainer,videoHide;var expanded=false;var hovering=false;var loop=true;var loopControls=[document.createElement("span"),document.createElement("span")];var fileInfo=thumb.parentNode.querySelector(".fileinfo");var mouseDown=false;function unexpand(){if(expanded){expanded=false;if(video.pause)video.pause();videoContainer.style.display="none";thumb.style.display="inline";video.style.maxWidth="inherit";video.style.maxHeight="inherit";}}
function unhover(){if(hovering){hovering=false;if(video.pause)video.pause();videoContainer.style.display="none";video.style.maxWidth="inherit";video.style.maxHeight="inherit";}}
function getVideo(){if(video==null){video=document.createElement("video");video.src=url;video.loop=loop;video.innerText=_("Your browser does not support HTML5 video.");videoHide=document.createElement("img");videoHide.src=configRoot+"static/collapse.gif";videoHide.alt="[ - ]";videoHide.title="Collapse video";videoHide.style.marginLeft="-15px";videoHide.style.cssFloat="left";videoHide.addEventListener("click",unexpand,false);videoContainer=document.createElement("div");videoContainer.style.paddingLeft="15px";videoContainer.style.display="none";videoContainer.appendChild(videoHide);videoContainer.appendChild(video);thumb.parentNode.insertBefore(videoContainer,thumb.nextSibling);video.addEventListener("mousedown",function(e){if(e.button==0)mouseDown=true;},false);video.addEventListener("mouseup",function(e){if(e.button==0)mouseDown=false;},false);video.addEventListener("mouseenter",function(e){mouseDown=false;},false);video.addEventListener("mouseout",function(e){if(mouseDown&&e.clientX-video.getBoundingClientRect().left<=0){unexpand();}
mouseDown=false;},false);}}
thumb.addEventListener("click",function(e){if(!e.shiftKey&&!e.ctrlKey&&!e.altKey&&!e.metaKey){getVideo();expanded=true;hovering=false;video.style.position="static";video.style.pointerEvents="inherit";video.style.display="inline";videoHide.style.display="inline";videoContainer.style.display="block";videoContainer.style.position="static";video.parentNode.parentNode.removeAttribute('style');thumb.style.display="none";video.controls=true;if(video.readyState==0){video.addEventListener("loadedmetadata",expand2,false);}else{setTimeout(expand2,0);}
video.play();e.preventDefault();}},false);function expand2(){video.style.maxWidth="100%";video.style.maxHeight=window.innerHeight+"px";var bottom=video.getBoundingClientRect().bottom;if(bottom>window.innerHeight){window.scrollBy(0,bottom-window.innerHeight);}}
thumb.addEventListener("mouseover",function(e){if(false){getVideo();expanded=false;hovering=true;var docRight=document.documentElement.getBoundingClientRect().right;var thumbRight=thumb.querySelector("img, video").getBoundingClientRect().right;var maxWidth=docRight-thumbRight-20;if(maxWidth<250)maxWidth=250;video.style.position="fixed";video.style.right="0px";video.style.top="0px";var docRight=document.documentElement.getBoundingClientRect().right;var thumbRight=thumb.querySelector("img, video").getBoundingClientRect().right;video.style.maxWidth=maxWidth+"px";video.style.maxHeight="100%";video.style.pointerEvents="none";video.style.display="inline";videoHide.style.display="none";videoContainer.style.display="inline";videoContainer.style.position="fixed";video.controls=false;video.play();}},false);thumb.addEventListener("mouseout",unhover,false);thumb.addEventListener("wheel",function(e){if(true){if(e.deltaY>0)volume-=0.1;if(e.deltaY<0)volume+=0.1;if(volume<0)volume=0;if(volume>1)volume=1;if(video!=null){video.muted=(volume==0);video.volume=volume;}
e.preventDefault();}},false);}
function setupVideosIn(element){var vidRegex=/(\.webm)|(\.mp4)|(\.mkv)|(\.avi)|(\.m4v)|(\.ogv)|(\.flv)/;var thumbs=element.querySelectorAll("a.file");for(var i=0;i<thumbs.length;i++){if(vidRegex.test(thumbs[i].pathname)){setupVideo(thumbs[i],thumbs[i].href);}else{var url=thumbs[i].href;if(vidRegex.test(url))setupVideo(thumbs[i],url);}}}
onready(function(){if(typeof settingsMenu!="undefined"&&typeof Options=="undefined")
document.body.insertBefore(settingsMenu,document.getElementsByTagName("hr")[0]);setupVideosIn(document);if(window.MutationObserver){var observer=new MutationObserver(function(mutations){for(var i=0;i<mutations.length;i++){var additions=mutations[i].addedNodes;if(additions==null)continue;for(var j=0;j<additions.length;j++){var node=additions[j];if(node.nodeType==1){setupVideosIn(node);}}}});observer.observe(document.body,{childList:true,subtree:true});}});
/* end ./contrib/js/nntpchan/expand-video.js */
/* begin ./contrib/js/nntpchan/hide-post.js */
function get_hidden_posts(){var st=get_storage();var prefix="nntpchan_hide_post_";return{all:function(){var msgids=[];for(var k in st){if(k.indexOf(prefix)==0){var m=k.substring(prefix.length);msgids.push(m);}}
return msgids;},add:function(msg){st[prefix+msg]="post";},del:function(msg){st.removeItem(prefix+msg);}}}
function postIsOP(elem){var ds=elem.dataset;return ds&&ds.rootmsgid==ds.msgid;}
function _hide_elem(elem,fade){if(!fade){if(elem.style){elem.style.display="none";}else{elem.style={display:"none"};}
elem.dataset.userhide="yes";}else{$(elem).fadeOut(400,function(){_hide_elem(elem);});}}
function _unhide_elem(elem){$(elem).fadeIn();elem.dataset.userhide="no";}
function _elemIsHidden(elem){return elem.dataset&&elem.dataset.userhide=="yes";}
function hidepost(elem,nofade){console.log("hidepost("+elem.dataset.msgid+")");var posts=get_hidden_posts();if(posts){posts.add(elem.dataset.msgidhash);}
if(postIsOP(elem)){var thread=document.getElementById("thread_"+elem.dataset.rootmsgidhash);if(thread){var e=thread.getElementsByClassName("post");for(var idx=0;idx<e.length;idx++){if(e[idx].dataset.msgid==elem.dataset.msgid)continue;hidepost(e[idx]);}}}
var es=elem.getElementsByClassName("attachments");for(var idx=0;idx<es.length;idx++){_hide_elem(es[idx],!nofade);}
es=elem.getElementsByClassName("post_body");for(var idx=0;idx<es.length;idx++){_hide_elem(es[idx],!nofade);}
es=elem.getElementsByClassName("postheader");for(var idx=0;idx<es.length;idx++){_hide_elem(es[idx],!nofade);}
elem.dataset.userhide="yes";elem.setHideLabel("[show]");}
function unhidepost(elem){console.log("unhidepost("+elem.dataset.msgid+")");var posts=get_hidden_posts();if(posts){posts.del(elem.dataset.msgidhash);}
if(postIsOP(elem)){var thread=document.getElementById("thread_"+elem.dataset.rootmsgidhash);if(thread){var e=thread.getElementsByClassName("post");for(var idx=0;idx<e.length;idx++){if(e[idx].dataset.msgid==elem.dataset.msgid)continue;unhidepost(e[idx]);}}}
var es=elem.getElementsByClassName("attachments");for(var idx=0;idx<es.length;idx++){_unhide_elem(es[idx]);}
es=elem.getElementsByClassName("post_body");for(var idx=0;idx<es.length;idx++){_unhide_elem(es[idx]);}
es=elem.getElementsByClassName("postheader");for(var idx=0;idx<es.length;idx++){_unhide_elem(es[idx]);}
elem.dataset.userhide="no";elem.setHideLabel("[hide]");}
function hideposts(check_func){var es=document.getElementsByClassName("post");for(var idx=0;idx<es.length;idx++){var elem=es[idx];if(check_func&&elem&&check_func(elem)){hidepost(elem);}}}
function unhideall(check_func){var es=document.getElementsByClassName("post");for(var idx=0;idx<es.length;idx++){var elem=es[idx];if(!check_func){unhide(elem);}
else if(check_func(elem)){unhide(elem);}}}
onready(function(){var posts=document.getElementsByClassName("post");for(var idx=0;idx<posts.length;idx++){console.log("inject hide: "+posts[idx].dataset.msgid);var inject=function(elem){var hider=document.createElement("a");hider.setAttribute("class","hider");elem.setHideLabel=function(txt){var e_hider=hider;e_hider.innerHTML=txt;}
elem.hidepost=function(){var e_self=elem;var e_hider=hider;hidepost(e_self);}
elem.unhidepost=function(){var e_self=elem;var e_hider=hider;unhidepost(e_self);}
elem.isHiding=function(){var e_self=elem;return _elemIsHidden(e_self);}
hider.appendChild(document.createTextNode("[hide]"));hider.onclick=function(){var e_self=elem;if(e_self.isHiding()){e_self.unhidepost();}else{e_self.hidepost();}}
elem.appendChild(hider);};inject(posts[idx]);}
var posts=get_hidden_posts();if(posts){var all=posts.all();for(var idx=0;idx<all.length;idx++){var id=all[idx];var elem=document.getElementById(id);if(elem)
hidepost(elem,true);}}});
/* end ./contrib/js/nntpchan/hide-post.js */
/* begin ./contrib/js/nntpchan/img-hide.js */
function inject_imghide(elem){elem.onerror=function(){$(elem).fadeOut(200,function(){elem.remove();});}}
onready(function(){var imgs=document.getElementsByClassName("thumbnail");for(var idx=0;idx<imgs.length;idx++){var elem=imgs[idx];inject_imghide(elem);}});
/* end ./contrib/js/nntpchan/img-hide.js */
/* begin ./contrib/js/nntpchan/livechan.js */
function buildCaptcha(domElem,prefix){var captcha_widget=document.createElement("div");captcha_widget.className="livechan_captcha_inner";var outer=document.createElement("div");outer.className="livechan_captcha";var text=document.createElement("div");text.textContent="solve the captcha";captcha_widget.appendChild(text);var captcha_image=document.createElement("img");captcha_image.className="livechan_captcha_image";var div=document.createElement("div");div.appendChild(captcha_image);captcha_widget.appendChild(div);var captcha_entry=document.createElement("input");captcha_entry.className="livechan_captcha_input";var div=document.createElement("div");div.appendChild(captcha_entry);captcha_widget.appendChild(div);var captcha_submit=document.createElement("input");captcha_submit.setAttribute("type","button");captcha_submit.value="solve";var div=document.createElement("div");div.appendChild(captcha_submit);captcha_widget.appendChild(div);outer.appendChild(captcha_widget);domElem.appendChild(outer);return{widget:outer,button:captcha_submit,image:captcha_image,entry:captcha_entry,prefix:prefix,}}
function Captcha(domElem,options,callback){if(options){this.options=options;}else{this.options={};}
this.prefix=options.prefix||"/";this.widget=buildCaptcha(domElem,this.prefix);var self=this;this.widget.button.addEventListener("click",function(){self.process(callback);});}
Captcha.prototype.load=function(){var self=this;var xhr=new XMLHttpRequest();var url=location.protocol+"//"+location.host+this.prefix;xhr.open('get',url+"captcha/new");xhr.onreadystatechange=function(){if(xhr.readyState==4&&xhr.status==200){var jdata=JSON.parse(xhr.responseText);if(jdata){self.setCaptchaId(jdata);}}}
xhr.send();}
Captcha.prototype.setCaptchaId=function(data){this.captcha_id=data.id;this.setImageUrl(data.url);this.show();}
Captcha.prototype.setImageUrl=function(url){this.widget.image.setAttribute("src",url);}
Captcha.prototype.process=function(callback){console.log("process");console.log(this);if(this.captcha_id){var solution=this.widget.entry.value;var self=this;callback(this.captcha_id,solution,function(solved){if(solved){self.hide();}else{self.load();}});}else{self.load();}}
Captcha.prototype.show=function(){console.log("show captcha");var widget=this.widget.widget;if(widget.style){widget.style.zIndex=5;widget.style.visibility="visible";}else{widget.style={zIndex:5,visibility:"visible"};}}
Captcha.prototype.hide=function(){console.log("hide captcha");var widget=this.widget.widget;if(widget.style){widget.style.zIndex=-1;widget.style.visibility="hidden";}else{widget.style={zIndex:-1,visibility:"hidden"};}}
function buildLogin(domElem){var widget=document.createElement("div");widget.className="livechan_login_widget";widget.style.zIndex=-1;var mod_div=document.createElement("div");mod_div.className="livechan_login";var mod_form=document.createElement("form");var mod_username=document.createElement("input");mod_form.appendChild(mod_username);mod_username.className="livechan_login_username";var mod_password=document.createElement("input");mod_password.className="livechan_login_password";mod_password.setAttribute("type","password");mod_form.appendChild(mod_password);var mod_submit=document.createElement("input");mod_password.className="livechan_login_submit";mod_submit.setAttribute("type","submit");mod_submit.setAttribute("value","login");mod_form.appendChild(mod_submit);mod_div.appendChild(mod_form);widget.appendChild(mod_div);domElem.appendChild(widget);return{widget:widget,mod:{form:mod_form,username:mod_username,password:mod_password,submit:mod_submit}}}
function Login(domElem){this._login=buildLogin(domElem);}
Login.prototype.show=function(){var self=this;self._login.widget.style.zIndex=5;console.log("show login widget");}
function LivechanNavbar(domElem){this.navbar=document.createElement("div");this.navbar.className='livechan_navbar';var container=document.createElement("div");var channelLabel=document.createElement("span");channelLabel.className='livechan_navbar_channel_label';this.channel=channelLabel;this.mod=document.createElement("span");this.mod.className='livechan_navbar_mod_indicator_inactive';this.mod.textContent="Anon";this.status=document.createElement("span");this.status.className='livechan_navbar_status';container.appendChild(this.mod);container.appendChild(this.channel);container.appendChild(this.status);this.navbar.appendChild(container);domElem.appendChild(this.navbar);}
LivechanNavbar.prototype.onLivechanEvent=function(evstr){if(evstr==="login:mod"){this.mod.className="livechan_mod_indicator_active";this.mod.textContent="Moderator";}else if(evstr==="login:admin"){this.mod.className="livechan_mod_indicator_admin";this.mod.textContent="Admin";}}
LivechanNavbar.prototype.onLivechanNotify=function(evstr){}
LivechanNavbar.prototype.updateUsers=function(count){this.updateStatus("Online: "+count);}
LivechanNavbar.prototype.updateStatus=function(str){this.status.textContent=str;}
LivechanNavbar.prototype.setChannel=function(str){this.channel.textContent=str;}
var modCommands=[[/l(login)? (.*)/,function(m){var chat=this;chat.modLogin(m[2]);},"login as user","/l user:password",],[/cp (\d+)/,function(m){var chat=this;chat.modAction(3,4,m[1],"CP",-1);},"handle illegal content","/cp postnum",],[/cnuke (\d+) (.*)/,function(m){var chat=this;chat.modAction(2,4,m[1],m[2],-1);},"channel level ban+nuke","/cnuke postnum reason goes here",],[/purge (\d+) (.*)/,function(m){var chat=this;chat.modAction(2,9,m[1],m[2],-1);},"channel level ban+nuke","/cnuke postnum reason goes here",],[/gnuke (\d+) (.*)/,function(m){var chat=this;chat.modAction(3,4,m[1],m[2],-1);},"global ban+nuke","/gnuke postnum reason goes here",],[/gban (\d+) (.*)/,function(m){var chat=this;chat.modAction(3,3,m[1],m[2],-1);},"global ban (no nuke)","/gban postnum reason goes here",],[/cban (\d+) (.*)/,function(m){var chat=this;chat.modAction(2,3,m[1],m[2],-1);},"channel level ban (no nuke)","/cban postnum reason goes here",],[/dpost (\d+)/,function(m){var chat=this;chat.modAction(1,2,m[1]);},"delete post and file","/dpost postnum",],[/dfile (\d+)/,function(m){var chat=this;chat.modAction(1,1,m[1]);},"delete just file","/dpost postnum",]]
function buildNotifyPane(domElem){var pane=document.createElement("div");pane.className="livechan_notify_pane";domElem.appendChild(pane);return pane;}
function LivechanNotify(domElem){this.pane=buildNotifyPane(domElem);}
LivechanNotify.prototype.inform=function(str){var elem=document.createElement("div");elem.className="livechan_notify_node";elem.textContent=Date.now()+": "+str;this.pane.appendChild(elem);this.rollover();}
LivechanNotify.prototype.rollover=function(){while(this.pane.childNodes.length>this.scrollback){this.pane.childNodes.removeChild(this.pane.childNodes[0]);}}
function buildChat(chat,domElem,channel){channel=channel.toLowerCase();var navbar=new LivechanNavbar(domElem);var notify=new LivechanNotify(domElem);var output=document.createElement('div');output.className='livechan_chat_output';var input_left=document.createElement('div');input_left.className='livechan_chat_input_left';var input=document.createElement('form');input.className='livechan_chat_input';var name=document.createElement('input');name.className='livechan_chat_input_name';name.setAttribute('placeholder','Anonymous');var file=document.createElement('input');file.className='livechan_chat_input_file';file.setAttribute('type','file');file.setAttribute('value','upload');file.setAttribute('id',channel+'_input_file');var messageDiv=document.createElement('div');messageDiv.className='livechan_chat_input_message_div';var message=document.createElement('textarea');message.className='livechan_chat_input_message';var submit=document.createElement('input');submit.className='livechan_chat_input_submit';submit.setAttribute('type','submit');submit.setAttribute('value','send');var convobar=new ConvoBar(chat,domElem);input_left.appendChild(name);input_left.appendChild(convobar.subject);input_left.appendChild(file);input.appendChild(input_left);messageDiv.appendChild(message);input.appendChild(messageDiv);input.appendChild(submit);domElem.appendChild(output);domElem.appendChild(input);return{convobar:convobar,notify:notify,navbar:navbar,output:output,input:{subject:convobar.subject,form:input,message:message,name:name,submit:submit,file:file}};}
function Connection(chat,ws,url){this.ws=ws;this.chat=chat;this.url=url;this.ws.onmessage=function(ev){chat.handleData(JSON.parse(ev.data));}
this.ws.onclose=function(){self.ws=null;}
var self=this;setInterval(function(){if(self.ws==null){initWebSocket(self.chat,self.url,self);}},5000);}
Connection.prototype.ban=function(reason){if(this.ws){this.ws.close();this.ws.close=null;alert("You have been banned for the following reason: "+reason);}}
Connection.prototype.send=function(obj){this.sendBinary(JSON.stringify(obj));}
Connection.prototype.sendBinary=function(obj){if(this.ws){this.ws.send(obj);}}
Connection.prototype.onclose=function(callback){if(this.ws)
this.ws.onclose=callback;}
function initWebSocket(chat,url,connection){var ws=null;if(window['WebSocket']){try{ws=new WebSocket(url);}catch(ex){ws=null;}}
if(ws){ws.onclose=function(){if(connection){connection.ws=null;}};if(connection){connection.ws=ws;connection.ws.onmessage=function(ev){chat.handleData(JSON.parse(ev.data));}
chat.clear();chat.handleMessage({Type:"post",PostMessage:"reconnecting..."});return connection;}else{return new Connection(chat,ws,url);}}}
function parse(text,rules,end_tag){var output=document.createElement('div');var position=0;var end_matched=false;if(end_tag){var end_handler=function(m){end_matched=true;}
rules=[[end_tag,end_handler]].concat(rules);}
do{var match=null;var match_pos=text.length;var handler=null;for(var i=0;i<rules.length;i++){rules[i][0].lastIndex=position;var result=rules[i][0].exec(text);if(result!==null&&position<=result.index&&result.index<match_pos){match=result;match_pos=result.index;handler=rules[i][1];}}
var unmatched_text=text.substring(position,match_pos);output.appendChild(document.createTextNode(unmatched_text));position=match_pos;if(match!==null){position+=match[0].length;output.appendChild(handler(match));}}while(match!==null&&!end_matched);return output;}
var messageRules=[[/>>([0-9a-f]+)/g,function(m){var out=document.createElement('span');out.className='livechan_internallink';out.addEventListener('click',function(){var selected=document.getElementById('livechan_chat_'+m[1]);console.log(selected.convo);selected.select();selected.scrollIntoView(true);});out.appendChild(document.createTextNode('>>'+m[1]));return out;}],[/^>.+/mg,function(m){var out=document.createElement('span');out.className='livechan_greentext';out.appendChild(document.createTextNode(m));return out;}],[/\[code\]\n?([\s\S]+)\[\/code\]/g,function(m){var out;if(m.length>=2&&m[1].trim!==''){out=document.createElement('pre');out.textContent=m[1];}else{out=document.createTextNode(m);}
return out;}],[/\[b\]\n?([\s\S]+)\[\/b\]/g,function(m){var out;if(m.length>=2&&m[1].trim!==''){out=document.createElement('span');out.className='livechan_boldtext';out.textContent=m[1];}else{out=document.createTextNode(m);}
return out;}],[/\[spoiler\]\n?([\s\S]+)\[\/spoiler\]/g,function(m){var out;if(m.length>=2&&m[1].trim!==''){out=document.createElement('span');out.className='livechan_spoiler';out.textContent=m[1];}else{out=document.createTextNode(m);}
return out;}],[/\r?\n/g,function(m){return document.createElement('br');}],[/==(.*)==/g,function(m){var out;out=document.createElement("span");out.className="livechan_redtext";out.textContent=m[1];return out;}],[/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/g,function(m){var out=document.createElement("a");out.href=m[1];out.textContent=m[1];return out;}],]
function buildConvoBar(domElem){var elem=document.createElement("div");elem.className="livechan_convobar_root";var subject=document.createElement("input");subject.className="livechan_chat_input_convo";elem.appendChild(subject);domElem.appendChild(elem);return{subject:subject,widget:elem,}}
function ConvoBar(chat,domElem){this.parent=chat;this.holder={};this.domElem=domElem;var convo=buildConvoBar(domElem);this.widget=convo.widget;this.subject=convo.subject;this.active=null;this._num=0;}
ConvoBar.prototype.count=function(){return this._num;}
ConvoBar.prototype.removeConvo=function(msgid){var self=this;console.log("remove "+msgid);var c=self.holder[msgid];if(c){var e=document.getElementById("livechan_convobar_item_"+c.id);if(e)e.remove();for(var idx=0;idx<c.posts.length;idx++){var id="livechan_chat_"+c.posts[idx].HashShort;var child=document.getElementById(id);if(child)child.remove();}
delete self.holder[msgid];self._num--;}}
ConvoBar.prototype.update=function(msgid,data){var self=this;if(!self.holder[msgid]){self.registerConvo(msgid,data);}
var convoId=self.holder[msgid].id;var convoElem=document.getElementById("livechan_convobar_item_"+convoId);var convoParent=convoElem.parentElement;if(convoParent.children.length>1){convoParent.removeChild(convoElem);convoParent.insertBefore(convoElem,convoParent.childNodes[0]);}
self.holder[msgid].posts.push(data);var scrollback=self.parent.options.scrollback||30;while(self.holder[msgid].posts.length>scrollback){var child_data=self.holder[msgid].posts.shift();var child=document.getElementById("livechan_chat_"+child_data.ShortHash);if(child){child.remove();}}
while(self.count()>10){var minid=-1;var minmsgid=null;for(var i in self.holder){if(minid==-1||self.holder[i].id<minid){minid=self.holder[i].id;minmsgid=i;}}
if(minmsgid)
self.removeConvo(minmsgid);}}
ConvoBar.prototype.registerConvo=function(msgid,data){var self=this;var max_id=0;for(c in self.holder){var id=self.holder[c].id;if(id>max_id){max_id=id}}
self.holder[msgid]={subject:data.PostSubject,msgid:data.Message_id,id:max_id+1,posts:[],group:data.Newsgroup,ShortHash:data.ShortHash,select:function(){console.log("selected convo "+msgid);if(self.active!==msgid){self.show(msgid);}},}
var elem=document.createElement("div");elem.className="livechan_convobar_item";elem.setAttribute("id","livechan_convobar_item_"+self.holder[msgid].id);var link=document.createElement("span");elem.addEventListener("click",function(){self.show(msgid);});link.appendChild(document.createTextNode(data.PostSubject));elem.appendChild(link);if(self.widget.children.length>0){self.widget.insertBefore(elem,self.widget.childNodes[0]);}else{self.widget.appendChild(elem);}
self._num++;}
ConvoBar.prototype.show=function(msgid){var self=this;var sheet=null;for(var idx=0;idx<document.styleSheets.length;idx++){var s=document.styleSheets[idx];if(s.ownerNode&&s.ownerNode.id==="convo_filter"){sheet=s;break;}}
var rules=null;if(sheet.rules){rules=sheet.rules;}else{rules=sheet.cssRules;}
while(rules.length>0){if(sheet.deleteRule){sheet.deleteRule(0);}else if(sheet.removeRule){sheet.removeRule(0);}else{break;}}
if(msgid===self.active){if(sheet.insertRule){sheet.insertRule(".livechan_chat_output_chat { display: block; }",0);}else if(sheet.addRule){sheet.addRule(".livechan_chat_output_chat","display: block");}
var convoId=self.holder[self.active].id;var itemElem=document.getElementById("livechan_convobar_item_"+convoId);itemElem.style.background=null;self.active=null;}else{if(self.active){var convoId=self.holder[self.active].id;var itemElem=document.getElementById("livechan_convobar_item_"+convoId);itemElem.style.background=null;}
convoId=self.holder[msgid].id;itemElem=document.getElementById("livechan_convobar_item_"+convoId);itemElem.style.background="red";var elemClass=".livechan_chat_convo_"+convoId;if(sheet.insertRule){sheet.insertRule(elemClass+" { display: block; }",0);sheet.insertRule(".livechan_chat_output_chat { display: none; }",0);}else if(sheet.addRule){sheet.addRule(".livechan_chat_output_chat","display: none");sheet.addRule(elemClass,"display: block");}
self.active=msgid;}
self.parent.scroll();}
function Chat(domElem,channel,options){var self=this;this.pph=0;this.name=channel.toLowerCase();this.domElem=domElem;this.lastOp=null;if(options){this.options=options;}else{this.options={};}
this.chatElems=buildChat(this,this.domElem,this.name);this.prefix=this.options.prefix||"/";var scheme="wss://";if(location.protocol=="http:")scheme="ws://";var url=scheme+location.host+this.prefix+"live?"+this.name;this.connection=initWebSocket(this,url);this.initOutput();this.initInput();this.chatElems.navbar.setChannel(this.name);this.captcha=new Captcha(this.domElem,this.options,function(id,solution,callback){var ajax=new XMLHttpRequest();ajax.open("POST",self.prefix+"livechan/api/captcha");ajax.onreadystatechange=function(){if(ajax.readyState==4){var result=JSON.parse(ajax.responseText);callback(result&&result.success);}}
ajax.send(JSON.stringify({ID:id,Solution:solution}));});this.captcha.hide();setInterval(function(){self.tickPPHCount();self.tickUserCount();},5000);}
Chat.prototype.clear=function(){for(var convo in this.chatElems.convobar.holder){this.chatElems.convobar.removeConvo(convo);}}
Chat.prototype.login=function(){this.captcha.load();}
Chat.prototype.modLogin=function(str){var self=this;self.connection.send({ModLogin:str});}
Chat.prototype.modAction=function(scope,action,postID,reason,expire){var self=this;self.connection.send({ModReason:reason,ModScope:parseInt(scope),ModAction:parseInt(action),ModPostID:parseInt(postID),ModExpire:parseInt(expire),});}
Chat.prototype.Mentioned=function(event,chat){var self=this;self.notify("mentioned: "+chat);}
Chat.prototype.onNotifyShow=function(){}
Chat.prototype.readImage=function(elem,callback){var self=this;if(elem.files.length>0){var reader=new FileReader();var file=elem.files[0];reader.onloadend=function(ev){if(ev.target.readyState==FileReader.DONE){callback(window.btoa(ev.target.result),file.name,file.type);}}
reader.readAsBinaryString(file);}else{callback(null,null,null);}}
Chat.prototype.sendInput=function(event){var inputElem=this.chatElems.input;var connection=this.connection;var self=this;if(inputElem.message.value[0]=='/'){var inp=inputElem.message.value;var helpRegex=/(help)? (.*)/;var helpMatch=helpRegex.exec(inp.slice(1));if(helpMatch){}
if(self.options.customCommands){for(var i in self.options.customCommands){var regexPair=self.options.customCommands[i];var match=regexPair[0].exec(inp.slice(1));if(match){(regexPair[1]).call(self,match);inputElem.message.value='';}}}
for(var i in modCommands){var command=modCommands[i];var match=command[0].exec(inp.slice(1));if(match){(command[1]).call(self,match);}}
event.preventDefault();return false;}
if(inputElem.submit.disabled==false){var message=inputElem.message.value;var name=inputElem.name.value;var convo=self.chatElems.convobar.active;var board;if(convo)
board=self.chatElems.convobar.holder[convo].group;if(!board)board="overchan.live";console.log(board);var subject=self.chatElems.input.subject.value;var ajax=new XMLHttpRequest();ajax.open("POST",self.prefix+"livechan/api/post?newsgroup="+board,true);ajax.onreadystatechange=function(){if(ajax.readyState==4){console.log("post done");var jdata=JSON.parse(ajax.responseText);if(!jdata){console.log("parse error: data="+ajax.responseText);}else if(jdata.captcha){self.login();}else if(jdata.message_id){console.log("post success:"+jdata.message_id);if(!convo){self.lastOp=jdata.message_id;}
inputElem.file.value="";inputElem.message.value='';}else if(jdata.error){console.log(jdata.error);}}else if(ajax.readyState==3){console.log("post processing");}else if(ajax.readyState==2){console.log("post sent");}}
var data=new FormData();data.append("name",name);data.append("subject",subject);data.append("message",message);if(convo)
data.append("reference",convo);if(inputElem.file.files[0])
data.append("attachment_0",inputElem.file.files[0]);ajax.send(data);inputElem.submit.disabled=true;var i=parseInt(self.options.cooldown);if(i==NaN){i=4;}
inputElem.submit.setAttribute('value',i);var countDown=setInterval(function(){inputElem.submit.setAttribute('value',--i);},1000);setTimeout(function(){clearInterval(countDown);inputElem.submit.disabled=false;inputElem.submit.setAttribute('value','send');},i*1000);event.preventDefault();return false;}}
Chat.prototype.initInput=function(){var inputElem=this.chatElems.input;var connection=this.connection;var self=this;inputElem.form.addEventListener('submit',function(event){self.sendInput(event);});inputElem.message.addEventListener('keydown',function(event){if(event.keyCode===13&&!event.shiftKey){self.sendInput(event);}});inputElem.message.focus();}
Chat.prototype.notify=function(message){this.showNotifyPane();var notifyPane=this.chatElems.notify;notifyPane.inform(message);}
Chat.prototype.showNotifyPane=function(){var pane=this.chatElems.notify.pane;pane.style.zIndex=5;pane.style.visibility='visible';}
Chat.prototype.showNotifyPane=function(){var pane=this.chatElems.notify.pane;pane.style.zIndex=-1;pane.style.visibility='hidden';}
Chat.prototype.error=function(message){var self=this;console.log("error: "+message);self.notify("an error has occured: "+message);}
Chat.prototype.handleMessage=function(data){var self=this;var mtype=data.Type.toLowerCase();if(mtype=="captcha"){if(self.captcha_callback){self.captcha_callback(data.Success);self.captcha_callback=null;}else{self.login();}}else if(mtype=="post"){self.insertChat(self.generateChat(data),data);}else if(mtype=="count"){self.chatElems.navbar.updateUsers(data.UserCount);}else if(mtype=="ban"){self.connection.ban(data.Reason);}else if(mtype=="error"){self.insertChat(self.generateChat({PostMessage:data.Error,PostSubject:"Server Error",PostName:"Server"}))
console.log("server error: "+data.Error);}else{console.log("unknown message type "+mtype);}}
Chat.prototype.handleData=function(data){var self=this;if(Object.prototype.toString.call(data)==='[object Array]'){for(var i=0;i<data.length;i++){self.handleMessage(data[i]);}}else{self.handleMessage(data);}}
Chat.prototype.initOutput=function(){var outputElem=this.chatElems.output;var connection=this.connection;var self=this;}
Chat.prototype.tickUserCount=function(){var self=this;var ajax=new XMLHttpRequest();ajax.open("GET",self.prefix+"livechan/api/online");ajax.onreadystatechange=function(){if(ajax.readyState==4&&ajax.status==200){var data=JSON.parse(ajax.responseText);if(data&&data.online){self.updateUserStats(data.online);}}}
ajax.send();}
Chat.prototype.tickPPHCount=function(){var self=this;var convo=self.chatElems.convobar.active;var board;if(convo)
board=self.chatElems.convobar.holder[convo].group;if(!board){var h=document.location.hash;if(h.length>1){board="overchan."+h.substr(1);}}
if(board){var ajax=new XMLHttpRequest();ajax.open("GET",self.prefix+"livechan/api/pph?newsgroup="+board);ajax.onreadystatechange=function(){if(ajax.readyState==4&&ajax.status==200){var data=JSON.parse(ajax.responseText);if(data&&data.pph!==undefined){self.pph=data.pph;}}}
ajax.send();}}
Chat.prototype.updateUserStats=function(count){var elem=this.chatElems.navbar.status;elem.textContent="Online: "+count+" PPH: "+this.pph;}
Chat.prototype.scroll=function(){this.chatElems.output.scrollTop=this.chatElems.output.scrollHeight;}
Chat.prototype.rollover=function(){}
Chat.prototype.insertChat=function(chat,data){var self=this;var outputElem=this.chatElems.output;outputElem.appendChild(chat);self.scroll();self.rollover();if(self.lastOp){self.chatElems.convobar.show(self.lastOp);self.lastOp=null;}}
Chat.prototype.generateChat=function(data){var self=this;var chat=document.createElement('div');self.chatElems.convobar.update(data.Parent,data);var convo=self.chatElems.convobar.holder[data.Parent];chat.select=function(){console.log("selecting...");convo.select();}
chat.className='livechan_chat_output_chat livechan_chat_convo_'+convo.id;var convoLabel=document.createElement('span');convoLabel.className='livechan_convo_label';convoLabel.appendChild(document.createTextNode(data.PostSubject));var header=document.createElement('div');header.className='livechan_chat_output_header';var name=document.createElement('span');name.className='livechan_chat_output_name';var trip=document.createElement('span');trip.className='livechan_chat_output_trip';var date=document.createElement('span');date.className='livechan_chat_output_date';var count=document.createElement('span');count.className='livechan_chat_output_count';var body=document.createElement('div');body.className='livechan_chat_output_body';var message=document.createElement('div');message.className='livechan_chat_output_message';if(data.PostName){name.appendChild(document.createTextNode(data.PostName));}else{name.appendChild(document.createTextNode('Anonymous'));}
if(data.Files){for(var idx=0;idx<data.Files.length;idx++){var file=data.Files[idx];if(!file)continue;var a=document.createElement('a');a.setAttribute('target','_blank');var filepath=file.Path;var thumb_url=self.options.prefix+'thm/'+filepath+".jpg";var src_url=self.options.prefix+'img/'+filepath;a.setAttribute('href',src_url);var fl=filepath.toLowerCase();var img=document.createElement('img');img.setAttribute('src',thumb_url);img.className='livechan_image_thumb';a.appendChild(img);message.appendChild(a);img.onload=function(){self.scroll();}
img.addEventListener('mouseover',function(){var e=document.createElement("div");e.setAttribute("id","hover_"+data.ShortHash);e.setAttribute("class","hover");if(fl.match(/\.(webm|mp4|mkv)$/)){var v=document.createElement("video");v.src=src_url;e.appendChild(v);}else if(fl.match(/\.(mp3|ogg|oga|flac|opus)$/)){var a=document.createElement("audio");a.src=src_url;e.appendChild(a);}else if(fl.match(/\.txt$/)){}else{var i=document.createElement("img");i.src=src_url;e.appendChild(i);}
chat.appendChild(e);});img.addEventListener('mouseout',function(){var e=document.getElementById("hover_"+data.ShortHash);e.parentElement.removeChild(e);});}}
if(data.PostMessage){message.appendChild(parse(data.PostMessage,messageRules));}else{message.appendChild(document.createTextNode(''));}
if(data.Posted){date.appendChild(document.createTextNode((new Date(data.Posted*1000)).toLocaleString()));}
if(data.Tripcode){var et=document.createElement('span');et.innerHTML=data.Tripcode;trip.appendChild(et);}
if(data.HashShort){var h=data.HashShort;chat.setAttribute('id','livechan_chat_'+h);count.appendChild(document.createTextNode(h));count.addEventListener('click',function(){self.chatElems.input.message.value+='>>'+h+'\n';self.chatElems.input.message.focus();chat.select();});}
header.appendChild(name);header.appendChild(trip);header.appendChild(date);header.appendChild(convoLabel);header.appendChild(count);body.appendChild(message);chat.appendChild(header);chat.appendChild(body);return chat;}
/* end ./contrib/js/nntpchan/livechan.js */
/* begin ./contrib/js/nntpchan/local_storage.js */
function get_storage(){var st=null;if(window.localStorage){st=window.localStorage;}else if(localStorage){st=localStorage;}
return st;}
/* end ./contrib/js/nntpchan/local_storage.js */
/* begin ./contrib/js/nntpchan/old-livechan.js */
function livechan_got_post(widget,j){while(widget.children.length>5){widget.removeChild(widget.children[0]);}
nntpchan_buildpost(widget,j);widget.scrollTop=widget.scrollHeight;}
function inject_postform(prefix,parent){}
function inject_livechan_widget(prefix,parent){if("WebSocket"in window){var url="ws://"+document.location.host+prefix+"live";if(document.location.protocol=="https:"){url="wss://"+document.location.host+prefix+"live";}
var socket=new WebSocket(url);var progress=function(str){parent.innerHTML="<pre>livechan: "+str+"</pre>";};progress("initialize");socket.onopen=function(){progress("streaming");}
socket.onmessage=function(ev){var j=null;try{j=JSON.parse(ev.data);}catch(e){}
if(j){livechan_got_post(parent,j);}}
socket.onclose=function(ev){progress("connection closed");setTimeout(function(){inject_livechan_widget(prefix,parent);},1000);}}else{parent.innerHTML="<pre>livechan mode requires websocket support</pre>";setTimeout(function(){parent.innerHTML="";},5000);}}
function ukko_livechan(prefix){var ukko=document.getElementById("ukko_threads");if(ukko){ukko.innerHTML="";inject_livechan_widget(prefix,ukko);}}
/* end ./contrib/js/nntpchan/old-livechan.js */
/* begin ./contrib/js/nntpchan/post-reply.js */
function table_insert_row(table,header,items){var tr=document.createElement("tr");var th=document.createElement("th");th.appendChild(header);tr.appendChild(th);for(var idx=0;idx<items.length;idx++){var elem=document.createElement("td");elem.appendChild(items[idx]);tr.appendChild(elem);}
table.appendChild(tr);}
function ReplyBox(){var elem=document.createElement("div");this.elem=elem;elem.setAttribute("class","shadow shadow-box");elem=document.createElement("input");elem.name="reference";elem.type="hidden";this.elem.appendChild(elem);var table=document.createElement("table");table.setAttribute("class","postform");var tbody=document.createElement("tbody");var span=document.createElement("span");elem=document.createElement("input");elem.setAttribute("name","name");elem.setAttribute("value","Anonymous");this.name=elem;span.appendChild(elem);var err_elem=document.createElement("span");span.appendChild(err_elem);this._error=err_elem;table_insert_row(tbody,document.createTextNode("Name"),[span]);elem=document.createElement("input");elem.setAttribute("value","");this.subject=elem;var submit=document.createElement("button");submit.innerHTML="reply";table_insert_row(tbody,document.createTextNode("Subject"),[elem]);this.submit=submit;elem=document.createElement("textarea");elem.setAttribute("cols","40");elem.setAttribute("rows","5");table_insert_row(tbody,document.createTextNode("Comment"),[elem]);this.message=elem;elem=document.createElement("input");elem.setAttribute("class","postform_attachment");elem.setAttribute("type","file");elem.setAttribute("multiple","multiple");this.files=elem;table_insert_row(tbody,document.createTextNode("Files"),[elem]);elem=document.createElement("img");elem.alt="captcha";table_insert_row(tbody,document.createTextNode("Captcha"),[elem]);this.captcha_img=elem;elem=document.createElement("input");elem.name="captcha";elem.autocomplete="off";table_insert_row(tbody,document.createTextNode("Solution"),[elem]);table_insert_row(tbody,document.createTextNode("Post"),[submit]);this.captcha_solution=elem;table.appendChild(tbody);this.elem.appendChild(table);document.body.appendChild(this.elem);$(this.elem).css("position","fixed");$(this.elem).css("display","none");this._open=false;}
ReplyBox.prototype.result=function(msg,color){var self=this;self._error.innerHTML="";$(self._error).css("color",color);self._error.appendChild(document.createTextNode(msg));setTimeout(function(){$(self._error).fadeOut(1000,function(){self._error.innerHTML="";});},1000);}
ReplyBox.prototype.visible=function(){return this._open!=false;}
ReplyBox.prototype.makePost=function(info){var self=this;var data=new FormData();data.append("name",self.name.value);data.append("subject",self.subject.value);data.append("captcha",self.captcha_solution.value);data.append("message",self.message.value);$(self.files.files).each(function(_,f){data.append("attachment_uploaded",f);});data.append("reference",info.reference);return data;}
ReplyBox.prototype.clear=function(){var self=this;self.name.value="";self.subject.value="";self.message.value="";self.captcha_solution.value="";}
ReplyBox.prototype.reload=function(){var self=this;self.captcha_img.src="/captcha/img?"+new Date().getTime();}
ReplyBox.prototype.show=function(info){var self=this;self.reload();self._open=true;console.log("reply box show for "+info.reference);$(self.elem).css("display","inline-block");var off=$(info.elem).offset();$(self.elem).offset({top:off.top,left:$(info.elem).width()+off.left});self.submit.onclick=function(ev){var post=self.makePost(info);var a=$.ajax({data:post,processData:false,contentType:false,url:info.url,method:"POST",dataType:"json"}).success(function(data,status,xhr){if(data.message_id){self.result("posted as "+data.message_id,"green");self.clear();setTimeout(function(){self.hide();if(data.url)
window.location=data.url;},1000);}else{self.result("error: "+data.error,"red");}}).fail(function(){self.result("request failed","red");}).done(function(){self.reload();});};}
ReplyBox.prototype.hide=function(){var self=this;if(!self.visible())return;self._open=false;$(self.elem).fadeOut(400,function(){self.submit.onclick=function(ev){};});}
onready(function(){var replyBox=new ReplyBox();replyBox.hide();document.reply=replyBox;$(".post").each(function(_,elem){var replyInfo={show:false,url:(prefix||"/")+"post/"+elem.dataset.newsgroup+"/json",reference:elem.dataset.rootmsgid,board:elem.dataset.newsgroup,elem:elem};var elems=elem.getElementsByClassName("postreply");if(elems&&elems[0]){var e=elems[0].children[1];console.log("inject reply box into "+e);e.onclick=function(ev){if(!replyInfo.show){replyBox.show(replyInfo);}else{replyBox.hide();}
replyInfo.show=!replyInfo.show;ev.preventDefault();}}});});
/* end ./contrib/js/nntpchan/post-reply.js */
/* begin ./contrib/js/nntpchan/reply.js */
function nntpchan_reply(parent,shorthash){if(parent&&document.dynreply){var boardname=parent.dataset.newsgroup;var rootmsg=parent.dataset.rootmsgid;var replyto=getReplyTo();replyto.setBoard(boardname);replyto.setRoot(rootmsg);replyto.show();}
var elem;if(document.reply&&document.reply.visible()){elem=document.reply.message;}else{elem=document.getElementById("postform_message");}
if(elem)
{elem.value+=">>"+shorthash.substr(0,10)+"\n";}}
function init(prefix){}
/* end ./contrib/js/nntpchan/reply.js */
/* begin ./contrib/js/nntpchan/report.js */
function show_censortools(){var e=document.getElementById("censor-tools");if(e)e.checked=true;}
function nntpchan_report_thread(posthash){var thread=document.getElementById("thread_"+posthash);if(!thread)return;var posts=thread.getElementsByClassName("post");for(var idx=0;idx<posts.length;idx++){var post=posts[idx];nntpchan_report(post.dataset.msgid);}}
function nntpchan_report(msgid,msgid_hash,refid,refid_hash){var e=document.getElementById("nntpchan_censor_actions");if(!e)return;if(refid==msgid){nntpchan_report_thread(refid_hash);}else{e.value+="delete "+msgid+"\n";}
show_censortools();}
function nntpchan_submit_censor(form,regular_url){var result=document.getElementById("nntpchan_censor_result");var show_result=function(msg){while(result.children.length>0){result.children[0].remove();}
result.appendChild(document.createTextNode(msg));};var handle_result=function(j){var err=j.error;if(err){show_result("error: "+err);return;}
var msgid=j.message_id;if(msgid){show_result("submitted report as "+msgid);}else{show_result("post failed, bad captcha?");}};var parts=regular_url.split('/');parts[parts.length-1]='ctl';var url=parts.join('/');url+='/json';console.log(url);var captcha=form.captcha.value;if(!captcha){show_result("no captcha solution provided");return;}
var secret=document.getElementById("nntp_censor_secret").value;if(!secret){show_result("no mod key provided");return;}
var actions=document.getElementById("nntpchan_censor_actions").value;if(!actions){show_result("no mod actions provided");}
var msg="";var lines=actions.split("\n");for(var idx=0;idx<lines.length;idx++){var line=lines[idx].trim();if(!line)continue;msg+=line+"\n";}
if(!msg){show_result("no mod actions given");return;}
msg=msg.trim()+"\n\n";var formdata=new FormData();formdata.append("name","mod#"+secret);formdata.append("subject","censor");formdata.append("message",msg);formdata.append("captcha",captcha);formdata.append("reference","");nntpchan_apicall(url,handle_result,null,"POST",formdata);}
/* end ./contrib/js/nntpchan/report.js */
/* begin ./contrib/js/nntpchan/theme.js */
function enable_theme(prefix,name){if(prefix&&name){var theme=document.getElementById("current_theme");if(theme){theme.href=prefix+"static/"+name+".css";var st=get_storage();st.nntpchan_prefix=prefix;st.nntpchan_theme=name;}}}
var st=get_storage();enable_theme(st.nntpchan_prefix,st.nntpchan_theme);
/* end ./contrib/js/nntpchan/theme.js */
/* begin ./contrib/js/vendor/placeholder.js */
/* end ./contrib/js/vendor/placeholder.js */
}

View File

@@ -16,6 +16,105 @@ var nntpchan_mod_mark_spam = function(longhash) {
elem.innerText = "spam";
};
var nntpchan_mod_decode_ipban = function(longhash) {
var elem = document.getElementById("post_body_" + longhash);
if(!elem) return;
var lines = elem.innerText.split("\n");
console.log(lines);
for(var i = 0; i < lines.length; ++i)
{
if(!lines[i])
continue;
if (!lines[i].startsWith("overchan-inet-ban"))
continue;
console.log(lines[i]);
var parts = lines[i].split(" ");
if(parts.length < 2) continue;
parts = parts[1].split(":");
if(parts.legngth < 2) continue;
var a1 = atob(parts[0]);
var a2 = atob(parts[1]);
var txt = "";
for(var idx = 0; idx < a1.length; ++idx)
{
txt += String.fromCharCode(a1.charCodeAt(idx) ^ a2.charCodeAt(idx));
}
elem.appendChild(document.createTextNode(txt + "\n"));
}
};
var nntpchan_mod_action = function(mod_action, elem) {
var csrf_ajax = new XMLHttpRequest();
csrf_ajax.onreadystatechange = function() {
if (csrf_ajax.readyState == XMLHttpRequest.DONE) {
// get csrf token
var csrf = csrf_ajax.getResponseHeader("X-CSRF-Token");
// fire off ajax
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (ajax.readyState == XMLHttpRequest.DONE) {
var status = ajax.status;
// we gud?
if (status == 200) {
// yah
var txt = ajax.responseText;
var j = JSON.parse(txt);
if (j.error) {
var e = document.createTextNode(j.error);
elem.appendChild(e);
} else {
if (mod_action.handle) {
var result = mod_action.handle(j);
if (result) {
elem.appendChild(result);
}
}
}
} else if (status) {
// nah
// http error
elem.innerHTML = "error: HTTP "+status;
}
}
}
if (mod_action.name) {
var url = "/mod/" + mod_action.name;
ajax.open(mod_action.method || "GET", url);
ajax.setRequestHeader("X-CSRF-Token", csrf);
var data = mod_action.data;
if (data) {
ajax.setRequestHeader("Content-type","text/json");
ajax.send(JSON.stringify(data));
} else {
ajax.send();
}
} else {
alert("mod action has no name");
}
}
}
csrf_ajax.open("GET", "/mod/");
csrf_ajax.send();
};
var nntpchan_do_admin = function(method, param, result_elem) {
nntpchan_mod_action({
name:"admin/"+method,
method: ( param && "POST" ) || "GET",
data: param
}, result_elem);
};
var nntpchan_mod_trust_mod = function(pubkey, elem) {
nntpchan_do_admin("pubkey.add", {pubkey: pubkey}, elem);
};
var nntpchan_mod_untrust_mod = function(pubkey, elem) {
nntpchan_do_admin("pubkey.del", {pubkey: pubkey}, elem);
};
var nntpchan_mod_commit_spam = function(elem) {
var formdata = new FormData();
var posts = document.getElementsByClassName("post");
@@ -274,7 +373,7 @@ onready(function(){
// inline reply expand
onready(function() {
return;
var fetchpost = function(url, cb)
{
var parts = url.split("#");

BIN
contrib/static/retrotor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -853,3 +853,8 @@ th > label {
:target {
background-color: #493769;
}
.mod {
display: none;
}

View File

@@ -1,4 +1,4 @@
{{!
{!
frontpage.mustache -- template for index.html
template parameters:
- boardgraph ( markup of boardPageRows instance, see srnd/model.go )
@@ -23,12 +23,12 @@
<div id="nntpchan_banner">
</div>
<div class="index-inner">
<div>{{frontend}} on nntpchan</div>
<div>View the <a href="{{prefix}}ukko.html">overboard</a></div>
<div>Join the IRC on <a href="https://qchat.rizon.net/?channels=#nntpchan">rizon</a> or <a href="irc://127.0.0.1:6668/overchan">irc2p</a></div>
<div>Check out the <a href="{{prefix}}boards.html">board list</a></div>
<div>Fork on github: <a href="https://github.com/majestrate/nntpchan/">frontend</a> and <a href="https://github.com/majestrate/srndv2/">core</a></div>
<div>We've Had {{totalposts}} Posts Since August 01 2015 </div>
<h2> <div>{{frontend}} on nntpchan</div></h2>
<h2>View the <a href="/o/?lang=en">overboard</a></h2>
<h3>Read the <a href="{{prefix}}static/faq.html">FAQ</a></h3>
<h3>Lurk on <a href="irc://allyour4nert7pkh.onion/overchan">URC</a></h3>
<h3>Check out the <a href="{{prefix}}boards.html">board list</a></h3>
<h3>Fork on github: <a href="https://github.com/nesshy9/nntpchan/">frontend</a> and <a href="https://github.com/majestrate/srndv2/">core</a></h3>
</div>
<div class="index-inner">
<!--
@@ -73,6 +73,8 @@
</tbody>
</table>
-->
{{{OvercockGraph}}}
{{{overview}}}
</div>
</div>

View File

@@ -43,6 +43,15 @@
<textarea id="postform_message" name="message" cols=40 rows=5></textarea>
</td>
</tr>
<tr>
<th>
Link URI
</th>
<td>
<input id="postform_uri" name="uri" value="" type="text" />
</td>
</tr>
{{#files}}
<tr>
<th>

View File

@@ -12,7 +12,10 @@
<link rel="stylesheet" href="{{prefix}}static/user.css" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<center>
<img src="{{prefix}}static/404.png"></img>
</center>
<body>
<center>
<pre>
{{#i18n.Translations}}{{resource_not_found}}{{/i18n.Translations}}

View File

@@ -38,7 +38,7 @@
<b>Most of the rest of the wild west.</b>
</div>
<center><b>{{board.Name}}</b></center>
<center><button onclick="nntpchan_mod_commit_spam(this)">Moderate</button></center>
<center><button class="spam-button" onclick="nntpchan_mod_commit_spam(this)">Moderate</button></center>
<br />
{{{form}}}
{{#board.Threads}}

View File

@@ -21,21 +21,24 @@
<meta property="og:description" content="Most of the rest of the wild west"/>
<meta property="og:url" content="{{prefix}}"/>
<meta property="og:image"
content="{{prefix}}static/changolia-logo.png"/>
<title> CHANGOLIA </title>
content="{{prefix}}static/retrotor.png"/>
<title> NNTPChan </title>
</head>
<body>
<center>
<img id="logo" src="{{prefix}}static/changolia-logo.png" />
<img id="logo" src="{{prefix}}static/retrotor.png" />
<a href="{{prefix}}b/"><h2>Board List</h2></a>
<a href="{{prefix}}o/?lang={{i18n.Name}}">Firehose</a>
<a href="{{prefix}}static/faq.html">FAQ</a>
</center>
<hr/>
<center>
<footer>
<p class="legal">All posts on this site are the responsibility of the individual poster and not the administration, pursuant to 47 U.S.C. § 230.</p>
<p class="legal">To make a DMCA request or report illegal content, please contact the administration</p>
</footer>
</body>
</center>
</html>

View File

@@ -30,12 +30,46 @@
{{#post.Attachments}}
<a href="{{Source}}" class="image_link" target="_blank" title="{{Filename}}"><img src="{{Thumbnail}}" class="image" /></a>
{{/post.Attachments}}
<a href="#" onclick="nntpchan_mod_delete('{{post.PostHash}}');">[Delete]</a>
<a href="#" onclick="nntpchan_mod_mark_spam('{{post.PostHash}}');">[Spam]</a>
<span class="mod" onclick="nntpchan_mod_delete('{{post.PostHash}}');">[Delete]</span>
<span class="mod" onclick="nntpchan_mod_mark_spam('{{post.PostHash}}');">[Spam]</span>
{{#post.IsCtl}}
<span class="mod" onclick="nntpchan_mod_trust_mod('{{post.PubkeyHex}}', this);">[Trust Moderator]</span>
<span class="mod" onclick="nntpchan_mod_untrust_mod('{{post.PubkeyHex}}', this);">[UnTrust Moderator]</span>
<span class="mod" onclick="nntpchan_mod_decode_ipban('{{post.PostHash}}');">[Decode Secrets]</span>
{{/post.IsCtl}}
<a name="{{post.PostHash}}"></a><span class="topicline"><b data-subject="{{post.Subject}}" class="subject">{{post.Subject}}</b> {{post.Name}} <span class="published">{{post.Frontend}} || {{post.Date}}</span> {{{post.Pubkey}}} <a href="{{post.PostURL}}">[Reply]</a>
<a href="#" onclick="return quickreply('{{post.ShortHash}}', '{{post.PostHash}}', '{{post.PostURL}}');"> {{post.ShortHash}}</a>
</span>
<br /><br />
<span class="message_span">{{{post.RenderBody}}}</span>
<span id="post_body_{{post.PostHash}}" class="message_span">{{{post.RenderBody}}}</span>
{{#post.OP}}
<script type="text/javascript">
fetch("/api/find?hash={{post.PostHash}}").then(function(resp) {
return resp.json();
}).then(function(j) {
console.log(j);
if (j.length) {
var e = document.getElementById("post_body_{{post.PostHash}}");
if(e) {
var u = new URL(j[0].ReferencedURI);
console.log(u);
if(u.protocol === "https:" || u.protocol === "http:") {
var link = document.createElement("a");
link.href = u.toString();
link.innerText = "[Link]";
link.setAttribute("target", "_blank");
link.setAttribute("class", "post-link")
e.appendChild(document.createElement("hr"));
e.appendChild(link);
}
}
else throw "wut";
}
}).catch(function(resp) {
});
</script>
{{/post.OP}}
<br style="clear: both;" />
</div>

View File

@@ -24,6 +24,14 @@
<th>{{#i18n.Translations}}{{comment}}{{/i18n.Translations}}</th>
<td><textarea id="comment" name="message" class="postarea"></textarea></td>
</tr>
<tr>
<th>
Link URI
</th>
<td>
<input class="posttext" id="postform_uri" name="uri" value="" type="text" />
</td>
</tr>
{{^DisableCaptcha}}
<tr>
<th>

View File

@@ -23,7 +23,7 @@
<script type="text/javascript" src="{{thread.Prefix}}static/overchan.js"></script>
<meta property="og:site_name" content="changolia" />
<meta property="og:type" content="website"/>
<meta property="og:title" content="{{board.Board}}"/>
<meta property="og:title" content="{{thread.Board}}"/>
<meta property="og:description" content="{{thread.OP.Brief}}"/>
{{#sfw}}
<meta property="og:url" content="{{prefix}}t/{{thread.OP.PostHash}}/?lang={{i18n.Name}}&sfw=1"/>
@@ -48,7 +48,7 @@
<b>Most of the rest of the wild west.</b>
</div>
<center><b><a href="{{thread.BoardURL}}">{{thread.Board}}</a></b></center>
<center><button onclick="nntpchan_mod_commit_spam(this)">Moderate</button></center>
<center><button class="spam-button" onclick="nntpchan_mod_commit_spam(this)">Moderate</button></center>
<br />
{{{form}}}
{{#thread.BumpLock}}
@@ -57,10 +57,10 @@
{{^thread.BumpLock}}
<div class="thread" id="thread_{{thread.OP.PostHash}}">
{{/thread.BumpLock}}
{{{thread.OP.RenderPost}}}
{{#thread.Replies}}
{{{RenderPost}}}
{{/thread.Replies}}
{{{thread.OP.RenderPost}}}
{{#thread.Replies}}
{{{RenderPost}}}
{{/thread.Replies}}
</div>
<hr style="clear: both;">
<footer>

View File

@@ -31,7 +31,7 @@
<div class="sitetitle">
<h2><a href="#">CHANGOLIA</a></h2>
<b>Most of the rest of the wild west.</b>
<center><button onclick="nntpchan_mod_commit_spam(this)">Moderate</button></center>
<center><button class="spam-button" onclick="nntpchan_mod_commit_spam(this)">Moderate</button></center>
</div>
<div id="paginator">
{{#prev}}

View File

@@ -15,7 +15,7 @@ Dependancies:
* imagemagick
* ffmpeg
* sox
* go 1.9
* go
* GNU make
## Debian instructions
@@ -24,7 +24,7 @@ These are installation instructions for Debian.
### Install Go
Install the Go programming language version _1.9_ from the [Go website](https://golang.org/dl/).
Install the latest version of the Go programming language from the [Go website](https://golang.org/dl/).
### Install the dependancies