commit 7322d7107a0bf047ca1250739247109b80e09fea
Author: 1029559041@qq.com <1029559041@qq.com>
Date: Mon Dec 17 18:53:57 2018 +0800
update
diff --git a/PixivSearch/aliyun/photo/AliyunPhoto.py b/PixivSearch/aliyun/photo/AliyunPhoto.py
new file mode 100644
index 0000000..80954dc
--- /dev/null
+++ b/PixivSearch/aliyun/photo/AliyunPhoto.py
@@ -0,0 +1,140 @@
+import hashlib
+import json
+import os
+import time
+
+import aliyunsdkcore
+import oss2 as oss2
+from aliyunsdkcloudphoto.request.v20170711 import ListPhotoStoresRequest, FetchLibrariesRequest, \
+ CreateTransactionRequest, CreatePhotoRequest, EditPhotosRequest, GetPublicAccessUrlsRequest, ListPhotosRequest, \
+ DeletePhotosRequest, InactivatePhotosRequest, GetLibraryRequest
+from aliyunsdkcore.auth.credentials import RamRoleArnCredential
+from aliyunsdkcore.client import AcsClient
+from aliyunsdkcore.profile import region_provider
+from aliyunsdkcore.request import CommonRequest
+
+region_id = 'cn-shanghai'
+ak = 'LTAIWzPnmkJs2qpL'
+secret = 'LIIq3HumctXPp0WT8c06yDiFbKKiVe'
+region_provider.add_endpoint('Oss', region_id, 'oss-cn-shanghai.aliyuncs.com')
+region_provider.add_endpoint('CloudPhoto', region_id, 'cloudphoto.cn-shanghai.aliyuncs.com')
+aliyunsdkcore.request.set_default_protocol_type("https")
+
+
+class MyClient(AcsClient):
+
+ def __init__(self, arn, sessionName):
+ super().__init__(region_id=region_id, credential=RamRoleArnCredential(ak, secret, arn, sessionName))
+ self.StoreName = None
+
+ def get_md5_01(self, file_path):
+ md5 = None
+ if os.path.isfile(file_path):
+ f = open(file_path, 'rb')
+ md5_obj = hashlib.md5()
+ md5_obj.update(f.read())
+ hash_code = md5_obj.hexdigest()
+ f.close()
+ md5 = str(hash_code).lower()
+ return md5
+
+ def do_action_with_exception(self, acs_request):
+ return json.loads(super().do_action_with_exception(acs_request).decode())
+
+ def showOption(self, options, key, desc):
+ choose = []
+ for index, option in enumerate(options):
+ choose.append(option[key])
+ print('{index}:{name}'.format(index=index + 1, name=option[key]))
+ return choose[(int)(input('输入{desc}\n'.format(desc=desc))) - 1]
+
+ def listPhotoStores(self):
+ request = ListPhotoStoresRequest.ListPhotoStoresRequest()
+ response = self.do_action_with_exception(request)
+ print('PhotoStores:')
+ photoStores = response['PhotoStores']
+ self.StoreName = self.showOption(photoStores, 'Name', 'StoreName')
+
+ def listLibraries(self):
+ request = FetchLibrariesRequest.FetchLibrariesRequest()
+ request.set_StoreName(self.StoreName)
+ response = self.do_action_with_exception(request)
+ self.Libraries = response['Libraries']
+
+ def uploadPhoto(self):
+ if self.StoreName is None:
+ self.listPhotoStores()
+ request = CreateTransactionRequest.CreateTransactionRequest()
+ filePath = input('输入上传文件路径\n').replace('\\', '/')
+ fileName = filePath.split('/')[-1]
+ request.set_Size(os.path.getsize(filePath))
+ request.set_Ext(fileName[-fileName[::-1].index('.'):])
+ request.set_Md5(self.get_md5_01(filePath))
+ request.set_StoreName(self.StoreName)
+ response = self.do_action_with_exception(request)
+ print(response)
+ Upload = response['Transaction']['Upload']
+ FileId = Upload['FileId']
+ SessionId = Upload['SessionId']
+ Bucket = Upload['Bucket']
+ OssEndpoint = Upload['OssEndpoint']
+ ObjectKey = Upload['ObjectKey']
+
+ auth = oss2.StsAuth(self._signer._session_credential[0], self._signer._session_credential[1],
+ self._signer._session_credential[2])
+ bucket = oss2.Bucket(auth, OssEndpoint, Bucket)
+ with open(filePath, 'rb') as fileobj:
+ result = bucket.put_object(ObjectKey, fileobj)
+ print('文件上传状态{status}'.format(status=result.status))
+
+ request = CreatePhotoRequest.CreatePhotoRequest()
+ request.set_FileId(FileId)
+ request.set_PhotoTitle(fileName)
+ request.set_SessionId(SessionId)
+ request.set_StoreName(self.StoreName)
+ request.set_UploadType('manual')
+ response = self.do_action_with_exception(request)
+ print(response)
+
+ def listPhotos(self):
+ if self.StoreName == None:
+ self.listPhotoStores()
+ request = ListPhotosRequest.ListPhotosRequest()
+ request.set_StoreName(self.StoreName)
+ request.set_State('all')
+ response = self.do_action_with_exception(request)
+ print(response)
+ return response['Photos']
+
+ def getPhoto(self):
+ return self.showOption(self.listPhotos(), 'IdStr', '照片Id')
+
+ def sharePhoto(self):
+ IdStr = self.getPhoto()
+ request = EditPhotosRequest.EditPhotosRequest()
+ request.set_PhotoIds([IdStr])
+ request.set_StoreName(self.StoreName)
+ request.set_ShareExpireTime((int(round(time.time())) + 60 * 60) * 1000)
+ response = self.do_action_with_exception(request)
+ print(response)
+
+ request = GetPublicAccessUrlsRequest.GetPublicAccessUrlsRequest()
+ request.set_DomainType('OSS')
+ request.set_PhotoIds([IdStr])
+ request.set_StoreName(self.StoreName)
+ request.set_ZoomType('style/2')
+ response = self.do_action_with_exception(request)
+ print(response)
+
+
+def client(arn, sessionName):
+ ram_role_arn_credential = RamRoleArnCredential('LTAIWzPnmkJs2qpL', 'LIIq3HumctXPp0WT8c06yDiFbKKiVe',
+ arn, sessionName)
+ return AcsClient(region_id='cn-shanghai', credential=ram_role_arn_credential)
+
+
+if __name__ == '__main__':
+
+ myClient = MyClient('acs:ram::1098806312754985:role/aliyunosstokengeneratorrole', 'pqh001')
+ myClient.listPhotoStores()
+ myClient.sharePhoto()
diff --git a/PixivSearch/baidu/downLoadBduImg.py b/PixivSearch/baidu/downLoadBduImg.py
new file mode 100644
index 0000000..03b1edc
--- /dev/null
+++ b/PixivSearch/baidu/downLoadBduImg.py
@@ -0,0 +1,118 @@
+import json
+import os
+import re
+from concurrent import futures
+from datetime import datetime
+
+import requests
+
+
+def get_cookies():
+ _cookies = {}
+ array = "BDqhfp=fate%26%26NaN%26%260%26%261; BIDUPSID=8689C23BFD1526702A4EF173F3A809DD; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; userFrom=null; BAIDUID=8689C23BFD152670722FAAEB4DDC55FA:FG=1; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm".split(
+ ';')
+ for row in array:
+ k, v = row.strip().split('=', 1)
+ _cookies[k] = v
+ return _cookies
+
+
+# 图片保存路径
+savePath = None
+threadNum = 10
+startTime = None
+
+
+def getBaiduImage(word):
+ global startTime, savePath
+ params = []
+ startTime = datetime.now()
+ start = threadNum
+ i = 0
+ filepath = None
+ savePath = r'{savePath}/{word}'.format(savePath=savePath, word=word)
+ if not os.path.exists(savePath):
+ os.makedirs(savePath)
+ while True:
+ try:
+ url = r"https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={" \
+ r"queryWord}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word={" \
+ r"word}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn={pn}&rn={rn}&gsm=3c&1523890541764= "
+ url = url.format(queryWord=word, word=word, pn=start, rn=threadNum)
+ print('request url:%s' % url)
+ req = requests.get(url)
+ if req.status_code == 200:
+ req.encoding = 'utf-8'
+ obj = json.loads(req.text.replace('\\\'', ''))
+ if len(obj['data']) == 1:
+ break
+ for img in obj['data']:
+ if 'fromPageTitle' in img:
+ print('图片:%s\t添加到下载队列' % img['fromPageTitleEnc'])
+ if 'replaceUrl' in img:
+ url = img['replaceUrl'][0]['ObjURL']
+ params.append((url, i))
+ i += 1
+ if not filepath is None and os.path.exists(filepath):
+ os.remove(filepath)
+ filepath = r'{savePath}/图片下载队列填充:{i}'.format(savePath=savePath, word=word, i=i)
+ file = open(filepath, 'w')
+ file.close()
+ start += threadNum
+ except BaseException as e:
+ print(repr(e))
+ if not filepath is None and os.path.exists(filepath):
+ os.remove(filepath)
+ executors = futures.ThreadPoolExecutor(threadNum)
+ try:
+ with executors as executor:
+ executor.map(downImage, params)
+ except BaseException as e:
+ print(repr(e))
+
+
+def downImage(params):
+ try:
+ url = params[0]
+ index = params[1]
+ print(r'开始下载图片{url}'.format(url=url))
+ imgurl = requests.get(url, headers={"Referer": "image.baidu.com"})
+ if imgurl.status_code == 200:
+ format = url[-url[::-1].index('.'):]
+ imgPath = r'{savePath}/fate_{index}.{format}'.format(savePath=savePath,
+ index=index,
+ format=format)
+ f = open(imgPath, 'wb')
+ f.write(imgurl.content)
+ f.close()
+ print(r'图片{url}成功下载到{imgPath}'.format(url=url, imgPath=imgPath))
+ except BaseException as e:
+ print(repr(e))
+
+
+if __name__ == '__main__':
+ # str = ''
+ # while True:
+ # str = input('输入要下载图片的关键字,输入 exit 退出程序\n')
+ # if not str == 'exit':
+ # while True:
+ # savePath = input('输入图片存放目录:例如 E:/图片,注意目录之间使用正斜杠隔开"/"\n')
+ # if re.fullmatch(r"[a-zA-z]:(/[\u4e00-\u9fa5_a-zA-Z0-9]+)+", savePath) is None:
+ # print(r'图片目录{savePath}不合法请重新输入'.format(savePath=savePath))
+ # else:
+ # break
+ # getBaiduImage(str)
+ # print(r'使用{threadNum}线程成功下载{count}张图片到目录{path}下,耗时:{second}'.format(threadNum=threadNum,
+ # count=len(os.listdir(savePath)),
+ # path=savePath,
+ # second=datetime.now() - startTime))
+ # flag = False
+ # else:
+ # print('exit')
+ # break
+ req = requests.post('https://gifmaker.develophelper.com/gif/make', {'tplid': 1,
+ 'content': '好啊##$@?$?@$##就算你是一流工程师##$@?$?@$##就算你出报告再完美##$@?$?@$##我叫你改报告你就要改##$@?$?@$##毕竟我是客户##$@?$?@$##客户了不起啊##$@?$?@$##sorry 客户真的了不起##$@?$?@$##以后叫他天天改报告##$@?$?@$##天天改 天天改'})
+ if req.status_code==200:
+ response = json.loads(req.content.decode())
+ if 'd' in response:
+ print(response['d'])
diff --git a/PixivSearch/dao/Comment.py b/PixivSearch/dao/Comment.py
new file mode 100644
index 0000000..2a9f5c7
--- /dev/null
+++ b/PixivSearch/dao/Comment.py
@@ -0,0 +1,119 @@
+import json
+import os
+import shutil
+import threading
+from concurrent import futures
+
+import requests
+from lxml import etree
+
+
+class Comment:
+ lock = threading.Lock() # 多线程全局资源锁
+
+ def __init__(self, keywords_=None) -> None:
+ super().__init__()
+ self.obj = {'data': {}, 'flag': False}
+ self.keywords = keywords_
+
+ # 获取番剧合集弹幕排行榜
+ def getCommentSort(self, cids):
+
+ urls = []
+ for cid in cids:
+ urls.extend(getCidUrls(cid))
+ with futures.ThreadPoolExecutor(32) as executor:
+ executor.map(self.count, urls)
+ for index, data in enumerate(
+ sorted(self.obj["data"].items(), key=lambda d: d[1], reverse=True)[
+ :50]):
+ print('{index}:{data}'.format(index=index + 1, data=data))
+
+ # 获取番剧合集弹幕排行榜
+ def count(self, url, desc=None):
+ bytes = requests.get(url).content
+ comment_selector = etree.HTML(bytes)
+ if not desc is None:
+ print(desc)
+ print("url=%s" % url)
+ for comment in comment_selector.xpath('//i//d/text()'):
+ if comment in self.obj["data"]:
+ with self.lock:
+ self.obj["data"][comment] = self.obj["data"][comment] + 1
+ else:
+ with self.lock:
+ self.obj["data"][comment] = 1
+ if not self.obj["flag"]:
+ for keyword in self.keywords:
+ if keyword in comment:
+ self.obj["flag"] = True
+
+
+# 根据cid获取历史弹幕地址
+def getCidUrls(cid):
+ urls = []
+ url = "https://comment.bilibili.com/rolldate,%d" % cid
+ req = requests.get(url)
+ if len(req.text) > 0:
+ for i in json.loads(req.text):
+ urls.append("https://comment.bilibili.com/dmroll,%s,%d" % (i['timestamp'], cid))
+ else:
+ urls.append("https://comment.bilibili.com/%d.xml" % cid)
+ return urls
+
+
+# 下载弹幕
+def downloadXml(path, cid, size=None, histroy=True):
+ dlist = set()
+ flag = None
+ if histroy:
+ flag = parseXml(getCidUrls(cid), dlist, size)
+ else:
+ parseXml("https://comment.bilibili.com/%d.xml" % cid, dlist, size)
+ if size is None or (histroy and not size is None and flag):
+ if os.path.exists(path):
+ shutil.rmtree(path)
+ os.makedirs(path)
+ f = open('{path}/{cid}.xml'.format(path=path, cid=cid), 'wb')
+ f.write(b'')
+ for i in dlist:
+ f.write(('\r\n' + i).encode())
+ f.write(b'\r\n')
+ f.close()
+
+
+def xml(url):
+ bytes = requests.get(url).content
+ return etree.HTML(bytes)
+
+
+def parseXml(urls, dlist, size=None):
+ if isinstance(urls, str):
+ urls = [urls]
+ if not size is None:
+ size = float(size.strip('%')) / 100.0
+ for url in urls:
+ comment_selector = xml(url)
+ list = comment_selector.xpath('//i//d/text()')
+ maxlimit = int(comment_selector.xpath('//i//maxlimit/text()')[0])
+
+ if len(list) > 0:
+ print('弹幕数:{list},最大弹幕数:{maxlimit},弹幕池填充:{p}'.format(list=len(list), maxlimit=maxlimit,
+ p='%.2f%%' % (len(list) / maxlimit * 100)))
+ for element in comment_selector.xpath('//i//d'):
+ if len(element.xpath("text()")) > 0:
+ fstr = '{content}'.format(p=str(element.xpath("@p")[0]),
+ content=str(element.xpath("text()")[0]))
+ dlist.add(fstr)
+
+ currentSize = len(dlist) / maxlimit
+ print('填充率:{l}'.format(l='%.2f%%' % (currentSize * 100)))
+ if not size is None and currentSize >= size:
+ return True
+ return False
+
+
+if __name__ == '__main__':
+ cids = [7636499, 7636501, 7636500, 7636503, 7636504, 7636502, 7636509, 7636508, 7636506, 7636507, 7636505]
+
+ downloadXml('F:/ABC',12026697,histroy=False)
diff --git a/PixivSearch/dao/bangumi.py b/PixivSearch/dao/bangumi.py
new file mode 100644
index 0000000..63a63a4
--- /dev/null
+++ b/PixivSearch/dao/bangumi.py
@@ -0,0 +1,185 @@
+import _thread
+import json
+import math
+import os
+from concurrent import futures
+from queue import Queue
+
+import django
+import requests
+from bs4 import BeautifulSoup
+
+from PixivSearch.settings import logger
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PixivSearch.settings")
+django.setup()
+from PixivSearch.model.config import mediaInfo, stat
+
+current_mediaInfo = None
+
+isStop = None
+
+
+def stop_():
+ global isStop
+ isStop = True
+
+
+def save(params):
+ if isStop:
+ return
+ logger.info(params)
+ bangumi_id = params[0]
+ season_id = params[1]
+ media_id = params[2]
+
+ url = "https://www.bilibili.com/bangumi/media/md%d" % media_id
+ try:
+ req = requests.get(url, timeout=10)
+ except BaseException as e:
+ logger.error(repr(e))
+ save(params)
+ logger.info("request_url=%s,status_code=%d" % (url, req.status_code))
+ if req.status_code == 200:
+ json_obj = getJsonText(req, 3)
+ try:
+ if 'mediaInfo' in json_obj and 'stat' in json_obj['mediaInfo'] and 'chn_name' in json_obj['mediaInfo']:
+ stat_info = json_obj['mediaInfo']['stat']
+ print(stat_info)
+ mediaInfo(bangumi_id=bangumi_id, season_id=season_id, media_id=media_id,
+ chn_name=json_obj['mediaInfo']['chn_name']).save()
+ global current_mediaInfo
+ current_mediaInfo = mediaInfo.objects.get(pk=season_id)
+ stat(id=season_id, danmakus=int(stat_info['danmakus']), favorites=stat_info['favorites'],
+ views=stat_info['views']).save()
+ except BaseException as e:
+ logger.error(repr(e))
+
+
+def getJsonText(req, index):
+ tag = BeautifulSoup(req.text, 'lxml')
+ script = tag.select("script")[index].text
+ json_str = script[script.index("=") + 1:script.index("function") - 2]
+ return json.loads(json_str)
+
+
+def get_():
+ global current_mediaInfo
+ return current_mediaInfo
+
+
+page_size = 10
+queue = Queue(page_size)
+
+
+def listen():
+ while True:
+ ids = queue.get()
+ try:
+ executors = futures.ThreadPoolExecutor(page_size)
+ with executors as executor:
+ executor.map(save, ids)
+ logger.info('结束爬虫')
+ except BaseException as e:
+ logger.error(repr(e))
+
+
+_thread.start_new_thread(listen, ())
+
+#遍历所有专题视频收藏数信息
+def getIds():
+ seasonIdList = []
+ page = 1
+ pages = None
+ name = 'seasonListCallback'
+ global isStop
+ isStop = False
+ while isStop == False and (pages is None or page <= pages):
+
+ url = 'https://bangumi.bilibili.com/web_api/season/index_global?page=%d&page_size=%d' % (page, page_size)
+ logger.info(url)
+ try:
+ req = requests.get(url, timeout=10)
+ if req.status_code == 200:
+ json_obj = json.loads(req.text)
+ if 'result' in json_obj and 'list' in json_obj['result']:
+ bangumiList = json_obj['result']['list']
+ ids = []
+ for bangumi in bangumiList:
+ if isStop:
+ break
+ if 'season_id' in bangumi:
+ season_id = int(bangumi['season_id'])
+ if season_id in seasonIdList:
+ continue
+ url = 'https://bangumi.bilibili.com/jsonp/seasoninfo/%d.ver?callback=%s&jsonp=jsonp' % (
+ season_id, name)
+ logger.info(url)
+ req = requests.get(url, timeout=10)
+ if req.status_code == 200:
+ child_json_obj = json.loads(
+ req.text.replace('seasonListCallback(', '').replace(');', ''))
+ if 'result' in child_json_obj and 'bangumi_id' in child_json_obj['result']:
+ bangumi_id = int(child_json_obj['result']['bangumi_id'])
+ if 'media' in child_json_obj['result']:
+ media_id = int(child_json_obj['result']['media']['media_id'])
+ ids.append((bangumi_id, season_id, media_id))
+ seasonIdList.append(season_id)
+ if pages is None and 'count' in json_obj['result']:
+ pages = int(math.ceil(int(json_obj['result']['count']) / page_size))
+ page = page + 1
+ logger.info('获取id数量%d' % len(ids))
+ queue.put(ids)
+ except BaseException as e:
+ logger.error(repr(e))
+ continue
+
+#根据aid获取cid
+def getCid(aid, type=None):
+ while True and aid > 0:
+ url = "https://api.bilibili.com/x/web-interface/archive/stat?aid=%d" % aid
+ print(url)
+ req = requests.get(url)
+ code = json.loads(req.text)["code"]
+ if code == 0:
+ req = requests.get("https://www.bilibili.com/video/av%d" % aid)
+ if req.status_code == 200:
+ json_obj = getJsonText(req, 9)
+ if "videoData" in json_obj and "pages" in json_obj['videoData'] and len(
+ json_obj['videoData']['pages']) > 0 and "cid" in json_obj['videoData']['pages'][0]:
+ cid = json_obj['videoData']['pages'][0]['cid']
+ print('cid=%s' % cid)
+ return cid
+ if type is None:
+ break
+ else:
+ if type:
+ aid = aid - 1
+ else:
+ aid = aid + 1
+
+#根据aid获取cid
+def getCids(aid):
+ s = {"min": getCid(aid, True), "max": getCid(aid, False)}
+ return s
+
+#获取专题所有cid
+def episodeIdToCid(episode_id):
+ cids = []
+ url = "https://www.bilibili.com/bangumi/play/ep%d" % episode_id
+ print("url=%s" % url)
+ req = requests.get(url)
+ json_obj = getJsonText(req, 8)
+ if "epList" in json_obj:
+ for i in json_obj["epList"]:
+ cids.append(i['cid'])
+ return cids
+
+
+
+if __name__ == '__main__':
+ # print(getCids(29416))
+
+ req=requests.post('https://api.bilibili.com/x/v2/history/shadow/set','')
+ # obj = loadData([34807341], [])
+
diff --git a/PixivSearch/logging.conf b/PixivSearch/logging.conf
new file mode 100644
index 0000000..33e9fcb
--- /dev/null
+++ b/PixivSearch/logging.conf
@@ -0,0 +1,33 @@
+[loggers]
+keys=root,main
+
+[handlers]
+keys=consoleHandler,fileHandler
+
+[formatters]
+keys=fmt
+
+[logger_root]
+level=DEBUG
+handlers=consoleHandler
+
+[logger_main]
+level=DEBUG
+qualname=file
+handlers=fileHandler
+
+[handler_consoleHandler]
+class=StreamHandler
+level=INFO
+formatter=fmt
+args=(sys.stdout,)
+
+[handler_fileHandler]
+class=FileHandler
+level=DEBUG
+formatter=fmt
+args=('pixiv.log','a','utf-8',False)
+
+[formatter_fmt]
+format=%(asctime)s - %(name)s - %(levelname)s - %(module)s:line:%(lineno)d - %(message)s
+datefmt=%Y-%m-%d %H:%M:%S
\ No newline at end of file
diff --git a/PixivSearch/model/config.py b/PixivSearch/model/config.py
new file mode 100644
index 0000000..315d937
--- /dev/null
+++ b/PixivSearch/model/config.py
@@ -0,0 +1,43 @@
+from django.db import models
+
+
+class param(models.Model):
+ param_name = models.CharField(max_length=10, primary_key=True)
+ param_value = models.CharField(max_length=128)
+
+
+class stat(models.Model):
+ id = models.IntegerField(primary_key=True)
+ danmakus = models.IntegerField()
+ favorites = models.IntegerField()
+ views = models.IntegerField()
+
+ # def json(self):
+ # return bangumi_stat(self['danmakus'],self['favorites'],self['views'])
+
+
+class mediaInfo(models.Model):
+ bangumi_id = models.IntegerField()
+ season_id = models.IntegerField(primary_key=True)
+ media_id = models.IntegerField()
+ chn_name = models.CharField(max_length=128)
+
+ def __str__(self) -> str:
+ i = {'media_id': self.id, 'chn_name': self.chn_name}
+ return i
+
+
+class bangumi_list(models.Model):
+ season_id = models.IntegerField(primary_key=True)
+ badge = models.CharField(max_length=128)
+ brief = models.CharField(max_length=128)
+ copyright = models.CharField(max_length=128)
+ cover = models.CharField(max_length=128)
+ favorites = models.IntegerField()
+ is_finish = models.IntegerField()
+ newest_ep_index = models.IntegerField()
+ pub_time = models.DateTimeField()
+ season_status = models.IntegerField()
+ title = models.CharField(max_length=128)
+ total_count = models.IntegerField()
+ trailer_aid = models.IntegerField()
diff --git a/PixivSearch/model/migrations/0001_initial.py b/PixivSearch/model/migrations/0001_initial.py
new file mode 100644
index 0000000..807f4da
--- /dev/null
+++ b/PixivSearch/model/migrations/0001_initial.py
@@ -0,0 +1,57 @@
+# Generated by Django 2.0 on 2018-03-24 17:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='bangumi_list',
+ fields=[
+ ('season_id', models.IntegerField(primary_key=True, serialize=False)),
+ ('badge', models.CharField(max_length=128)),
+ ('brief', models.CharField(max_length=128)),
+ ('copyright', models.CharField(max_length=128)),
+ ('cover', models.CharField(max_length=128)),
+ ('favorites', models.IntegerField()),
+ ('is_finish', models.IntegerField()),
+ ('newest_ep_index', models.IntegerField()),
+ ('pub_time', models.DateTimeField()),
+ ('season_status', models.IntegerField()),
+ ('title', models.CharField(max_length=128)),
+ ('total_count', models.IntegerField()),
+ ('trailer_aid', models.IntegerField()),
+ ],
+ ),
+ migrations.CreateModel(
+ name='mediaInfo',
+ fields=[
+ ('bangumi_id', models.IntegerField(primary_key=True, serialize=False)),
+ ('season_id', models.IntegerField()),
+ ('media_id', models.IntegerField()),
+ ('chn_name', models.CharField(max_length=128)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='param',
+ fields=[
+ ('param_name', models.CharField(max_length=10, primary_key=True, serialize=False)),
+ ('param_value', models.CharField(max_length=128)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='stat',
+ fields=[
+ ('id', models.IntegerField(primary_key=True, serialize=False)),
+ ('danmakus', models.IntegerField()),
+ ('favorites', models.IntegerField()),
+ ('views', models.IntegerField()),
+ ],
+ ),
+ ]
diff --git a/PixivSearch/pixiv/pixiv.py b/PixivSearch/pixiv/pixiv.py
new file mode 100644
index 0000000..e4c74b6
--- /dev/null
+++ b/PixivSearch/pixiv/pixiv.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python
+# coding:utf-8
+import json
+import os
+import sys
+import threading
+from concurrent import futures
+from datetime import datetime
+
+import requests
+from bs4 import BeautifulSoup
+
+import root
+from PixivSearch.model import config
+from PixivSearch.settings import logger
+from PixivSearch.util import Util
+
+
+headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
+ 'Chrome/56.0.2924.87 Safari/537.36'
+}
+
+lock = threading.Lock() # 多线程全局资源锁
+total = 1
+
+
+def get_cookies():
+ _cookies = {}
+ array = config.param.objects.get(param_name='pixiv_cookie').param_value.split(';')
+ for row in array:
+ k, v = row.strip().split('=', 1)
+ _cookies[k] = v
+ return _cookies
+
+
+def crawl(url):
+ global total
+ req = requests.get(url, headers=headers, cookies=get_cookies()).text
+ tag = BeautifulSoup(req, 'lxml').select('#js-mount-point-search-result-list')[0].attrs['data-items']
+ imageNodes = json.loads(tag)
+ for imageNode in imageNodes:
+ with lock:
+ nodes.append(imageNode)
+
+
+def get_urls(search, page):
+ fmt = 'https://www.pixiv.net/search.php?word={}&order=date_d&p={}'
+ return [fmt.format(search, p) for p in range(1, page)]
+
+
+def get_Img(params):
+ params[1]['imgUrl'] = 'https://i.pximg.net/img-original/img/' + params[1]['url'][-46:-15]
+
+ headers['referer'] = 'https://www.pixiv.net/member_illust.php?mode=medium&illust_id=' + params[1]['illustId']
+
+ suffix = ".jpg"
+ logger.info('开始下载图片:%s%s' % (params[1]['imgUrl'], suffix))
+
+ s = requests.get(params[1]['imgUrl'] + suffix, headers=headers, cookies=get_cookies())
+ if (s.status_code == 404):
+ suffix = '.png'
+ s = requests.get(params[1]['imgUrl'] + suffix, headers=headers, cookies=get_cookies())
+ if (s.status_code == 404):
+ logger.error('无法下载图片:%s' % (params[1]['illustTitle']))
+ return
+
+ logger.info('下载图片:"%s"到%s' % (
+ params[1]['illustTitle'], os.getcwd().replace('\\', '/') + '/' + imgPath + params[1]['illustId'] + suffix))
+ f = open(imgPath + params[1]['illustId'] + suffix, 'wb') # 写入多媒体文件要 b 这个参数
+ f.write(s.content) # 多媒体文件要是用conctent
+ f.close()
+
+ params[1]['localName'] = params[1]['illustId'] + suffix
+ logger.info('排行第%d名,收藏数%d,标题:%s,标签:%s,(%s)前投稿,链接:%s' % (
+ params[0], params[1]['bookmarkCount'], params[1]['illustTitle'], ','.join(params[1]['tags']), '',
+ params[1]['imgUrl']))
+
+fsize = ''
+
+
+def get_nodes(param):
+ global nodes, fsize, imgPath
+ nodes = []
+ start = datetime.now()
+ urls = get_urls(param[1], int(param[2]) + 1)
+ logger.info('开始从P站获取图片数据')
+ with futures.ThreadPoolExecutor(32) as executor:
+ executor.map(crawl, urls)
+
+ # for url in urls:
+ # crawl(url)
+
+ length = len(nodes)
+ logger.info('获取到%d张图片' % (length))
+ logger.info('对图片收藏数进行排序')
+ nodes = sorted(nodes, key=lambda v: v.get('bookmarkCount'), reverse=True)[:int(param[3])] # 按star数降序排序
+ if (param[4] != None and param[4] == 'img'):
+ imgPath = root.getConfigValue('imgPath')
+ if not os.path.exists(imgPath):
+ os.makedirs(imgPath)
+ for file in os.listdir(imgPath):
+ os.remove(imgPath + file)
+ nodes_tup = []
+ start_d = datetime.now()
+ for index, img in enumerate(nodes):
+ nodes_tup.append((index + 1, img))
+ # get_Img((index+1,img))
+
+ with futures.ThreadPoolExecutor(32) as executor:
+ executor.map(get_Img, nodes_tup)
+ print('下载图片花费时间:%s' % (datetime.now() - start_d))
+ logger.info('%s张图片下载完毕' % (len(os.listdir(imgPath))))
+
+ baseZipPath=root.getConfigValue('baseZipPath')
+ if not os.path.exists(baseZipPath):
+ os.makedirs(baseZipPath)
+ zipPath = baseZipPath+ param[1] + '.zip'
+ logger.info('图片打包到:%s' % (zipPath))
+ Util.zip(imgPath, zipPath)
+ fsize = str(round(os.path.getsize(zipPath) / float(1024 * 1024), 2)) + 'MB'
+ logger.info('图包大小:%s' % (fsize))
+
+ tip = '从%d张图片中筛选出收藏数前%s的图片,处理耗时:%s' % (length, param[3], datetime.now() - start)
+ logger.info(tip)
+ return [nodes, tip, fsize]
+
+
+if __name__ == "__main__":
+ if (len(sys.argv)) == 5 and sys.argv[2].isdigit() and sys.argv[3].isdigit():
+ try:
+ get_nodes(sys.argv)
+ except BaseException as e:
+ repr(e)
+
+ else:
+ logger.error('参数不合法')
diff --git a/PixivSearch/settings.py b/PixivSearch/settings.py
new file mode 100644
index 0000000..c1164a7
--- /dev/null
+++ b/PixivSearch/settings.py
@@ -0,0 +1,141 @@
+"""
+Django settings for PixivSearch project.
+
+Generated by 'django-admin startproject' using Django 1.11.7.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.11/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/1.11/ref/settings/
+"""
+import logging.config
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'dh3^+=iugoo*+p_ea4u3dh&b!_zlgs8*m9kc+#*f2eozglsqjh'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = ['*']
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'PixivSearch.model'
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'PixivSearch.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/')],
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'PixivSearch.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
+
+# DATABASES = {
+# 'default': {
+# 'ENGINE': 'django.db.backends.mysql',
+# 'NAME': 'bangumi',
+# 'USER': 'root',
+# 'PASSWORD': '',
+# 'HOST': '184.170.212.72',
+# # 'HOST': 'sukura.top',
+# 'PORT': '3306',
+# }
+# }
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': 'mydatabase',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/1.11/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'Asia/Shanghai'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = False
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/1.11/howto/static-files/
+
+STATIC_URL = '/static/'
+STATICFILES_DIRS = [
+ os.path.join(os.path.dirname(__file__), 'static').replace('\\', '/'),
+]
+
+configPath = '%s/logging.conf' % os.path.dirname(__file__).replace('\\', '/')
+logging.config.fileConfig(configPath)
+logger = logging.getLogger('file')
+
diff --git a/PixivSearch/static/js/jquery-3.2.1.min.js b/PixivSearch/static/js/jquery-3.2.1.min.js
new file mode 100644
index 0000000..644d35e
--- /dev/null
+++ b/PixivSearch/static/js/jquery-3.2.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
+a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/
+
+
+
+
+
+