[
  {
    "path": ".gitattributes",
    "content": "*.js linguist-language=python"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n*/.DS_Store\n/.idea\n*/.idea\n.vscode\n/.vscode\n*/.vscode\n/__pycache__\n*/__pycache__\n\n.README.md"
  },
  {
    "path": "README.md",
    "content": "# <p align=\"center\">Python3 爬虫实战</p>\n\n<br>\n<p align=\"center\">\n    <img src=\"https://zok-blog.oss-cn-hangzhou.aliyuncs.com/pythonlg.jpg\" \n        alt=\"python3 spider\">\n</p>\n\n<br />\n<p align=\"center\">\n    <a href=\"#\"><img src=\"https://img.shields.io/badge/status-updating-brightgreen.svg\"></a>\n    <a href=\"https://www.python.org/downloads/\"><img src=\"https://zok-blog.oss-cn-hangzhou.aliyuncs.com/ico/python-3.7-green.svg\"></a>\n    <a href=\"https://github.com/wkunzhi/Python3-Spider/graphs/contributors\"><img src=\"https://img.shields.io/github/contributors/wkunzhi/Python3-Spider?color=blue\"></a>\n    <a href=\"#\"><img src=\"https://img.shields.io/badge/Branch-master-green.svg?longCache=true\" alt=\"Branch\"></a>\n    <a href=\"#\"><img src=\"https://img.shields.io/github/stars/wkunzhi/Python3-Spider.svg?label=Stars&style=social\"></a>\n    <a href=\"#\"><img src=\"https://img.shields.io/github/forks/wkunzhi/Python3-Spider.svg?label=Forks&style=social\"></a>\n\n</p>\n<br />\n\n\n## 简介\n包含几十个 python3 爬虫实战案例。如果喜欢请 star 与 fork，这是对我继续更新下去的最大支持\n\n\n| Author  | Zok |\n| --- | --- |\n| Email | 362416272@qq.com |\n| 博客 | https://www.zhangkunzhi.com |\n\n\n## QQ讨论群 \n![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/2019/11/18/wx201911181627012x.png?x-oss-process=image/resize,h_150)\n\n\n<br />\n\n\n\n\n-------\n\n\n## Python 爬虫实战\n\n\n> **字体加密**\n\n[天眼查](https://github.com/wkunzhi/Python3-Spider/tree/master/【天眼查】字体加密) | [大众点评](https://github.com/wkunzhi/Python3-Spider/tree/master/【大众点评】字体反爬、坐标反爬) | [谷雨](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【谷雨】数字解密) \n\n> **验证码【仅作学术讨论】**\n\n[w3c-滑块](https://github.com/wkunzhi/Python3-Spider/tree/master/滑动验证码/【w3c】滑块验证) | [腾讯-滑块识别](https://github.com/wkunzhi/Python3-Spider/tree/master/滑动验证码/【腾讯】滑块验证/discriminate.py) ｜ [腾讯滑块拖动 selenium](https://github.com/wkunzhi/Python3-Spider/tree/master/滑动验证码/【腾讯】滑块验证/sel.py)\n\n\n> **参数生成**  \n\n[拼多多](https://github.com/wkunzhi/Python3-Spider/tree/master/【拼多多】登陆参数生成) 失效！ | [小牛在线](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【小牛在线】登录参数生成) | [开鑫贷](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【开鑫贷】登陆参数生成) | [时光网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【时光网】登陆参数生成) | [百度](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度】自动登录) | [公众号密码加密](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【微信】登录参数生成) | [移动](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【移动】登录参数生成) | [好莱客](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【好莱客】参数解析) | [青海移动](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【青海移动】登陆参数生成) | [新浪微博](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【新浪微博】密码解密) | [汽车之家](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【汽车之家】参数解密) | [steam](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【steam】登录) | [百度wap端sig生成](https://github.com/wkunzhi/Python3-Spider/tree/master/%E5%85%B6%E4%BB%96%E5%AE%9E%E6%88%98/%E3%80%90%E7%99%BE%E5%BA%A6%E3%80%91wap%E7%AB%AFsig%E7%94%9F%E6%88%90) \n\n\n> **自动登录**\n\n[淘宝](https://github.com/wkunzhi/Python3-Spider/tree/master/【淘宝】自动登陆) | [5173平台](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【5173网】自动登录) | [房天下](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【房天下】自动登录) | [Glidesky](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【Glidedsky】自动登陆) | [中关村](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【中关村】自动登录) | [9377平台](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【9377网】自动登录) | [逗游](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【逗游】自动登录) | [GitHub](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【GitHub】自动登录) | [万创帮](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【万创帮】自动登录) | [空中网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【空中网】自动登录) | [易通贷](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【易通贷】自动登录) | [DNS](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【DNS】自动登录) | [TCL金融](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【TCL金融】自动登录) | [国鑫所](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【国鑫所】自动登录)  | [满级网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/满级网) | [试客联盟](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【试客联盟】自动登陆)  | [人人网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【人人网】自动登录) | [豆瓣网](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【豆瓣】自动登录)  | [天翼](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【天翼】登录) \n\n> **其他实战**  \n\n[文书网app查询接口](https://github.com/wkunzhi/Python3-Spider/tree/master/【文书】app查询接口) | [抖音无水印视频解析](https://github.com/wkunzhi/Python3-Spider/tree/master/【抖音】无水印视频解析) | [企业名片查询](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【企业名片】企业查询) ｜ [百度找回密码](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度】网页找回密码) ｜ [美女壁纸下载](https://github.com/wkunzhi/Python3-Spider/tree/master/【双色球】头奖分布) |  [美女壁纸下载](https://github.com/wkunzhi/Python3-Spider/tree/master/【壁纸】美女壁纸下载器) | [美团 解析与token生成](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【美团】数据解析、token生成) | [bilibili 视频下载](https://github.com/wkunzhi/Python3-Spider/tree/master/【bilibili】视频下载) | [51job 查岗位](https://github.com/wkunzhi/Python3-Spider/tree/master/【51Job】查岗位) | [百度 翻译](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度】翻译) | [美团 全国区域](https://github.com/wkunzhi/Python3-Spider/tree/master/各站案例/MeiTuanArea) |  [企业名片查询](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【餐饮】查询信息) | [金逸电影 注册](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【金逸电影】自动注册) | [Python加密库Demo](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【Python加密库】Demo) | [百度街拍图片下载](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【百度街拍】图片下载) ｜ [京东商品数据爬取](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【京东】商品数据爬取) | [房价获取](https://github.com/wkunzhi/Python3-Spider/tree/master/其他实战/【房价】房价获取)\n\n\n\n\n## 原创工具\n> 此工具包在我另外一个项目中，欢迎 star\n\n- [【解密工具】可拓展式解密器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Decode)\n- [【自动注册】验证短信接收器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Register)\n- [【付费代理IP池】监控维护器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy)\n- [【cookies池】-美团cookies池](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Cookies)\n- [【跨数据库迁移器】-开发中](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/DataMigration)\n- [【网络图片并发直传OSS】](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/OSS)\n- [【JS攻防-自动生成encrypt结果】](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Jsencrypt)\n\n\n## 【推荐】爬虫练习网\n> 一个很不错的爬虫练习题网，内涵十几个爬虫题目，由浅到深涵盖 **ip反爬、js反爬、字体反爬、验证码** 等题目。安利给大家，博主已撸完。\n\n- 登录网址 http://www.glidedsky.com/login\n- 题分排行榜 http://www.glidedsky.com/rank\n\n![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/%E7%88%AC%E8%99%AB%E9%A2%98%E8%AE%B0%E5%BD%95.png?x-oss-process=image/resize,w_400)\n\n----\n\n##淘宝：自动登录\n\n![自动登录](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/tglog3.gif)\n\n- 打开 `auto_login_pyppeteer.py` Run 代码，输入淘宝账号、密码即可自动登录\n\n\n----\n\n\n##文书网app\n\n[《入门级安卓逆向 - 文书网app爬虫教程》](https://www.zhangkunzhi.com/index.php/archives/162/)\n\n![](https://static.zhangkunzhi.com/typecho/2020/07/24/603402218498341/1595560337.png)\n\n\n\n----\n\n### 美女壁纸下载器\n![美女壁纸下载器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/WX20191106-114450.png)\n\n\n### 双色球头奖分布词云\n![双色球头奖](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20191107/result.jpg?x-oss-process=image/resize,w_700)\n![双色球](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20191107/WX20191108-152008%402x.png?x-oss-process=image/resize,w_700)\n\n### 工具：解码器\n\n![可拓展式编码转换器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/%E7%89%B9%E6%AE%8A.gif)\n\n### 滑块还原识别\n\n![可拓展式编码转换器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/bg.png)\n\n\n![可拓展式编码转换器](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/chache.png)\n\n\n### 腾讯滑块缺口识别\n\n![缺口识别](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/20190818/WX20191011-203441%402x.png?x-oss-process=image/resize,h_200)\n\n\n## QQ 讨论群\n![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/2019/11/18/wx201911181627012x.png?x-oss-process=image/resize,h_300)\n"
  },
  {
    "path": "【51Job】查岗位/select_job.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-15  Python: 3.7\n\nimport requests\nfrom lxml import etree\n\nFormat_str = 'https://search.51job.com/list/000000,000000,0000,00,9,99,{key},2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='\nHeaders = {\n    'User-Agent': \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\"\n}\n\n\nclass GetJob(object):\n\n    def __init__(self, job_name):\n        self.job = job_name\n\n        self.get_info()\n\n    def get_info(self):\n        target_url = Format_str.format(key=self.job)\n        response = requests.get(target_url, headers=Headers)\n        # 编码转换\n        response.encoding = response.apparent_encoding\n        root = etree.HTML(response.text)\n        self.parse(root)\n\n    @staticmethod\n    def parse(root):\n        div_list = root.xpath(\"//div[@class='dw_table']/div[@class='el']\")\n        for div in div_list:\n            money = div.xpath(\"span[@class='t4']/text()\")\n            money = money[0] if money else \"面议\"\n            # 工作名称不可能为空,所以不用判断\n            a = div.xpath(\"p/span/a\")[0]\n            job_name = a.xpath(\"text()\")[0].strip()\n            job_href = a.xpath(\"@href\")[0]\n            date_time = div.xpath(\"span[@class='t5']/text()\")\n            date_time = date_time[0] if date_time else \"没有时间\"\n            print(job_name, money, date_time, job_href)\n            with open('job.csv', 'a', encoding='gb18030') as f:\n                job_list = [job_name, date_time, money, job_href, '\\n']\n                f.write(','.join(job_list))\n\n\nif __name__ == \"__main__\":\n    key = input(\"请输入关键词\")\n    GetJob(key)\n"
  },
  {
    "path": "【bilibili】自动登录/README.md",
    "content": "## B站自动登录\n\n本案例根据 `selenium` 实现。\n\n## 效果图\n\n![image](https://csrftoken.oss-cn-beijing.aliyuncs.com/github/blibili-login-report.png)\n\n## Q&A\n\n> ChromeDriver - WebDriver for Chrome\n\n```\n因为是模拟点击，所以需要下载插件。\n\n点击下方链接即可跳转至下载界面。\n```\n\n> 为什么要模拟滑动多次？\n\n```\n因为获取滑块的偏移量，在模拟操作的时候，机器在控制滑动速度的时候比较均匀，可能会被判定为机器。\n\n当然了，我们会在今后给予更好的滑动支持~ \n```\n\n[下载ChromeDriver](https://chromedriver.chromium.org/downloads)\n\n## Support\n\n```\n案例于 2020-04-23 前均可用，如有疑问请联系作者。\n```\n\n## Donate\n\nThanks ~\n"
  },
  {
    "path": "【bilibili】自动登录/__init__.py",
    "content": "#! /usr/bin/env python\n# -*- coding: utf-8 -*-\n# Date: 2020/4/23\n"
  },
  {
    "path": "【bilibili】自动登录/login.py",
    "content": "#! /usr/bin/env python\n# -*- coding: utf-8 -*-\n# Date: 2020/4/23\n\nimport time\nimport base64\nimport random\n\nfrom io import BytesIO\nfrom PIL import Image\n\nfrom selenium import webdriver\nfrom selenium.webdriver import ActionChains\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as ec\n\n\nBROWSER_EXECUTABLE_PATH = \"/Users/liuzhichao/PycharmProjects/bilibili/chromedriver\"\n\n\nclass LoginBli:\n\n    # 登录URI\n    login_url = \"https://passport.bilibili.com/login\"\n\n    def __init__(self, username, password):\n        \"\"\"初始化\n\n        Parameters\n        ----------\n        username: string\n            B站账号\n\n        password: string\n            B站密码\n\n        \"\"\"\n        self.username = username\n        self.password = password\n        # 定义浏览器\n        self.browser = webdriver.Chrome(executable_path=BROWSER_EXECUTABLE_PATH)\n        # 定义显示等待\n        self.wait = WebDriverWait(self.browser, 20)\n\n    def open(self):\n        \"\"\"模拟点击登陆\n\n        自动打开浏览器, 进入登陆界面\n        输入用户名, 密码\n        \"\"\"\n        # 打开浏览器, 进入登陆界面\n        self.browser.get(self.login_url)\n\n        # 用户名输入框\n        self.wait.until(\n            ec.presence_of_element_located((By.ID, 'login-username'))\n        ).send_keys(self.username)\n        # 清空用户名输入框\n\n        # 密码输入框\n        self.wait.until(\n            ec.presence_of_element_located((By.ID, 'login-passwd'))\n        ).send_keys(self.password)\n        # 清空密码输入框\n\n        # 登录按钮\n        login_button = self.wait.until(\n            ec.presence_of_element_located((By.XPATH, '//*[@id=\"geetest-wrap\"]/div/div[5]/a[1]'))\n        )\n        # 点击登录\n        login_button.click()\n        # 防止因网络波动，图片加载过慢，等待加载出来\n        time.sleep(2)\n\n    def get_geetest_image(self):\n        \"\"\"\n        获取极验验证码图片\n\n        \"\"\"\n        image_name = [\"geetest_canvas_fullbg\", \"geetest_canvas_bg\"]\n        image = []\n        for index in range(0, 2):\n            # 执行js 拿到canvas画布里面的图片数据\n            js = f'return document.getElementsByClassName(\"{image_name[index]}\")[0].toDataURL(\"image/png\");'\n            # 图片数据\n            complete_img_data = self.browser.execute_script(js)\n            # base64 编码的图片信息\n            complete_img_base64 = complete_img_data.split(',')[1]\n            # 转成bytes类型\n            complete_img = base64.b64decode(complete_img_base64)\n            # 加载图片 return 回去对比\n            image_c = Image.open(BytesIO(complete_img))\n            image_c.save(f'image{index + 1}.png')\n            image.append(image_c)\n\n        return image\n\n    def is_pixel_similar(self, image1, image2, x, y):\n        \"\"\"比较两张图片的像素点\n\n        注意：像素点比较是有偏差的，需要允许一定范围的误差，我们可以设置一个阈值\n\n        \"\"\"\n        # 获取两张图片执行位置的像素点\n        c_pixel = image1.load()[x, y]\n        ic_pixel = image2.load()[x, y]\n        # 阈值 允许误差\n        threshold = 10\n        # 对比\n        if abs(c_pixel[0] - ic_pixel[0]) < threshold and \\\n                abs(c_pixel[1] - ic_pixel[1]) < threshold and \\\n                abs(c_pixel[2] - ic_pixel[2]) < threshold:\n            return True\n        return False\n\n    def get_slice_gap(self, image1, image2):\n        \"\"\"获取缺口的偏移量\n\n        通过比较两张图片的所有像素点, 获取两张图片是从哪里开始不同\n        从而得到 移动块 要在 x 方向移动的距离\n\n        返回 缺口的偏移量\n\n        Parameters\n        ----------\n        image1: Image instance\n            完整的图片\n\n        image2: Image instance\n            有缺失的图片\n\n        Returns\n        ---------\n        int\n        \"\"\"\n        # image2.size:['width', 'height']\n        for x in range(image1.size[0]):\n            for y in range(image1.size[1]):\n                if not self.is_pixel_similar(image1, image2, x, y):\n                    # 移动块只在水平方向移动 只需返回 x\n                    return x\n\n    def get_track(self, distance):\n        \"\"\"根据偏移量获取移动轨迹\n\n        返回 移动轨迹\n\n        Parameters\n        ----------\n        distance: int\n            偏移量\n\n        Returns\n        ---------\n        int\n        \"\"\"\n        # 移动轨迹\n        track = []\n        # 当前位移\n        current = 0\n        # 减速阈值\n\n        mid = distance * 4 / 5\n        # 计算间隔\n        t = 0.2\n        # 初速度\n        v = 0\n\n        while current < distance:\n            if current < mid:\n                # 加速度为正2\n                a = 20\n            else:\n                # 加速度为负3\n                a = -30\n            # 初速度v0\n            v0 = v\n            # 当前速度v = v0 + at\n            v = v0 + a * t\n            # 移动距离x = v0t + 1/2 * a * t^2\n            move = v0 * t + 1 / 2 * a * t * t\n            # 当前位移\n            current += move\n            # 加入轨迹\n            track.append(round(move))\n        return track\n\n    def move_to_gap(self, slider, tracks):\n        \"\"\"模拟人工将滑块到缺口处\n\n        Parameters\n        ----------\n        slider: Any\n            滑块\n\n        tracks: Any\n            轨迹\n\n        \"\"\"\n        ActionChains(self.browser).click_and_hold(slider).perform()\n        for x in tracks:\n            ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()\n        time.sleep(random.random())\n        ActionChains(self.browser).release().perform()\n\n    def get_geetest_button(self):\n        \"\"\"获取初始验证按钮\n        \"\"\"\n        return self.wait.until(ec.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))\n\n    def login_success(self):\n        \"\"\"判定是否登录成功\n\n        响应一个布尔值\n\n        Returns\n        ----------\n        bool\n        \"\"\"\n        try:\n            # 登录成功后 界面上会有一个消息按钮\n            return bool(\n                WebDriverWait(self.browser, 5).until(ec.presence_of_element_located(\n                    (By.XPATH, '//a[@href=\"//message.bilibili.com/new\"]'))\n                )\n            )\n        except Exception as exc:\n            print(exc)\n            return False\n\n    def login(self):\n        \"\"\"开始\n\n        \"\"\"\n\n        # 打开浏览器, 输入账号 密码, 点击登陆\n        self.open()\n        # 获取验证图 image2(有缺失的验证图) image1(完整的验证图)\n        image1, image2 = self.get_geetest_image()\n\n        # 获取缺口的偏移量\n        gap = self.get_slice_gap(image1, image2)\n\n        print(f'缺口的偏移量为：{gap}')\n        # 拖动滑块 有误差-8\n        track = self.get_track(gap - 12)\n        slider = self.get_geetest_button()\n        self.move_to_gap(slider, track)\n        time.sleep(3)\n\n        if self.login_success():\n            print('登陆成功，获取 cookie 成功 ~ ')\n            cookies = {cookie[\"name\"]: cookie[\"value\"] for cookie in self.browser.get_cookies()}\n            print(cookies)\n        else:\n            self.login()\n\n\nif __name__ == '__main__':\n    account = input(\"请输入B站账号 >>>\")\n    pwd = input(\"请输入B站密码 >>>\")\n\n    instance = LoginBli(account, pwd)\n    instance.login()\n"
  },
  {
    "path": "【bilibili】视频下载/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-09  Python: 3.7\n\n"
  },
  {
    "path": "【bilibili】视频下载/video_download.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-09  Python: 3.7\nimport requests\nimport urllib.request\nimport time\nimport hashlib\nimport urllib\nimport re\n\nfrom moviepy.editor import *  # moviepy==0.2.3.2\n\n\nclass DownVideo(object):\n    \"\"\"\n    urllib.urlretrieve 的回调函数：\n    def callbackfunc(blocknum, blocksize, totalsize):\n        @blocknum:  已经下载的数据块\n        @blocksize: 数据块的大小\n        @totalsize: 远程文件的大小\n    \"\"\"\n    # start_time = None\n\n    def __init__(self,start_go):\n        self.start_go = start_go\n\n    def get_cid_list(self):\n        start_url = 'https://api.bilibili.com/x/web-interface/view?aid=' + re.search(r'/av(\\d+)/*', self.start_go).group(1)\n        # 视频质量\n        quality = 16  # 1080p:80;720p:64;480p:32;360p:16  默认360p\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}\n        html = requests.get(start_url, headers=headers).json()\n        data = html['data']\n        video_title = data[\"title\"].replace(\" \", \"_\")\n        cid_list = []\n        if '?p=' in start:\n            # 单独下载分P视频中的一集\n            p = re.search(r'\\?p=(\\d+)', start).group(1)\n            cid_list.append(data['pages'][int(p) - 1])\n        else:\n            # 如果p不存在就是全集下载\n            cid_list = data['pages']\n\n        for item in cid_list:\n            cid = str(item['cid'])\n            title = item['part']\n            if not title:\n                title = video_title\n            title = re.sub(r'[\\/\\\\:*?\"<>|]', '', title)  # 替换为空的\n            print('标题:' + title, 'ID', cid)\n            page = str(item['page'])\n            start_url = start_url + \"/?p=\" + page\n            video_list = down.get_play_list(start_url, cid, quality)\n            self.start_time = time.time()\n            down.down_video(video_list, title, start_url, page)\n            down.combine_video(video_list, title)\n\n        print('下载完成了，快去撸视频吧')\n\n    @staticmethod\n    def get_play_list(start_url, cid, quality):\n        \"\"\"\n        访问API\n        \"\"\"\n        entropy = 'rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg'\n        appkey, sec = ''.join([chr(ord(i) + 2) for i in entropy[::-1]]).split(':')\n        params = 'appkey=%s&cid=%s&otype=json&qn=%s&quality=%s&type=' % (appkey, cid, quality, quality)\n        chksum = hashlib.md5(bytes(params + sec, 'utf8')).hexdigest()\n        url_api = 'https://interface.bilibili.com/v2/playurl?%s&sign=%s' % (params, chksum)\n        headers = {\n            'Referer': start_url,\n            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'\n        }\n        html = requests.get(url_api, headers=headers).json()\n        video_list = [html['durl'][0]['url']]\n        return video_list\n\n    def schedule_cmd(self, blocknum, blocksize, totalsize):\n        speed = (blocknum * blocksize) / (time.time() - self.start_time)\n        speed_str = \" Speed: %s\" % self.format_size(speed)\n        recv_size = blocknum * blocksize\n\n        # 设置下载进度条\n        f = sys.stdout\n        pervent = recv_size / totalsize\n        percent_str = \"%.2f%%\" % (pervent * 100)\n        n = round(pervent * 50)\n        s = ('#' * n).ljust(50, '-')\n        f.write(percent_str.ljust(8, ' ') + '[' + s + ']' + speed_str)\n        f.flush()\n        f.write('\\r')\n\n    def schedule(self, blocknum, blocksize, totalsize):\n        \"\"\"时间表\n        \"\"\"\n        speed = (blocknum * blocksize) / (time.time() - self.start_time)\n        speed_str = \" Speed: %s\" % self.format_size(speed)\n        recv_size = blocknum * blocksize\n\n        # 设置下载进度条\n        f = sys.stdout\n        pervent = recv_size / totalsize\n        percent_str = \"%.2f%%\" % (pervent * 100)\n        n = round(pervent * 50)\n        s = ('#' * n).ljust(50, '-')\n        print(percent_str.ljust(6, ' ') + '-' + speed_str)\n        f.flush()\n        time.sleep(2)\n\n    @staticmethod\n    def format_size(bytes):\n        \"\"\"字节bytes转化K\\M\\G\n        \"\"\"\n        try:\n            bytes = float(bytes)\n            kb = bytes / 1024\n        except:\n            print(\"传入的字节格式不对\")\n            return \"Error\"\n        if kb >= 1024:\n            M = kb / 1024\n            if M >= 1024:\n                G = M / 1024\n                return \"%.3fG\" % (G)\n            else:\n                return \"%.3fM\" % (M)\n        else:\n            return \"%.3fK\" % (kb)\n\n    def down_video(self, video_list, title, start_url, page):\n        \"\"\"下载视频\n        \"\"\"\n        num = 1\n        print('正在下载请稍等...'.format(page))\n        current_video_path = os.path.join(sys.path[0], 'bilibili下载目录', title)  # 当前目录作为下载目录\n        for i in video_list:\n            opener = urllib.request.build_opener()\n            # 请求头\n            opener.addheaders = [\n                # ('Host', 'upos-hz-mirrorks3.acgvideo.com'),  #注意修改host,不用也行\n                ('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0) Gecko/20100101 Firefox/56.0'),\n                ('Accept', '*/*'),\n                ('Accept-Language', 'en-US,en;q=0.5'),\n                ('Accept-Encoding', 'gzip, deflate, br'),\n                ('Range', 'bytes=0-'),  # Range 的值要为 bytes=0- 才能下载完整视频\n                ('Referer', start_url),  # 注意修改referer,必须要加的!\n                ('Origin', 'https://www.bilibili.com'),\n                ('Connection', 'keep-alive'),\n            ]\n            urllib.request.install_opener(opener)\n            # 创建文件夹存放下载的视频\n            if not os.path.exists(current_video_path):\n                os.makedirs(current_video_path)\n            # 开始下载\n            if len(video_list) > 1:\n                urllib.request.urlretrieve(url=i,\n                                           filename=os.path.join(current_video_path, r'{}-{}.mp4'.format(title, num)),\n                                           reporthook=self.schedule_cmd)\n            else:\n                urllib.request.urlretrieve(url=i, filename=os.path.join(current_video_path, r'{}.mp4'.format(title)),\n                                           reporthook=self.schedule_cmd)\n            num += 1\n\n    @staticmethod\n    def combine_video(video_list, title):\n        \"\"\"合并视频\n        \"\"\"\n        current_video_path = os.path.join(sys.path[0], 'bilibili_video', title)  # 当前目录作为下载目录\n        if len(video_list) >= 2:\n            # 视频大于一段才要合并\n            print('下载完成,正在合并视频...' + title)\n            # 定义一个数组\n            L = []\n            # 访问 video 文件夹 (假设视频都放在这里面)\n            root_dir = current_video_path\n            # 遍历所有文件\n            for file in sorted(os.listdir(root_dir), key=lambda x: int(x[x.rindex(\"-\") + 1:x.rindex(\".\")])):\n                # 如果后缀名为 .mp4/.flv\n                if os.path.splitext(file)[1] == '.flv':\n                    # 拼接成完整路径\n                    filePath = os.path.join(root_dir, file)\n                    # 载入视频\n                    video = VideoFileClip(filePath)\n                    # 添加到数组\n                    L.append(video)\n            # 拼接视频\n            final_clip = concatenate_videoclips(L)\n            # 生成目标视频文件\n            final_clip.to_videofile(os.path.join(root_dir, r'{}.mp4'.format(title)), fps=24, remove_temp=False)\n            print('视频合并完成' + title)\n\n        else:\n            # 视频只有一段则直接打印下载完成\n            print('视频合并完成:' + title)\n\n\nif __name__ == '__main__':\n    start = input('请填写网页链接:')\n    # 例如： https://www.bilibili.com/video/av50782610\n\n    # 下载清晰度可以设置\n\n    # 实例化下载类\n    down = DownVideo(start)\n    down.get_cid_list()\n\n\n"
  },
  {
    "path": "【双色球】头奖分布/main.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-08  Python: 3.7\nimport requests\nimport json\nimport pandas as pd\nimport openpyxl\nimport jieba\nimport wordcloud\nimport matplotlib.pyplot as plt\n\n\nclass SSQ:\n    def __init__(self, file, font):\n        self.header = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36',\n            'Host': 'www.cwl.gov.cn',\n            'Referer': 'http://www.cwl.gov.cn/kjxx/ssq/kjgg/'\n        }\n        self.file = file\n        self.font = font\n        self.get_history_url = 'http://www.cwl.gov.cn/cwl_admin/kjxx/findDrawNotice?name=ssq&issueCount=100'\n        self.session = requests.session()\n\n    def history(self):\n        \"\"\"爬取最近100期\"\"\"\n        _dict = None\n        try:\n            self.session.get('http://www.cwl.gov.cn/kjxx/ssq/kjgg/')\n            _dict = json.loads(self.session.get(self.get_history_url, headers=self.header).text)\n        except TypeError:\n            print('获取历史记录失败')\n        finally:\n            return _dict\n\n    def clean_data(self, data):\n        \"\"\"\n        清洗数据\n        :return:\n        \"\"\"\n        columns = []\n\n        for item in data.get('result'):\n            columns.append([\n                item.get('code'),\n                item.get('date'),\n                item.get('week'),\n                item.get('red').split(','),\n                item.get('blue'),\n                item.get('sales'),\n                item.get('poolmoney'),\n                item.get('content'),\n                item.get('prizegrades')[0].get('typemoney'),\n                item.get('prizegrades')[0].get('typenum'),\n                item.get('prizegrades')[1].get('typemoney'),\n                item.get('prizegrades')[1].get('typenum'),\n                item.get('prizegrades')[2].get('typemoney'),\n                item.get('prizegrades')[2].get('typenum'),\n            ])\n\n        df = pd.DataFrame(\n            columns,\n            columns=[\"期数\", \"开奖日期\", \"星期数\", \"红球\", \"蓝球\", \"销售金额\", \"奖池\", \"中奖地区\", \"一等奖金\", \"一等奖人数\", \"二等奖金\", \"二等奖人数\", \"三等奖金\", \"三等奖人数\"],  # 指定列\n        )\n        self.save(df)\n        self.set_data(df)\n\n    def save(self, df):\n        \"\"\"储存\n        \"\"\"\n        df.to_excel(self.file)\n\n    def set_data(self, df):\n        \"\"\"\n        数据预处理\n        :return:\n        \"\"\"\n        cut_text = []\n        for i in df['中奖地区']:\n            for addr in i.split(',')[:-1]:\n                name, num = jieba.cut(addr[:-1])\n                for n in range(int(num)):\n                    cut_text.append(name)\n        print(\" \".join(cut_text))\n\n        w = wordcloud.WordCloud(font_path=self.font, background_color=\"white\", scale=4)\n        w.generate(\" \".join(cut_text))\n        plt.imshow(w, interpolation=\"bilinear\")\n        plt.axis(\"off\")\n        # plt.show()\n        # 保存生成的图片\n        w.to_file('result.jpg')\n\n    def parse_history(self):\n        \"\"\"\n        pandas 载入数据\n        :return:\n        \"\"\"\n        data = self.history()\n        self.clean_data(data)\n\n\nif __name__ == \"__main__\":\n    \"\"\"\n    请自行准备一个字体文件并导入路径\n    \"\"\"\n    ssq = SSQ('近期记录.xlsx', '你自己准备的字库路径')\n    ssq.parse_history()\n"
  },
  {
    "path": "【壁纸】美女壁纸下载器/bg_down.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-06  Python: 3.7\n\nfrom requests import get\nfrom filetype import guess\nfrom os import rename\nfrom os import makedirs\nfrom os.path import exists\nfrom json import loads\nfrom contextlib import closing\n\n\nclass DownBg:\n    \"\"\"\n    超级高清图片下载\n    \"\"\"\n    def __init__(self):\n        self.headers = {\n            \"User-Agent\": \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\"\n        }\n\n    def down_load(self, file_url, file_full_name, now_photo_count, all_photo_count):\n\n        # 开始下载图片\n        with closing(get(file_url, headers=self.headers, stream=True)) as response:\n            chunk_size = 1024  # 单次请求最大值\n            content_size = int(response.headers['content-length'])  # 文件总大小\n            data_count = 0  # 当前已传输的大小\n            with open(file_full_name, \"wb\") as file:\n                for data in response.iter_content(chunk_size=chunk_size):\n                    file.write(data)\n                    done_block = int((data_count / content_size) * 50)\n                    data_count = data_count + len(data)\n                    now_jd = (data_count / content_size) * 100\n                    print(\"\\r %s：[%s%s] %d%% %d/%d\" % (\n                        file_full_name, done_block * '█', ' ' * (50 - 1 - done_block), now_jd, now_photo_count,\n                        all_photo_count), end=\" \")\n        # 下载完图片后获取图片扩展名，并为其增加扩展名\n        file_type = guess(file_full_name)\n        rename(file_full_name, file_full_name + '.' + file_type.extension)\n\n    def crawler_photo(self, type_id, photo_count):\n        \"\"\"\n        :param type_id: 最新 1, 最热 2, 女生 3, 星空 4\n        :param photo_count:  下载数量\n        :return:\n        \"\"\"\n        type_dict = {\n            '1': '5c68ffb9463b7fbfe72b0db0',\n            '2': '5c69251c9b1c011c41bb97be',\n            '3': '5c81087e6aee28c541eefc26',\n            '4': '5c81f64c96fad8fe211f5367'\n        }\n\n        url = 'https://service.paper.meiyuan.in/api/v2/columns/flow/{key}?page=1&per_page='.format(\n            key=type_dict.get(str(type_id))) + str(photo_count)\n\n        # 获取图片列表数据\n        respond = get(url, headers=self.headers)\n        photo_data = loads(respond.content)\n\n        # 已经下载的图片张数\n        now_photo_count = 1\n\n        # 所有图片张数\n        all_photo_count = len(photo_data)\n\n        # 开始下载并保存5K分辨率壁纸\n        for photo in photo_data:\n\n            # 创建一个文件夹存放我们下载的图片\n            if not exists('./' + str(type_id)):\n                makedirs('./' + str(type_id))\n\n            # 准备下载的图片链接\n            file_url = photo['urls']['raw']\n\n            # 准备下载的图片名称,不包含扩展名\n            file_name_only = file_url.split('/')\n            file_name_only = file_name_only[len(file_name_only) - 1]\n\n            # 准备保存到本地的完整路径\n            file_full_name = './' + str(type_id) + '/' + file_name_only\n\n            # 开始下载图片\n            self.down_load(file_url, file_full_name, now_photo_count, all_photo_count)\n            now_photo_count = now_photo_count + 1\n\n\nif __name__ == '__main__':\n    dg = DownBg()\n\n    wall_paper_id = 1\n    wall_paper_count = 10\n    while True:\n        wall_paper_id = input(\"\\n\\n壁纸类型：最新壁纸 1, 最热壁纸 2, 女生壁纸 3, 星空壁纸 4\\n请输入编号以便选择5K超清壁纸类型：\")\n        wall_paper_count = input(\"请输入要下载的5K超清壁纸的数量：\")\n\n        if wall_paper_id not in ['1', '2', '3', '4'] or not wall_paper_count.isdigit():\n            print('输入有误')\n            continue\n\n        print(\"正在下载5K超清壁纸，请稍等……\")\n        dg.crawler_photo(int(wall_paper_id), int(wall_paper_count))\n        print('\\n下载5K高清壁纸成功!')\n"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/参数生成/encryp.js",
    "content": "function make() {\n    for (var t = 1 * new Date, n = 0; t === 1 * new Date && n < 200;) n++;\n    return t.toString(16) + n.toString(16)\n}\n\nfunction test(love, you, babby) {\n    var t = (you * babby).toString(16);\n    return make() + \"-\" + Math.random().toString(16).replace(\".\", \"\") + \"-\" + function () {\n        var t = love,\n            n = void 0,\n            e = void 0,\n            i = [],\n            r = 0;\n\n        function o(t, n) {\n            var e = void 0,\n                r = 0;\n            for (e = 0; e < n.length; e++) r |= i[e] << 8 * e;\n            return t ^ r\n        }\n\n        for (n = 0; n < t.length; n++) e = t.charCodeAt(n), i.unshift(255 & e), 4 <= i.length && (r = o(r, i), i = []);\n        return 0 < i.length && (r = o(r, i)), r.toString(16)\n    }() + \"-\" + t + \"-\" + make()\n}\n\nfunction now_uu() {\n    return (65536 * (1 + Math.random()) | 0).toString(16).substring(1)\n}\nfunction puid() {\n    return  \"owl-\" +now_uu() + now_uu() + \"-\" + now_uu() + \"-\" + now_uu() + \"-\" + now_uu() + \"-\" + now_uu() + now_uu() + now_uu()\n}"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/参数生成/uid.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-15  Python: 3.7\nimport execjs.runtime_names\nimport random\nimport requests\nimport time\nfrom faker import Faker\n\n\ninfo = random.choice([[800, 1024], [900, 1440], [1050, 1680], [1200, 1920], [1200, 1600]])\n\nwith open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n    js = execjs.compile(f.read())\n\nprint('引擎', execjs.get().name)\nuid = js.call('test', Faker().user_agent(), info[0], info[1])\npage_id = js.call('puid')\n\n\nheaders = {\n    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',\n    'Host': 'catfront.dianping.com',\n    'Referer': 'http://www.dianping.com/shop/97789651',\n    'Origin': 'http://www.dianping.com',\n}\n\nheaders2 = {\n    'Cookie': \"_lxsdk_cuid=16e8184bc7cc8-00733806cb0caf-d087704-13c680-16e8184bc7cc8;\",\n    'Referer': 'http://www.dianping.com/shop/76311084',\n    'Host': 'www.dianping.com',\n    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',\n}\nsign_url = 'http://catfront.dianping.com/api/pv?v=1&sdk=1.8.13&project=app-pc-main-shop&pageurl=main-shop&pageId={pageId}&timestamp={timestamp}&region=&operator=&network=&container=&os=&unionid={unionid}'\nsession = requests.session()\nsession.get('http://www.dianping.com/shop/76311084', headers=headers2)\nresponse = session.post(sign_url.format(pageId=page_id, unionid=uid, timestamp=str(int(round(time.time() * 1000)))), headers=headers)\nprint(uid, page_id)\nprint(response)\n\n\n"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/旧版/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-12  Python: 3.7\n\n"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/旧版/parse_address_poi.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-03-27  Python: 3.7\n\n\ndef to_base36(value):\n    \"\"\"converts a decimal integer to a 36 decimal string\"\"\"\n    if not isinstance(value, int):\n        raise TypeError(\"expected int, got %s: %r\" % (value.__class__.__name__, value))\n\n    if value == 0:\n        return \"0\"\n\n    if value < 0:\n        sign = \"-\"\n        value = -value\n    else:\n        sign = \"\"\n\n    result = []\n\n    while value:\n        value, mod = divmod(value, 36)\n        result.append(\"0123456789abcdefghijklmnopqrstuvwxyz\"[mod])\n\n    return sign + \"\".join(reversed(result))\n\n\ndef decode(C):\n    \"\"\"parse poi\"\"\"\n    digi = 16\n    add = 10\n    plus = 7\n    cha = 36\n    I = -1\n    H = 0\n    B = ''\n    J = len(C)\n    G = ord(C[-1])\n    C = C[:-1]\n    J -= 1\n\n    for E in range(J):\n        D = int(C[E], cha) - add\n        if D >= add:\n            D = D - plus\n        B += to_base36(D)\n        if D > H:\n            I = E\n            H = D\n\n    A = int(B[:I], digi)\n    F = int(B[I + 1:], digi)\n    L = (A + F - int(G)) / 2\n    K = float(F - L) / 100000\n    L = float(L) / 100000\n    return {'lng': L, 'lat': K}\n\n\nif __name__ == '__main__':\n    print(decode('HFHSGGZTWSATFG'))\n"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/旧版/parse_font_css.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"362416272@QQ.COM\"\n# Date: 2019/3/25  Python: 3.7.2\n\nimport re\nfrom lxml import etree\nfrom requests_html import HTMLSession\n\n\nclass DianPing(object):\n    def __init__(self):\n        # 此处以爬取第一页中的评论数为例\n        self.stat_url = 'http://www.dianping.com/huizhou/ch10/g103'\n\n    @staticmethod\n    def parse_url(url):\n        # 解析并返回页面内容\n        session = HTMLSession()\n        response = session.get(url)\n        return response.content.decode()\n\n    # 定义css的URL地址\n    def get_css(self, html):\n        svg_text_css = re.search(r'href=\"([^\"]+svgtextcss[^\"]+)\"', html, re.M)\n        if not svg_text_css:\n            raise Exception(\"未找到链接\")\n        css_url = svg_text_css.group(1)\n        content = self.parse_url('https:' + css_url)\n        return content\n\n    # 获取定义偏移量的css文件后将结果以字典形式存储\n    @ staticmethod\n    def get_css_offset(content_css):\n        \"\"\"\n        通过传入页面中任意css获取其对应的偏移量\n        :return: {'xxx': ['192', '1550']}\n        \"\"\"\n        offset_item = re.findall(r'(\\.[a-zA-Z0-9-]+)\\{background:-(\\d+).0px -(\\d+).0px', content_css)\n        result = {}\n        for item in offset_item:\n            css_class = item[0][1:]\n            x_offset = item[1]\n            y_offset = item[2]\n            result[css_class] = [x_offset, y_offset]\n        return result\n\n    # 获取svg url组\n    @staticmethod\n    def get_svg_url_dict(content_css):\n        items = re.findall(r'span\\[class\\^=\"(.*?)\"\\].*?width: (\\d+)px;.*?background-image: url\\((.*?)\\);', content_css)\n        result = {}\n        for code, size, url in items:\n            svg_list = [int(size), 'https:' + url]\n            result[code] = svg_list\n        return result\n\n    # 根据偏移量找到对应的数字\n    def parse_comment_css(self, svg_url, size, x_offset, y_offset):\n        # print(size)  # 要用size做像素偏移，做裴勇\n        svg_html = self.parse_url(svg_url)\n        pattern = re.compile(r'y=.*?(\\d+)\">(\\d+)</text>', re.S)\n        items = re.findall(pattern, svg_html)\n        svg_list = []\n        for item in items:\n            svg = {'y_key': int(item[0]), 'text': item[1]}\n            svg_list.append(svg)\n        x, y = int(x_offset), int(y_offset)\n        if y <= svg_list[0]['y_key']:\n            return svg_list[0]['text'][x // 12]\n        elif y <= svg_list[1]['y_key']:\n            return svg_list[1]['text'][x // 12]\n        else:\n            return svg_list[2]['text'][x // 12]\n\n    # 获取点评数\n    def get_comment_num(self):\n        content = self.parse_url(self.stat_url)\n        html = etree.HTML(content)\n        shops = html.xpath('.//div[@id=\"shop-all-list\"]/ul/li')  # 获取到所有店面\n        content_css = self.get_css(content)\n        css_class_dirt = self.get_css_offset(content_css)  # 偏移量字典存储\n        svg_url_dict = self.get_svg_url_dict(content_css)  # svg的url dict储存\n        for shop in shops:\n            shop_name = shop.xpath('.//div[@class=\"tit\"]/a/@title')[0]  # 获取店名\n            review_num = shop.xpath('.//div[@class=\"comment\"]/a[contains(@class,\"review-num\")]/b')[0]  # 获取可见的数字\n            num = 0\n            if review_num.text:\n                # if 有可见字\n                num = int(review_num.text)\n            for review_node in review_num:\n                \"\"\"每个字符解密一次\"\"\"\n                css_class = review_node.attrib[\"class\"]  # 取css名\n                # 根据css名称获取偏移量\n                x_offset, y_offset = css_class_dirt[css_class][0], css_class_dirt[css_class][1]\n                # 根据偏移量来找到对应的数字\n                svg = svg_url_dict[css_class[:2]]\n                if not svg:\n                    svg = svg_url_dict[css_class[:3]]\n                size = svg[0]\n                svg_url = svg[1]\n                new_num = self.parse_comment_css(svg_url, size, x_offset, y_offset)\n                num = num * 10 + int(new_num)\n            print(\"餐馆: {}, 点评数: {}\".format(shop_name, num))\n\n\nif __name__ == '__main__':\n    dian_ping = DianPing()\n    dian_ping.get_comment_num()\n"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/最新版7月/README.md",
    "content": "# 仅限学术交流\n# 如有冒犯请立即联系作者删除\n\n# 安装\n**`pip3 install fontTools`**\n\n**`pip3 install requests`**\n\n**`pip3 install redis`**\n\n\n# 使用\n1. 需要开启 redis 库 并配置，默认链接的本机 redis \n2. 参考 `main.py` 中的调用代码\n\n**[参考博客链接](https://www.zhangkunzhi.com/archives/72)**"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/最新版7月/font.json",
    "content": "{\"FONT_LIST\": [\n    \"\",\n    \"\",\n    \"1\",\n    \"2\",\n    \"3\",\n    \"4\",\n    \"5\",\n    \"6\",\n    \"7\",\n    \"8\",\n    \"9\",\n    \"0\",\n    \"店\",\n    \"中\",\n    \"美\",\n    \"家\",\n    \"馆\",\n    \"小\",\n    \"车\",\n    \"大\",\n    \"市\",\n    \"公\",\n    \"酒\",\n    \"行\",\n    \"国\",\n    \"品\",\n    \"发\",\n    \"电\",\n    \"金\",\n    \"心\",\n    \"业\",\n    \"商\",\n    \"司\",\n    \"超\",\n    \"生\",\n    \"装\",\n    \"园\",\n    \"场\",\n    \"食\",\n    \"有\",\n    \"新\",\n    \"限\",\n    \"天\",\n    \"面\",\n    \"工\",\n    \"服\",\n    \"海\",\n    \"华\",\n    \"水\",\n    \"房\",\n    \"饰\",\n    \"城\",\n    \"乐\",\n    \"汽\",\n    \"香\",\n    \"部\",\n    \"利\",\n    \"子\",\n    \"老\",\n    \"艺\",\n    \"花\",\n    \"专\",\n    \"东\",\n    \"肉\",\n    \"菜\",\n    \"学\",\n    \"福\",\n    \"饭\",\n    \"人\",\n    \"百\",\n    \"餐\",\n    \"茶\",\n    \"务\",\n    \"通\",\n    \"味\",\n    \"所\",\n    \"山\",\n    \"区\",\n    \"门\",\n    \"药\",\n    \"银\",\n    \"农\",\n    \"龙\",\n    \"停\",\n    \"尚\",\n    \"安\",\n    \"广\",\n    \"鑫\",\n    \"一\",\n    \"容\",\n    \"动\",\n    \"南\",\n    \"具\",\n    \"源\",\n    \"兴\",\n    \"鲜\",\n    \"记\",\n    \"时\",\n    \"机\",\n    \"烤\",\n    \"文\",\n    \"康\",\n    \"信\",\n    \"果\",\n    \"阳\",\n    \"理\",\n    \"锅\",\n    \"宝\",\n    \"达\",\n    \"地\",\n    \"儿\",\n    \"衣\",\n    \"特\",\n    \"产\",\n    \"西\",\n    \"批\",\n    \"坊\",\n    \"州\",\n    \"牛\",\n    \"佳\",\n    \"化\",\n    \"五\",\n    \"米\",\n    \"修\",\n    \"爱\",\n    \"北\",\n    \"养\",\n    \"卖\",\n    \"建\",\n    \"材\",\n    \"三\",\n    \"会\",\n    \"鸡\",\n    \"室\",\n    \"红\",\n    \"站\",\n    \"德\",\n    \"王\",\n    \"光\",\n    \"名\",\n    \"丽\",\n    \"油\",\n    \"院\",\n    \"堂\",\n    \"烧\",\n    \"江\",\n    \"社\",\n    \"合\",\n    \"星\",\n    \"货\",\n    \"型\",\n    \"村\",\n    \"自\",\n    \"科\",\n    \"快\",\n    \"便\",\n    \"日\",\n    \"民\",\n    \"营\",\n    \"和\",\n    \"活\",\n    \"童\",\n    \"明\",\n    \"器\",\n    \"烟\",\n    \"育\",\n    \"宾\",\n    \"精\",\n    \"屋\",\n    \"经\",\n    \"居\",\n    \"庄\",\n    \"石\",\n    \"顺\",\n    \"林\",\n    \"尔\",\n    \"县\",\n    \"手\",\n    \"厅\",\n    \"销\",\n    \"用\",\n    \"好\",\n    \"客\",\n    \"火\",\n    \"雅\",\n    \"盛\",\n    \"体\",\n    \"旅\",\n    \"之\",\n    \"鞋\",\n    \"辣\",\n    \"作\",\n    \"粉\",\n    \"包\",\n    \"楼\",\n    \"校\",\n    \"鱼\",\n    \"平\",\n    \"彩\",\n    \"上\",\n    \"吧\",\n    \"保\",\n    \"永\",\n    \"万\",\n    \"物\",\n    \"教\",\n    \"吃\",\n    \"设\",\n    \"医\",\n    \"正\",\n    \"造\",\n    \"丰\",\n    \"健\",\n    \"点\",\n    \"汤\",\n    \"网\",\n    \"庆\",\n    \"技\",\n    \"斯\",\n    \"洗\",\n    \"料\",\n    \"配\",\n    \"汇\",\n    \"木\",\n    \"缘\",\n    \"加\",\n    \"麻\",\n    \"联\",\n    \"卫\",\n    \"川\",\n    \"泰\",\n    \"色\",\n    \"世\",\n    \"方\",\n    \"寓\",\n    \"风\",\n    \"幼\",\n    \"羊\",\n    \"烫\",\n    \"来\",\n    \"高\",\n    \"厂\",\n    \"兰\",\n    \"阿\",\n    \"贝\",\n    \"皮\",\n    \"全\",\n    \"女\",\n    \"拉\",\n    \"成\",\n    \"云\",\n    \"维\",\n    \"贸\",\n    \"道\",\n    \"术\",\n    \"运\",\n    \"都\",\n    \"口\",\n    \"博\",\n    \"河\",\n    \"瑞\",\n    \"宏\",\n    \"京\",\n    \"际\",\n    \"路\",\n    \"祥\",\n    \"青\",\n    \"镇\",\n    \"厨\",\n    \"培\",\n    \"力\",\n    \"惠\",\n    \"连\",\n    \"马\",\n    \"鸿\",\n    \"钢\",\n    \"训\",\n    \"影\",\n    \"甲\",\n    \"助\",\n    \"窗\",\n    \"布\",\n    \"富\",\n    \"牌\",\n    \"头\",\n    \"四\",\n    \"多\",\n    \"妆\",\n    \"吉\",\n    \"苑\",\n    \"沙\",\n    \"恒\",\n    \"隆\",\n    \"春\",\n    \"干\",\n    \"饼\",\n    \"氏\",\n    \"里\",\n    \"二\",\n    \"管\",\n    \"诚\",\n    \"制\",\n    \"售\",\n    \"嘉\",\n    \"长\",\n    \"轩\",\n    \"杂\",\n    \"副\",\n    \"清\",\n    \"计\",\n    \"黄\",\n    \"讯\",\n    \"太\",\n    \"鸭\",\n    \"号\",\n    \"街\",\n    \"交\",\n    \"与\",\n    \"叉\",\n    \"附\",\n    \"近\",\n    \"层\",\n    \"旁\",\n    \"对\",\n    \"巷\",\n    \"栋\",\n    \"环\",\n    \"省\",\n    \"桥\",\n    \"湖\",\n    \"段\",\n    \"乡\",\n    \"厦\",\n    \"府\",\n    \"铺\",\n    \"内\",\n    \"侧\",\n    \"元\",\n    \"购\",\n    \"前\",\n    \"幢\",\n    \"滨\",\n    \"处\",\n    \"向\",\n    \"座\",\n    \"下\",\n    \"県\",\n    \"凤\",\n    \"港\",\n    \"开\",\n    \"关\",\n    \"景\",\n    \"泉\",\n    \"塘\",\n    \"放\",\n    \"昌\",\n    \"线\",\n    \"湾\",\n    \"政\",\n    \"步\",\n    \"宁\",\n    \"解\",\n    \"白\",\n    \"田\",\n    \"町\",\n    \"溪\",\n    \"十\",\n    \"八\",\n    \"古\",\n    \"双\",\n    \"胜\",\n    \"本\",\n    \"单\",\n    \"同\",\n    \"九\",\n    \"迎\",\n    \"第\",\n    \"台\",\n    \"玉\",\n    \"锦\",\n    \"底\",\n    \"后\",\n    \"七\",\n    \"斜\",\n    \"期\",\n    \"武\",\n    \"岭\",\n    \"松\",\n    \"角\",\n    \"纪\",\n    \"朝\",\n    \"峰\",\n    \"六\",\n    \"振\",\n    \"珠\",\n    \"局\",\n    \"岗\",\n    \"洲\",\n    \"横\",\n    \"边\",\n    \"济\",\n    \"井\",\n    \"办\",\n    \"汉\",\n    \"代\",\n    \"临\",\n    \"弄\",\n    \"团\",\n    \"外\",\n    \"塔\",\n    \"杨\",\n    \"铁\",\n    \"浦\",\n    \"字\",\n    \"年\",\n    \"岛\",\n    \"陵\",\n    \"原\",\n    \"梅\",\n    \"进\",\n    \"荣\",\n    \"友\",\n    \"虹\",\n    \"央\",\n    \"桂\",\n    \"沿\",\n    \"事\",\n    \"津\",\n    \"凯\",\n    \"莲\",\n    \"丁\",\n    \"秀\",\n    \"柳\",\n    \"集\",\n    \"紫\",\n    \"旗\",\n    \"张\",\n    \"谷\",\n    \"的\",\n    \"是\",\n    \"不\",\n    \"了\",\n    \"很\",\n    \"还\",\n    \"个\",\n    \"也\",\n    \"这\",\n    \"我\",\n    \"就\",\n    \"在\",\n    \"以\",\n    \"可\",\n    \"到\",\n    \"错\",\n    \"没\",\n    \"去\",\n    \"过\",\n    \"感\",\n    \"次\",\n    \"要\",\n    \"比\",\n    \"觉\",\n    \"看\",\n    \"得\",\n    \"说\",\n    \"常\",\n    \"真\",\n    \"们\",\n    \"但\",\n    \"最\",\n    \"喜\",\n    \"哈\",\n    \"么\",\n    \"别\",\n    \"位\",\n    \"能\",\n    \"较\",\n    \"境\",\n    \"非\",\n    \"为\",\n    \"欢\",\n    \"然\",\n    \"他\",\n    \"挺\",\n    \"着\",\n    \"价\",\n    \"那\",\n    \"意\",\n    \"种\",\n    \"想\",\n    \"出\",\n    \"员\",\n    \"两\",\n    \"推\",\n    \"做\",\n    \"排\",\n    \"实\",\n    \"分\",\n    \"间\",\n    \"甜\",\n    \"度\",\n    \"起\",\n    \"满\",\n    \"给\",\n    \"热\",\n    \"完\",\n    \"格\",\n    \"荐\",\n    \"喝\",\n    \"等\",\n    \"其\",\n    \"再\",\n    \"几\",\n    \"只\",\n    \"现\",\n    \"朋\",\n    \"候\",\n    \"样\",\n    \"直\",\n    \"而\",\n    \"买\",\n    \"于\",\n    \"般\",\n    \"豆\",\n    \"量\",\n    \"选\",\n    \"奶\",\n    \"打\",\n    \"每\",\n    \"评\",\n    \"少\",\n    \"算\",\n    \"又\",\n    \"因\",\n    \"情\",\n    \"找\",\n    \"些\",\n    \"份\",\n    \"置\",\n    \"适\",\n    \"什\",\n    \"蛋\",\n    \"师\",\n    \"气\",\n    \"你\",\n    \"姐\",\n    \"棒\",\n    \"试\",\n    \"总\",\n    \"定\",\n    \"啊\",\n    \"足\",\n    \"级\",\n    \"整\",\n    \"带\",\n    \"虾\",\n    \"如\",\n    \"态\",\n    \"且\",\n    \"尝\",\n    \"主\",\n    \"话\",\n    \"强\",\n    \"当\",\n    \"更\",\n    \"板\",\n    \"知\",\n    \"己\",\n    \"无\",\n    \"酸\",\n    \"让\",\n    \"入\",\n    \"啦\",\n    \"式\",\n    \"笑\",\n    \"赞\",\n    \"片\",\n    \"酱\",\n    \"差\",\n    \"像\",\n    \"提\",\n    \"队\",\n    \"走\",\n    \"嫩\",\n    \"才\",\n    \"刚\",\n    \"午\",\n    \"接\",\n    \"重\",\n    \"串\",\n    \"回\",\n    \"晚\",\n    \"微\",\n    \"周\",\n    \"值\",\n    \"费\",\n    \"性\",\n    \"桌\",\n    \"拍\",\n    \"跟\",\n    \"块\",\n    \"调\",\n    \"糕\"\n]\n  }"
  },
  {
    "path": "【大众点评】字体反爬、坐标反爬/最新版7月/main.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-25  Python: 3.7\n\n\"\"\"\n调用例子\n实际运用中，导包路径自己填写好就行了\n\"\"\"\nimport redis\nimport json\nimport requests\nimport re\nimport os\n\n\nfrom fontTools.ttLib import TTFont\n\nHASH_TABLE = 'dianping:font'\n\n\n\"\"\"\n【已知问题】\n页面可能有多个字库（会自动捕获） 需要自己再对应字库中取字即可，请自行拓展\n\"\"\"\n\n\nclass ParseFontClass:\n\n    def __init__(self, css_url, redis_host='127.0.0.1', redis_port=6379, redis_pass=None):\n        \"\"\"\n        redis 默认链接本机\n        :param redis_host: redis 链接地址\n        :param redis_port: redis 端口号\n        :param redis_pass: redis 密码\n        \"\"\"\n        self.name_list = None\n        if redis_pass:\n            pool = redis.ConnectionPool(host=redis_host, port=redis_port, password=redis_pass, decode_responses=True)\n        else:\n            pool = redis.ConnectionPool(host=redis_host, port=redis_port, decode_responses=True)\n        self.r = redis.Redis(connection_pool=pool)\n        with open('font.json', 'r', encoding='utf-8') as f:\n            data = json.load(f)\n        self.FONT_LIST = data.get('FONT_LIST')\n        self.css_url = css_url\n        self.start()\n\n    def parse_ttf(self, code):\n        clean_code = code.replace(';', '')[-4:]  # 只提取匹配区域\n        result_list = self.r.hmget(HASH_TABLE, self.name_list)  # 取出对应字库表（已修复bug）\n        for result in result_list:\n            json_data = json.loads(result)\n            if 'uni' + clean_code in json_data:\n                return json_data['uni' + clean_code]\n        return False\n\n    def add_hash(self, name, json_data):\n        \"\"\"新增 hash\n        \"\"\"\n        self.r.hset(HASH_TABLE, name, json_data)\n\n    def check_hash(self, name):\n        \"\"\"判断 hash key 是否存在\n        \"\"\"\n        return self.r.hexists(HASH_TABLE, name)\n\n    def get_ttf(self, css_url):\n        \"\"\"获取字体链接\n        \"\"\"\n        headers = {\n            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'\n        }\n        result = requests.get(css_url, headers=headers)\n        if result.status_code == 200:\n            self.install_ttf(self.get_ttf_urls(result.text))\n        else:\n            return None\n\n    def install_ttf(self, ttf_list):\n        \"\"\"安装字体\n        \"\"\"\n        self.name_list = [ttf[ttf.rfind('/')+1: -5] for ttf in ttf_list]  # 提取字库名\n        # print(name_list)\n        for index, name in enumerate(self.name_list):\n            if self.check_hash(name):\n                # 已存在无需安装\n                continue\n            # 安装字体\n            with open(name + '.woff', 'wb+') as f:\n                f.write(requests.get('http://' + ttf_list[index]).content)  # 下载写入\n                font = TTFont(name + '.woff')\n                uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()  # 取出字形保存到uniList中\n                json_data = json.dumps(dict(zip(uni_list, self.FONT_LIST)), ensure_ascii=False)\n                self.add_hash(name, json_data)\n                os.remove(name + '.woff')  # 用完了删掉，节省资源占用\n\n    @staticmethod\n    def get_ttf_urls(text):\n        \"\"\"提取字体链接\n        \"\"\"\n        ttf_urls = []\n        urls = re.findall(r'url\\(\"//(.*?)\"\\)', text)\n        for url in urls:\n            if url not in ttf_urls and '.woff' in url:\n                ttf_urls.append(url)\n\n        return ttf_urls\n\n    def start(self):\n        self.get_ttf(self.css_url)\n\n\nif __name__ == '__main__':\n    \"\"\"\n    【已知问题】\n    页面可能有多个字库（会自动捕获） 需要自己再对应字库中取字即可，请自行拓展\n    \"\"\"\n    # 这里需要传入页面中包含字体链接的 css 网址\n    pf = ParseFontClass('http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/8945b511eb964a95fe071d4852a7ef03.css')\n    # 此处为页面上加密的 新华路 三个字\n    print(pf.parse_ttf('&#xe2cc;'))\n    print(pf.parse_ttf('&#xed59;'))\n    print(pf.parse_ttf('&#xe169;'))\n\n\n\n"
  },
  {
    "path": "【天眼查】字体加密/tyc.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-12-06  Python: 3.7\n\n\"\"\"\n    从网页下载一个字体文件获取对应推导式，动态获取请自行拓展\n\"\"\"\n\nfrom fontTools.ttLib import TTFont\nimport re\n\nfont = TTFont('num.woff')  # 打开tyc-num.woff\nfont.saveXML('tyc-num.xml')  # 保存为tyc-num.xml\nwith open('tyc-num.xml', 'r') as f:\n    xml = f.read()  # 读取tyc-num.xml赋值给xml\nGlyphID = re.findall(r'<GlyphID id=\"(.*?)\" name=\"(\\d+)\"/>', xml)  # 获得对应关系\nprint(GlyphID)\nGlyphIDNameLists = list(set([int(Gname) for Gid, Gname in GlyphID])) # 对应关系数量转换\nprint(GlyphIDNameLists)\nDigitalDicts = {str(i): str(GlyphIDNameLists[i - 2]) for i in range(2, len(GlyphIDNameLists)+2)}  # 数字对应关系的字典推导式\nprint(DigitalDicts)\nGlyphIDDicts = {str(Gname): DigitalDicts[Gid] for Gid, Gname in GlyphID}  # 通过数字对应关系生成源代码跟页面显示的字典推导式\nprint('-' * 39 + '数字对应关系的字典推导式' + '-' * 39)\nprint(DigitalDicts)\nprint('-' * 27 + '通过数字对应关系生成源代码跟页面显示的字典推导式' + '-' * 27)\nprint(GlyphIDDicts)\n"
  },
  {
    "path": "【抖音】无水印视频解析/README.md",
    "content": "这是一份抖音无水印单个视频的解析代码\n\n"
  },
  {
    "path": "【抖音】无水印视频解析/__init__.py",
    "content": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/3/6\n\n"
  },
  {
    "path": "【抖音】无水印视频解析/parse.py",
    "content": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/3/6\n\nimport re\nimport requests\nimport json\n\n\nclass ParseVideo:\n\n    def __init__(self, share):\n        path = self.get_url(share)\n        self.url = 'https://v.douyin.com/' + path + '/'\n        self.headers = {\n            'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',\n        }\n        self.session = requests.session()\n        self.first_url = None\n\n    @staticmethod\n    def get_url(share_url):\n        return re.search(r'https://v\\.douyin\\.com/(.*?)/', share_url).group(1)\n\n    def go_location(self):\n        response = self.session.get(self.url, headers=self.headers)\n        self.first_url = response.url\n        result = re.search(r'itemId: \"(.*?)\",[\\s\\S]*?uid: \"(.*?)\",[\\s\\S]*?authorName: \"(.*?)\",[\\s\\S]*?dytk: \"(.*?)\"',\n                           response.text)\n        return result\n\n    def go_message(self, ret):\n        url = 'https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' + ret.group(1) + '&dytk=' + ret.group(4)\n        response = self.session.get(url, headers=self.headers)\n        json_data = json.loads(response.text)\n        user_id = ret.group(2)\n        user_name = ret.group(3).encode('utf-8').decode('unicode_escape')\n\n        if json_data.get('status_code') != 0:\n            print('解析失败')\n            exit()\n        item_list = json_data.get('item_list')[0]\n        aweme_id = item_list.get('aweme_id')\n        desc = item_list.get('desc')\n        comment_count = item_list.get('statistics').get('comment_count')\n        digg_count = item_list.get('statistics').get('digg_count')\n\n        video = item_list.get('video')\n        cover = video.get('origin_cover').get('url_list')[0]\n        play_addr = video.get('play_addr_lowbr').get('url_list')[0]\n\n        play_addr_response = self.session.get(play_addr, headers=self.headers, allow_redirects=False)\n        msg = \"\"\"\n        用户id：{user_id}\n        用户名：{user_name}\n        作品id：{aweme_id}\n        标题：  {desc}\n        评论数：  {comment_count}\n        点赞数：  {digg_count}\n        封面地址：{cover}\n        无水印视频：{addr}\n        \"\"\".format(\n            user_id=user_id,\n            user_name=user_name,\n            aweme_id=aweme_id,\n            desc=desc,\n            comment_count=comment_count,\n            digg_count=digg_count,\n            cover=cover,\n            addr=play_addr_response.headers['location']\n        )\n        print(msg)\n\n    def start(self):\n        result = self.go_location()\n        self.go_message(result)\n\n\nif __name__ == '__main__':\n    # text = '#在抖音，记录美好生活#要逆天！北京地坛医院证实新冠病毒攻击中枢神经系统 https://v.douyin.com/tW7qrw/ 复制此链接，打开【抖音短视频】，直接观看视频！'\n    text = input('请输入分享链接>>>')\n    pv = ParseVideo(text)\n    pv.start()\n"
  },
  {
    "path": "【拼多多】登陆参数生成/PinDuoDuo.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-23  Python: 3.7\n\n\nimport execjs.runtime_names\n\n\"\"\"\npip3 install execjs\nnpm i jsdom -g\n\"\"\"\n\n\nclass PingDuoDuoSpider(object):\n    \"\"\"\n    拼多多加密解析\n    \"\"\"\n\n    def __init__(self, password):\n        # 初始化\n        print('引擎', execjs.get().name)\n        self.password = password\n\n    def make(self):\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            ctx = execjs.compile(f.read())\n\n        ret = ctx.call(\"test\", self.password)\n        print(ret)\n\n\nif __name__ == '__main__':\n    key = input(\"输入字符串\")\n    pdd = PingDuoDuoSpider(key)\n    pdd.make()\n\n"
  },
  {
    "path": "【拼多多】登陆参数生成/README.md",
    "content": "# 解密过程参考博客\n\n[博客链接](https://www.zhangkunzhi.com/archives/67)"
  },
  {
    "path": "【拼多多】登陆参数生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-23  Python: 3.7\n\n"
  },
  {
    "path": "【拼多多】登陆参数生成/encryp.js",
    "content": "// 定义 navigator 与 window\nvar navigator = {};\nvar window = this;  // 等于当前对象\nvar a = {default_key_size: 1024, default_public_exponent: \"010001\", log: false, key: e}\n\n\nvar e = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n\nfunction n(t) {\n    return e.charAt(t)\n}\n\nfunction r(t, e) {\n    return t & e\n}\n\nfunction o(t, e) {\n    return t | e\n}\n\nfunction i(t, e) {\n    return t ^ e\n}\n\nfunction a(t, e) {\n    return t & ~e\n}\n\nfunction s(t) {\n    if (0 == t)\n        return -1;\n    var e = 0;\n    return 0 == (65535 & t) && (t >>= 16,\n            e += 16),\n        0 == (255 & t) && (t >>= 8,\n            e += 8),\n        0 == (15 & t) && (t >>= 4,\n            e += 4),\n        0 == (3 & t) && (t >>= 2,\n            e += 2),\n        0 == (1 & t) && ++e,\n        e\n}\n\nfunction c(t) {\n    for (var e = 0; 0 != t;)\n        t &= t - 1,\n        ++e;\n    return e\n}\nvar u = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n    l = \"=\";\n\nfunction f(t) {\n    var e, n, r = \"\";\n    for (e = 0; e + 3 <= t.length; e += 3)\n        n = parseInt(t.substring(e, e + 3), 16),\n        r += u.charAt(n >> 6) + u.charAt(63 & n);\n    for (e + 1 == t.length ? (n = parseInt(t.substring(e, e + 1), 16),\n            r += u.charAt(n << 2)) : e + 2 == t.length && (n = parseInt(t.substring(e, e + 2), 16),\n            r += u.charAt(n >> 2) + u.charAt((3 & n) << 4));\n        (3 & r.length) > 0;)\n        r += l;\n    return r\n}\n\nfunction p(t) {\n    var e, r = \"\",\n        o = 0,\n        i = 0;\n    for (e = 0; e < t.length && t.charAt(e) != l; ++e) {\n        var a = u.indexOf(t.charAt(e));\n        a < 0 || (0 == o ? (r += n(a >> 2),\n            i = 3 & a,\n            o = 1) : 1 == o ? (r += n(i << 2 | a >> 4),\n            i = 15 & a,\n            o = 2) : 2 == o ? (r += n(i),\n            r += n(a >> 2),\n            i = 3 & a,\n            o = 3) : (r += n(i << 2 | a >> 4),\n            r += n(15 & a),\n            o = 0))\n    }\n    return 1 == o && (r += n(i << 2)),\n        r\n}\n/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\nvar d, h, m = function(t, e) {\n        return (m = Object.setPrototypeOf || {\n                __proto__: []\n            }\n            instanceof Array && function(t, e) {\n                t.__proto__ = e\n            } ||\n            function(t, e) {\n                for (var n in e)\n                    e.hasOwnProperty(n) && (t[n] = e[n])\n            }\n        )(t, e)\n    },\n    g = {\n        decode: function(t) {\n            var e;\n            if (void 0 === d) {\n                var n = \"0123456789ABCDEF\",\n                    r = \" \\f\\n\\r\\t \\u2028\\u2029\";\n                for (d = {},\n                    e = 0; e < 16; ++e)\n                    d[n.charAt(e)] = e;\n                for (n = n.toLowerCase(),\n                    e = 10; e < 16; ++e)\n                    d[n.charAt(e)] = e;\n                for (e = 0; e < r.length; ++e)\n                    d[r.charAt(e)] = -1\n            }\n            var o = [],\n                i = 0,\n                a = 0;\n            for (e = 0; e < t.length; ++e) {\n                var s = t.charAt(e);\n                if (\"=\" == s)\n                    break;\n                if (-1 != (s = d[s])) {\n                    if (void 0 === s)\n                        throw new Error(\"Illegal character at offset \" + e);\n                    i |= s,\n                        ++a >= 2 ? (o[o.length] = i,\n                            i = 0,\n                            a = 0) : i <<= 4\n                }\n            }\n            if (a)\n                throw new Error(\"Hex encoding incomplete: 4 bits missing\");\n            return o\n        }\n    },\n    v = {\n        decode: function(t) {\n            var e;\n            if (void 0 === h) {\n                var n = \"= \\f\\n\\r\\t \\u2028\\u2029\";\n                for (h = Object.create(null),\n                    e = 0; e < 64; ++e)\n                    h[\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(e)] = e;\n                for (e = 0; e < n.length; ++e)\n                    h[n.charAt(e)] = -1\n            }\n            var r = [],\n                o = 0,\n                i = 0;\n            for (e = 0; e < t.length; ++e) {\n                var a = t.charAt(e);\n                if (\"=\" == a)\n                    break;\n                if (-1 != (a = h[a])) {\n                    if (void 0 === a)\n                        throw new Error(\"Illegal character at offset \" + e);\n                    o |= a,\n                        ++i >= 4 ? (r[r.length] = o >> 16,\n                            r[r.length] = o >> 8 & 255,\n                            r[r.length] = 255 & o,\n                            o = 0,\n                            i = 0) : o <<= 6\n                }\n            }\n            switch (i) {\n                case 1:\n                    throw new Error(\"Base64 encoding incomplete: at least 2 bits missing\");\n                case 2:\n                    r[r.length] = o >> 10;\n                    break;\n                case 3:\n                    r[r.length] = o >> 16,\n                        r[r.length] = o >> 8 & 255\n            }\n            return r\n        },\n        re: /-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n        unarmor: function(t) {\n            var e = v.re.exec(t);\n            if (e)\n                if (e[1])\n                    t = e[1];\n                else {\n                    if (!e[2])\n                        throw new Error(\"RegExp out of sync\");\n                    t = e[2]\n                }\n            return v.decode(t)\n        }\n    },\n    y = function() {\n        function t(t) {\n            this.buf = [+t || 0]\n        }\n        return t.prototype.mulAdd = function(t, e) {\n                var n, r, o = this.buf,\n                    i = o.length;\n                for (n = 0; n < i; ++n)\n                    (r = o[n] * t + e) < 1e13 ? e = 0 : r -= 1e13 * (e = 0 | r / 1e13),\n                    o[n] = r;\n                e > 0 && (o[n] = e)\n            },\n            t.prototype.sub = function(t) {\n                var e, n, r = this.buf,\n                    o = r.length;\n                for (e = 0; e < o; ++e)\n                    (n = r[e] - t) < 0 ? (n += 1e13,\n                        t = 1) : t = 0,\n                    r[e] = n;\n                for (; 0 === r[r.length - 1];)\n                    r.pop()\n            },\n            t.prototype.toString = function(t) {\n                if (10 != (t || 10))\n                    throw new Error(\"only base 10 is supported\");\n                for (var e = this.buf, n = e[e.length - 1].toString(), r = e.length - 2; r >= 0; --r)\n                    n += (1e13 + e[r]).toString().substring(1);\n                return n\n            },\n            t.prototype.valueOf = function() {\n                for (var t = this.buf, e = 0, n = t.length - 1; n >= 0; --n)\n                    e = 1e13 * e + t[n];\n                return e\n            },\n            t.prototype.simplify = function() {\n                var t = this.buf;\n                return 1 == t.length ? t[0] : this\n            },\n            t\n    }(),\n    _ = \"…\",\n    x =\n    /^(\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/,\n    b =\n    /^(\\d\\d\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\n\nfunction w(t, e) {\n    return t.length > e && (t = t.substring(0, e) + _),\n        t\n}\nvar S, E = function() {\n        function t(e, n) {\n            this.hexDigits = \"0123456789ABCDEF\",\n                e instanceof t ? (this.enc = e.enc,\n                    this.pos = e.pos) : (this.enc = e,\n                    this.pos = n)\n        }\n        return t.prototype.get = function(t) {\n                if (void 0 === t && (t = this.pos++),\n                    t >= this.enc.length)\n                    throw new Error(\"Requesting byte offset \" + t + \" on a stream of length \" + this.enc.length);\n                return \"string\" == typeof this.enc ? this.enc.charCodeAt(t) : this.enc[t]\n            },\n            t.prototype.hexByte = function(t) {\n                return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(15 & t)\n            },\n            t.prototype.hexDump = function(t, e, n) {\n                for (var r = \"\", o = t; o < e; ++o)\n                    if (r += this.hexByte(this.get(o)),\n                        !0 !== n)\n                        switch (15 & o) {\n                            case 7:\n                                r += \"  \";\n                                break;\n                            case 15:\n                                r += \"\\n\";\n                                break;\n                            default:\n                                r += \" \"\n                        }\n                return r\n            },\n            t.prototype.isASCII = function(t, e) {\n                for (var n = t; n < e; ++n) {\n                    var r = this.get(n);\n                    if (r < 32 || r > 176)\n                        return !1\n                }\n                return !0\n            },\n            t.prototype.parseStringISO = function(t, e) {\n                for (var n = \"\", r = t; r < e; ++r)\n                    n += String.fromCharCode(this.get(r));\n                return n\n            },\n            t.prototype.parseStringUTF = function(t, e) {\n                for (var n = \"\", r = t; r < e;) {\n                    var o = this.get(r++);\n                    n += o < 128 ? String.fromCharCode(o) : o > 191 && o < 224 ? String.fromCharCode((31 & o) << 6 | 63 & this.get(\n                        r++)) : String.fromCharCode((15 & o) << 12 | (63 & this.get(r++)) << 6 | 63 & this.get(r++))\n                }\n                return n\n            },\n            t.prototype.parseStringBMP = function(t, e) {\n                for (var n, r, o = \"\", i = t; i < e;)\n                    n = this.get(i++),\n                    r = this.get(i++),\n                    o += String.fromCharCode(n << 8 | r);\n                return o\n            },\n            t.prototype.parseTime = function(t, e, n) {\n                var r = this.parseStringISO(t, e),\n                    o = (n ? x : b).exec(r);\n                return o ? (n && (o[1] = +o[1],\n                        o[1] += +o[1] < 70 ? 2e3 : 1900),\n                    r = o[1] + \"-\" + o[2] + \"-\" + o[3] + \" \" + o[4],\n                    o[5] && (r += \":\" + o[5],\n                        o[6] && (r += \":\" + o[6],\n                            o[7] && (r += \".\" + o[7]))),\n                    o[8] && (r += \" UTC\",\n                        \"Z\" != o[8] && (r += o[8],\n                            o[9] && (r += \":\" + o[9]))),\n                    r) : \"Unrecognized time: \" + r\n            },\n            t.prototype.parseInteger = function(t, e) {\n                for (var n, r = this.get(t), o = r > 127, i = o ? 255 : 0, a = \"\"; r == i && ++t < e;)\n                    r = this.get(t);\n                if (0 == (n = e - t))\n                    return o ? -1 : 0;\n                if (n > 4) {\n                    for (a = r,\n                        n <<= 3; 0 == (128 & (+a ^ i));)\n                        a = +a << 1,\n                        --n;\n                    a = \"(\" + n + \" bit)\\n\"\n                }\n                o && (r -= 256);\n                for (var s = new y(r), c = t + 1; c < e; ++c)\n                    s.mulAdd(256, this.get(c));\n                return a + s.toString()\n            },\n            t.prototype.parseBitString = function(t, e, n) {\n                for (var r = this.get(t), o = (e - t - 1 << 3) - r, i = \"(\" + o + \" bit)\\n\", a = \"\", s = t + 1; s < e; ++s) {\n                    for (var c = this.get(s), u = s == e - 1 ? r : 0, l = 7; l >= u; --l)\n                        a += c >> l & 1 ? \"1\" : \"0\";\n                    if (a.length > n)\n                        return i + w(a, n)\n                }\n                return i + a\n            },\n            t.prototype.parseOctetString = function(t, e, n) {\n                if (this.isASCII(t, e))\n                    return w(this.parseStringISO(t, e), n);\n                var r = e - t,\n                    o = \"(\" + r + \" byte)\\n\";\n                r > (n /= 2) && (e = t + n);\n                for (var i = t; i < e; ++i)\n                    o += this.hexByte(this.get(i));\n                return r > n && (o += _),\n                    o\n            },\n            t.prototype.parseOID = function(t, e, n) {\n                for (var r = \"\", o = new y, i = 0, a = t; a < e; ++a) {\n                    var s = this.get(a);\n                    if (o.mulAdd(128, 127 & s),\n                        i += 7,\n                        !(128 & s)) {\n                        if (\"\" === r)\n                            if ((o = o.simplify()) instanceof y)\n                                o.sub(80),\n                                r = \"2.\" + o.toString();\n                            else {\n                                var c = o < 80 ? o < 40 ? 0 : 1 : 2;\n                                r = c + \".\" + (o - 40 * c)\n                            }\n                        else\n                            r += \".\" + o.toString();\n                        if (r.length > n)\n                            return w(r, n);\n                        o = new y,\n                            i = 0\n                    }\n                }\n                return i > 0 && (r += \".incomplete\"),\n                    r\n            },\n            t\n    }(),\n    O = function() {\n        function t(t, e, n, r, o) {\n            if (!(r instanceof C))\n                throw new Error(\"Invalid tag value.\");\n            this.stream = t,\n                this.header = e,\n                this.length = n,\n                this.tag = r,\n                this.sub = o\n        }\n        return t.prototype.typeName = function() {\n                switch (this.tag.tagClass) {\n                    case 0:\n                        switch (this.tag.tagNumber) {\n                            case 0:\n                                return \"EOC\";\n                            case 1:\n                                return \"BOOLEAN\";\n                            case 2:\n                                return \"INTEGER\";\n                            case 3:\n                                return \"BIT_STRING\";\n                            case 4:\n                                return \"OCTET_STRING\";\n                            case 5:\n                                return \"NULL\";\n                            case 6:\n                                return \"OBJECT_IDENTIFIER\";\n                            case 7:\n                                return \"ObjectDescriptor\";\n                            case 8:\n                                return \"EXTERNAL\";\n                            case 9:\n                                return \"REAL\";\n                            case 10:\n                                return \"ENUMERATED\";\n                            case 11:\n                                return \"EMBEDDED_PDV\";\n                            case 12:\n                                return \"UTF8String\";\n                            case 16:\n                                return \"SEQUENCE\";\n                            case 17:\n                                return \"SET\";\n                            case 18:\n                                return \"NumericString\";\n                            case 19:\n                                return \"PrintableString\";\n                            case 20:\n                                return \"TeletexString\";\n                            case 21:\n                                return \"VideotexString\";\n                            case 22:\n                                return \"IA5String\";\n                            case 23:\n                                return \"UTCTime\";\n                            case 24:\n                                return \"GeneralizedTime\";\n                            case 25:\n                                return \"GraphicString\";\n                            case 26:\n                                return \"VisibleString\";\n                            case 27:\n                                return \"GeneralString\";\n                            case 28:\n                                return \"UniversalString\";\n                            case 30:\n                                return \"BMPString\"\n                        }\n                        return \"Universal_\" + this.tag.tagNumber.toString();\n                    case 1:\n                        return \"Application_\" + this.tag.tagNumber.toString();\n                    case 2:\n                        return \"[\" + this.tag.tagNumber.toString() + \"]\";\n                    case 3:\n                        return \"Private_\" + this.tag.tagNumber.toString()\n                }\n            },\n            t.prototype.content = function(t) {\n                if (void 0 === this.tag)\n                    return null;\n                void 0 === t && (t = 1 / 0);\n                var e = this.posContent(),\n                    n = Math.abs(this.length);\n                if (!this.tag.isUniversal())\n                    return null !== this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseOctetString(e, e + n, t);\n                switch (this.tag.tagNumber) {\n                    case 1:\n                        return 0 === this.stream.get(e) ? \"false\" : \"true\";\n                    case 2:\n                        return this.stream.parseInteger(e, e + n);\n                    case 3:\n                        return this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseBitString(e, e + n, t);\n                    case 4:\n                        return this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseOctetString(e, e + n, t);\n                    case 6:\n                        return this.stream.parseOID(e, e + n, t);\n                    case 16:\n                    case 17:\n                        return null !== this.sub ? \"(\" + this.sub.length + \" elem)\" : \"(no elem)\";\n                    case 12:\n                        return w(this.stream.parseStringUTF(e, e + n), t);\n                    case 18:\n                    case 19:\n                    case 20:\n                    case 21:\n                    case 22:\n                    case 26:\n                        return w(this.stream.parseStringISO(e, e + n), t);\n                    case 30:\n                        return w(this.stream.parseStringBMP(e, e + n), t);\n                    case 23:\n                    case 24:\n                        return this.stream.parseTime(e, e + n, 23 == this.tag.tagNumber)\n                }\n                return null\n            },\n            t.prototype.toString = function() {\n                return this.typeName() + \"@\" + this.stream.pos + \"[header:\" + this.header + \",length:\" + this.length + \",sub:\" +\n                    (null === this.sub ? \"null\" : this.sub.length) + \"]\"\n            },\n            t.prototype.toPrettyString = function(t) {\n                void 0 === t && (t = \"\");\n                var e = t + this.typeName() + \" @\" + this.stream.pos;\n                if (this.length >= 0 && (e += \"+\"),\n                    e += this.length,\n                    this.tag.tagConstructed ? e += \" (constructed)\" : !this.tag.isUniversal() || 3 != this.tag.tagNumber && 4 !=\n                    this.tag.tagNumber || null === this.sub || (e += \" (encapsulates)\"),\n                    e += \"\\n\",\n                    null !== this.sub) {\n                    t += \"  \";\n                    for (var n = 0, r = this.sub.length; n < r; ++n)\n                        e += this.sub[n].toPrettyString(t)\n                }\n                return e\n            },\n            t.prototype.posStart = function() {\n                return this.stream.pos\n            },\n            t.prototype.posContent = function() {\n                return this.stream.pos + this.header\n            },\n            t.prototype.posEnd = function() {\n                return this.stream.pos + this.header + Math.abs(this.length)\n            },\n            t.prototype.toHexString = function() {\n                return this.stream.hexDump(this.posStart(), this.posEnd(), !0)\n            },\n            t.decodeLength = function(t) {\n                var e = t.get(),\n                    n = 127 & e;\n                if (n == e)\n                    return n;\n                if (n > 6)\n                    throw new Error(\"Length over 48 bits not supported at position \" + (t.pos - 1));\n                if (0 === n)\n                    return null;\n                e = 0;\n                for (var r = 0; r < n; ++r)\n                    e = 256 * e + t.get();\n                return e\n            },\n            t.prototype.getHexStringValue = function() {\n                var t = this.toHexString(),\n                    e = 2 * this.header,\n                    n = 2 * this.length;\n                return t.substr(e, n)\n            },\n            t.decode = function(e) {\n                var n;\n                n = e instanceof E ? e : new E(e, 0);\n                var r = new E(n),\n                    o = new C(n),\n                    i = t.decodeLength(n),\n                    a = n.pos,\n                    s = a - r.pos,\n                    c = null,\n                    u = function() {\n                        var e = [];\n                        if (null !== i) {\n                            for (var r = a + i; n.pos < r;)\n                                e[e.length] = t.decode(n);\n                            if (n.pos != r)\n                                throw new Error(\"Content size is not correct for container starting at offset \" + a)\n                        } else\n                            try {\n                                for (;;) {\n                                    var o = t.decode(n);\n                                    if (o.tag.isEOC())\n                                        break;\n                                    e[e.length] = o\n                                }\n                                i = a - n.pos\n                            } catch (t) {\n                                throw new Error(\"Exception while decoding undefined length content: \" + t)\n                            }\n                        return e\n                    };\n                if (o.tagConstructed)\n                    c = u();\n                else if (o.isUniversal() && (3 == o.tagNumber || 4 == o.tagNumber))\n                    try {\n                        if (3 == o.tagNumber && 0 != n.get())\n                            throw new Error(\"BIT STRINGs with unused bits cannot encapsulate.\");\n                        c = u();\n                        for (var l = 0; l < c.length; ++l)\n                            if (c[l].tag.isEOC())\n                                throw new Error(\"EOC is not supposed to be actual content.\")\n                    } catch (t) {\n                        c = null\n                    }\n                if (null === c) {\n                    if (null === i)\n                        throw new Error(\"We can't skip over an invalid tag with undefined length at offset \" + a);\n                    n.pos = a + Math.abs(i)\n                }\n                return new t(r, s, i, o, c)\n            },\n            t\n    }(),\n    C = function() {\n        function t(t) {\n            var e = t.get();\n            if (this.tagClass = e >> 6,\n                this.tagConstructed = 0 != (32 & e),\n                this.tagNumber = 31 & e,\n                31 == this.tagNumber) {\n                var n = new y;\n                do {\n                    e = t.get(),\n                        n.mulAdd(128, 127 & e)\n                } while (128 & e);\n                this.tagNumber = n.simplify()\n            }\n        }\n        return t.prototype.isUniversal = function() {\n                return 0 === this.tagClass\n            },\n            t.prototype.isEOC = function() {\n                return 0 === this.tagClass && 0 === this.tagNumber\n            },\n            t\n    }(),\n    T = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107,\n        109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,\n        239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373,\n        379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509,\n        521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,\n        661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823,\n        827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983,\n        991, 997\n    ],\n    k = (1 << 26) / T[T.length - 1],\n    A = function() {\n        function t(t, e, n) {\n            null != t && (\"number\" == typeof t ? this.fromNumber(t, e, n) : null == e && \"string\" != typeof t ? this.fromString(\n                t, 256) : this.fromString(t, e))\n        }\n        return t.prototype.toString = function(t) {\n                if (this.s < 0)\n                    return \"-\" + this.negate().toString(t);\n                var e;\n                if (16 == t)\n                    e = 4;\n                else if (8 == t)\n                    e = 3;\n                else if (2 == t)\n                    e = 1;\n                else if (32 == t)\n                    e = 5;\n                else {\n                    if (4 != t)\n                        return this.toRadix(t);\n                    e = 2\n                }\n                var r, o = (1 << e) - 1,\n                    i = !1,\n                    a = \"\",\n                    s = this.t,\n                    c = this.DB - s * this.DB % e;\n                if (s-- > 0)\n                    for (c < this.DB && (r = this[s] >> c) > 0 && (i = !0,\n                            a = n(r)); s >= 0;)\n                        c < e ? (r = (this[s] & (1 << c) - 1) << e - c,\n                            r |= this[--s] >> (c += this.DB - e)) : (r = this[s] >> (c -= e) & o,\n                            c <= 0 && (c += this.DB,\n                                --s)),\n                        r > 0 && (i = !0),\n                        i && (a += n(r));\n                return i ? a : \"0\"\n            },\n            t.prototype.negate = function() {\n                var e = N();\n                return t.ZERO.subTo(this, e),\n                    e\n            },\n            t.prototype.abs = function() {\n                return this.s < 0 ? this.negate() : this\n            },\n            t.prototype.compareTo = function(t) {\n                var e = this.s - t.s;\n                if (0 != e)\n                    return e;\n                var n = this.t;\n                if (0 != (e = n - t.t))\n                    return this.s < 0 ? -e : e;\n                for (; --n >= 0;)\n                    if (0 != (e = this[n] - t[n]))\n                        return e;\n                return 0\n            },\n            t.prototype.bitLength = function() {\n                return this.t <= 0 ? 0 : this.DB * (this.t - 1) + H(this[this.t - 1] ^ this.s & this.DM)\n            },\n            t.prototype.mod = function(e) {\n                var n = N();\n                return this.abs().divRemTo(e, null, n),\n                    this.s < 0 && n.compareTo(t.ZERO) > 0 && e.subTo(n, n),\n                    n\n            },\n            t.prototype.modPowInt = function(t, e) {\n                var n;\n                return n = t < 256 || e.isEven() ? new P(e) : new D(e),\n                    this.exp(t, n)\n            },\n            t.prototype.clone = function() {\n                var t = N();\n                return this.copyTo(t),\n                    t\n            },\n            t.prototype.intValue = function() {\n                if (this.s < 0) {\n                    if (1 == this.t)\n                        return this[0] - this.DV;\n                    if (0 == this.t)\n                        return -1\n                } else {\n                    if (1 == this.t)\n                        return this[0];\n                    if (0 == this.t)\n                        return 0\n                }\n                return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]\n            },\n            t.prototype.byteValue = function() {\n                return 0 == this.t ? this.s : this[0] << 24 >> 24\n            },\n            t.prototype.shortValue = function() {\n                return 0 == this.t ? this.s : this[0] << 16 >> 16\n            },\n            t.prototype.signum = function() {\n                return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1\n            },\n            t.prototype.toByteArray = function() {\n                var t = this.t,\n                    e = [];\n                e[0] = this.s;\n                var n, r = this.DB - t * this.DB % 8,\n                    o = 0;\n                if (t-- > 0)\n                    for (r < this.DB && (n = this[t] >> r) != (this.s & this.DM) >> r && (e[o++] = n | this.s << this.DB - r); t >=\n                        0;)\n                        r < 8 ? (n = (this[t] & (1 << r) - 1) << 8 - r,\n                            n |= this[--t] >> (r += this.DB - 8)) : (n = this[t] >> (r -= 8) & 255,\n                            r <= 0 && (r += this.DB,\n                                --t)),\n                        0 != (128 & n) && (n |= -256),\n                        0 == o && (128 & this.s) != (128 & n) && ++o,\n                        (o > 0 || n != this.s) && (e[o++] = n);\n                return e\n            },\n            t.prototype.equals = function(t) {\n                return 0 == this.compareTo(t)\n            },\n            t.prototype.min = function(t) {\n                return this.compareTo(t) < 0 ? this : t\n            },\n            t.prototype.max = function(t) {\n                return this.compareTo(t) > 0 ? this : t\n            },\n            t.prototype.and = function(t) {\n                var e = N();\n                return this.bitwiseTo(t, r, e),\n                    e\n            },\n            t.prototype.or = function(t) {\n                var e = N();\n                return this.bitwiseTo(t, o, e),\n                    e\n            },\n            t.prototype.xor = function(t) {\n                var e = N();\n                return this.bitwiseTo(t, i, e),\n                    e\n            },\n            t.prototype.andNot = function(t) {\n                var e = N();\n                return this.bitwiseTo(t, a, e),\n                    e\n            },\n            t.prototype.not = function() {\n                for (var t = N(), e = 0; e < this.t; ++e)\n                    t[e] = this.DM & ~this[e];\n                return t.t = this.t,\n                    t.s = ~this.s,\n                    t\n            },\n            t.prototype.shiftLeft = function(t) {\n                var e = N();\n                return t < 0 ? this.rShiftTo(-t, e) : this.lShiftTo(t, e),\n                    e\n            },\n            t.prototype.shiftRight = function(t) {\n                var e = N();\n                return t < 0 ? this.lShiftTo(-t, e) : this.rShiftTo(t, e),\n                    e\n            },\n            t.prototype.getLowestSetBit = function() {\n                for (var t = 0; t < this.t; ++t)\n                    if (0 != this[t])\n                        return t * this.DB + s(this[t]);\n                return this.s < 0 ? this.t * this.DB : -1\n            },\n            t.prototype.bitCount = function() {\n                for (var t = 0, e = this.s & this.DM, n = 0; n < this.t; ++n)\n                    t += c(this[n] ^ e);\n                return t\n            },\n            t.prototype.testBit = function(t) {\n                var e = Math.floor(t / this.DB);\n                return e >= this.t ? 0 != this.s : 0 != (this[e] & 1 << t % this.DB)\n            },\n            t.prototype.setBit = function(t) {\n                return this.changeBit(t, o)\n            },\n            t.prototype.clearBit = function(t) {\n                return this.changeBit(t, a)\n            },\n            t.prototype.flipBit = function(t) {\n                return this.changeBit(t, i)\n            },\n            t.prototype.add = function(t) {\n                var e = N();\n                return this.addTo(t, e),\n                    e\n            },\n            t.prototype.subtract = function(t) {\n                var e = N();\n                return this.subTo(t, e),\n                    e\n            },\n            t.prototype.multiply = function(t) {\n                var e = N();\n                return this.multiplyTo(t, e),\n                    e\n            },\n            t.prototype.divide = function(t) {\n                var e = N();\n                return this.divRemTo(t, e, null),\n                    e\n            },\n            t.prototype.remainder = function(t) {\n                var e = N();\n                return this.divRemTo(t, null, e),\n                    e\n            },\n            t.prototype.divideAndRemainder = function(t) {\n                var e = N(),\n                    n = N();\n                return this.divRemTo(t, e, n),\n                    [e, n]\n            },\n            t.prototype.modPow = function(t, e) {\n                var n, r, o = t.bitLength(),\n                    i = U(1);\n                if (o <= 0)\n                    return i;\n                n = o < 18 ? 1 : o < 48 ? 3 : o < 144 ? 4 : o < 768 ? 5 : 6,\n                    r = o < 8 ? new P(e) : e.isEven() ? new B(e) : new D(e);\n                var a = [],\n                    s = 3,\n                    c = n - 1,\n                    u = (1 << n) - 1;\n                if (a[1] = r.convert(this),\n                    n > 1) {\n                    var l = N();\n                    for (r.sqrTo(a[1], l); s <= u;)\n                        a[s] = N(),\n                        r.mulTo(l, a[s - 2], a[s]),\n                        s += 2\n                }\n                var f, p, d = t.t - 1,\n                    h = !0,\n                    m = N();\n                for (o = H(t[d]) - 1; d >= 0;) {\n                    for (o >= c ? f = t[d] >> o - c & u : (f = (t[d] & (1 << o + 1) - 1) << c - o,\n                            d > 0 && (f |= t[d - 1] >> this.DB + o - c)),\n                        s = n; 0 == (1 & f);)\n                        f >>= 1,\n                        --s;\n                    if ((o -= s) < 0 && (o += this.DB,\n                            --d),\n                        h)\n                        a[f].copyTo(i),\n                        h = !1;\n                    else {\n                        for (; s > 1;)\n                            r.sqrTo(i, m),\n                            r.sqrTo(m, i),\n                            s -= 2;\n                        s > 0 ? r.sqrTo(i, m) : (p = i,\n                                i = m,\n                                m = p),\n                            r.mulTo(m, a[f], i)\n                    }\n                    for (; d >= 0 && 0 == (t[d] & 1 << o);)\n                        r.sqrTo(i, m),\n                        p = i,\n                        i = m,\n                        m = p,\n                        --o < 0 && (o = this.DB - 1,\n                            --d)\n                }\n                return r.revert(i)\n            },\n            t.prototype.modInverse = function(e) {\n                var n = e.isEven();\n                if (this.isEven() && n || 0 == e.signum())\n                    return t.ZERO;\n                for (var r = e.clone(), o = this.clone(), i = U(1), a = U(0), s = U(0), c = U(1); 0 != r.signum();) {\n                    for (; r.isEven();)\n                        r.rShiftTo(1, r),\n                        n ? (i.isEven() && a.isEven() || (i.addTo(this, i),\n                                a.subTo(e, a)),\n                            i.rShiftTo(1, i)) : a.isEven() || a.subTo(e, a),\n                        a.rShiftTo(1, a);\n                    for (; o.isEven();)\n                        o.rShiftTo(1, o),\n                        n ? (s.isEven() && c.isEven() || (s.addTo(this, s),\n                                c.subTo(e, c)),\n                            s.rShiftTo(1, s)) : c.isEven() || c.subTo(e, c),\n                        c.rShiftTo(1, c);\n                    r.compareTo(o) >= 0 ? (r.subTo(o, r),\n                        n && i.subTo(s, i),\n                        a.subTo(c, a)) : (o.subTo(r, o),\n                        n && s.subTo(i, s),\n                        c.subTo(a, c))\n                }\n                return 0 != o.compareTo(t.ONE) ? t.ZERO : c.compareTo(e) >= 0 ? c.subtract(e) : c.signum() < 0 ? (c.addTo(e, c),\n                    c.signum() < 0 ? c.add(e) : c) : c\n            },\n            t.prototype.pow = function(t) {\n                return this.exp(t, new I)\n            },\n            t.prototype.gcd = function(t) {\n                var e = this.s < 0 ? this.negate() : this.clone(),\n                    n = t.s < 0 ? t.negate() : t.clone();\n                if (e.compareTo(n) < 0) {\n                    var r = e;\n                    e = n,\n                        n = r\n                }\n                var o = e.getLowestSetBit(),\n                    i = n.getLowestSetBit();\n                if (i < 0)\n                    return e;\n                for (o < i && (i = o),\n                    i > 0 && (e.rShiftTo(i, e),\n                        n.rShiftTo(i, n)); e.signum() > 0;)\n                    (o = e.getLowestSetBit()) > 0 && e.rShiftTo(o, e),\n                    (o = n.getLowestSetBit()) > 0 && n.rShiftTo(o, n),\n                    e.compareTo(n) >= 0 ? (e.subTo(n, e),\n                        e.rShiftTo(1, e)) : (n.subTo(e, n),\n                        n.rShiftTo(1, n));\n                return i > 0 && n.lShiftTo(i, n),\n                    n\n            },\n            t.prototype.isProbablePrime = function(t) {\n                var e, n = this.abs();\n                if (1 == n.t && n[0] <= T[T.length - 1]) {\n                    for (e = 0; e < T.length; ++e)\n                        if (n[0] == T[e])\n                            return !0;\n                    return !1\n                }\n                if (n.isEven())\n                    return !1;\n                for (e = 1; e < T.length;) {\n                    for (var r = T[e], o = e + 1; o < T.length && r < k;)\n                        r *= T[o++];\n                    for (r = n.modInt(r); e < o;)\n                        if (r % T[e++] == 0)\n                            return !1\n                }\n                return n.millerRabin(t)\n            },\n            t.prototype.copyTo = function(t) {\n                for (var e = this.t - 1; e >= 0; --e)\n                    t[e] = this[e];\n                t.t = this.t,\n                    t.s = this.s\n            },\n            t.prototype.fromInt = function(t) {\n                this.t = 1,\n                    this.s = t < 0 ? -1 : 0,\n                    t > 0 ? this[0] = t : t < -1 ? this[0] = t + this.DV : this.t = 0\n            },\n            t.prototype.fromString = function(e, n) {\n                var r;\n                if (16 == n)\n                    r = 4;\n                else if (8 == n)\n                    r = 3;\n                else if (256 == n)\n                    r = 8;\n                else if (2 == n)\n                    r = 1;\n                else if (32 == n)\n                    r = 5;\n                else {\n                    if (4 != n)\n                        return void this.fromRadix(e, n);\n                    r = 2\n                }\n                this.t = 0,\n                    this.s = 0;\n                for (var o = e.length, i = !1, a = 0; --o >= 0;) {\n                    var s = 8 == r ? 255 & +e[o] : F(e, o);\n                    s < 0 ? \"-\" == e.charAt(o) && (i = !0) : (i = !1,\n                        0 == a ? this[this.t++] = s : a + r > this.DB ? (this[this.t - 1] |= (s & (1 << this.DB - a) - 1) << a,\n                            this[this.t++] = s >> this.DB - a) : this[this.t - 1] |= s << a,\n                        (a += r) >= this.DB && (a -= this.DB))\n                }\n                8 == r && 0 != (128 & +e[0]) && (this.s = -1,\n                        a > 0 && (this[this.t - 1] |= (1 << this.DB - a) - 1 << a)),\n                    this.clamp(),\n                    i && t.ZERO.subTo(this, this)\n            },\n            t.prototype.clamp = function() {\n                for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t;)\n                    --this.t\n            },\n            t.prototype.dlShiftTo = function(t, e) {\n                var n;\n                for (n = this.t - 1; n >= 0; --n)\n                    e[n + t] = this[n];\n                for (n = t - 1; n >= 0; --n)\n                    e[n] = 0;\n                e.t = this.t + t,\n                    e.s = this.s\n            },\n            t.prototype.drShiftTo = function(t, e) {\n                for (var n = t; n < this.t; ++n)\n                    e[n - t] = this[n];\n                e.t = Math.max(this.t - t, 0),\n                    e.s = this.s\n            },\n            t.prototype.lShiftTo = function(t, e) {\n                for (var n = t % this.DB, r = this.DB - n, o = (1 << r) - 1, i = Math.floor(t / this.DB), a = this.s << n & this\n                        .DM, s = this.t - 1; s >= 0; --s)\n                    e[s + i + 1] = this[s] >> r | a,\n                    a = (this[s] & o) << n;\n                for (var s = i - 1; s >= 0; --s)\n                    e[s] = 0;\n                e[i] = a,\n                    e.t = this.t + i + 1,\n                    e.s = this.s,\n                    e.clamp()\n            },\n            t.prototype.rShiftTo = function(t, e) {\n                e.s = this.s;\n                var n = Math.floor(t / this.DB);\n                if (n >= this.t)\n                    e.t = 0;\n                else {\n                    var r = t % this.DB,\n                        o = this.DB - r,\n                        i = (1 << r) - 1;\n                    e[0] = this[n] >> r;\n                    for (var a = n + 1; a < this.t; ++a)\n                        e[a - n - 1] |= (this[a] & i) << o,\n                        e[a - n] = this[a] >> r;\n                    r > 0 && (e[this.t - n - 1] |= (this.s & i) << o),\n                        e.t = this.t - n,\n                        e.clamp()\n                }\n            },\n            t.prototype.subTo = function(t, e) {\n                for (var n = 0, r = 0, o = Math.min(t.t, this.t); n < o;)\n                    r += this[n] - t[n],\n                    e[n++] = r & this.DM,\n                    r >>= this.DB;\n                if (t.t < this.t) {\n                    for (r -= t.s; n < this.t;)\n                        r += this[n],\n                        e[n++] = r & this.DM,\n                        r >>= this.DB;\n                    r += this.s\n                } else {\n                    for (r += this.s; n < t.t;)\n                        r -= t[n],\n                        e[n++] = r & this.DM,\n                        r >>= this.DB;\n                    r -= t.s\n                }\n                e.s = r < 0 ? -1 : 0,\n                    r < -1 ? e[n++] = this.DV + r : r > 0 && (e[n++] = r),\n                    e.t = n,\n                    e.clamp()\n            },\n            t.prototype.multiplyTo = function(e, n) {\n                var r = this.abs(),\n                    o = e.abs(),\n                    i = r.t;\n                for (n.t = i + o.t; --i >= 0;)\n                    n[i] = 0;\n                for (i = 0; i < o.t; ++i)\n                    n[i + r.t] = r.am(0, o[i], n, i, 0, r.t);\n                n.s = 0,\n                    n.clamp(),\n                    this.s != e.s && t.ZERO.subTo(n, n)\n            },\n            t.prototype.squareTo = function(t) {\n                for (var e = this.abs(), n = t.t = 2 * e.t; --n >= 0;)\n                    t[n] = 0;\n                for (n = 0; n < e.t - 1; ++n) {\n                    var r = e.am(n, e[n], t, 2 * n, 0, 1);\n                    (t[n + e.t] += e.am(n + 1, 2 * e[n], t, 2 * n + 1, r, e.t - n - 1)) >= e.DV && (t[n + e.t] -= e.DV,\n                        t[n + e.t + 1] = 1)\n                }\n                t.t > 0 && (t[t.t - 1] += e.am(n, e[n], t, 2 * n, 0, 1)),\n                    t.s = 0,\n                    t.clamp()\n            },\n            t.prototype.divRemTo = function(e, n, r) {\n                var o = e.abs();\n                if (!(o.t <= 0)) {\n                    var i = this.abs();\n                    if (i.t < o.t)\n                        return null != n && n.fromInt(0),\n                            void(null != r && this.copyTo(r));\n                    null == r && (r = N());\n                    var a = N(),\n                        s = this.s,\n                        c = e.s,\n                        u = this.DB - H(o[o.t - 1]);\n                    u > 0 ? (o.lShiftTo(u, a),\n                        i.lShiftTo(u, r)) : (o.copyTo(a),\n                        i.copyTo(r));\n                    var l = a.t,\n                        f = a[l - 1];\n                    if (0 != f) {\n                        var p = f * (1 << this.F1) + (l > 1 ? a[l - 2] >> this.F2 : 0),\n                            d = this.FV / p,\n                            h = (1 << this.F1) / p,\n                            m = 1 << this.F2,\n                            g = r.t,\n                            v = g - l,\n                            y = null == n ? N() : n;\n                        for (a.dlShiftTo(v, y),\n                            r.compareTo(y) >= 0 && (r[r.t++] = 1,\n                                r.subTo(y, r)),\n                            t.ONE.dlShiftTo(l, y),\n                            y.subTo(a, a); a.t < l;)\n                            a[a.t++] = 0;\n                        for (; --v >= 0;) {\n                            var _ = r[--g] == f ? this.DM : Math.floor(r[g] * d + (r[g - 1] + m) * h);\n                            if ((r[g] += a.am(0, _, r, v, 0, l)) < _)\n                                for (a.dlShiftTo(v, y),\n                                    r.subTo(y, r); r[g] < --_;)\n                                    r.subTo(y, r)\n                        }\n                        null != n && (r.drShiftTo(l, n),\n                                s != c && t.ZERO.subTo(n, n)),\n                            r.t = l,\n                            r.clamp(),\n                            u > 0 && r.rShiftTo(u, r),\n                            s < 0 && t.ZERO.subTo(r, r)\n                    }\n                }\n            },\n            t.prototype.invDigit = function() {\n                if (this.t < 1)\n                    return 0;\n                var t = this[0];\n                if (0 == (1 & t))\n                    return 0;\n                var e = 3 & t;\n                return (e = (e = (e = (e = e * (2 - (15 & t) * e) & 15) * (2 - (255 & t) * e) & 255) * (2 - ((65535 & t) * e &\n                    65535)) & 65535) * (2 - t * e % this.DV) % this.DV) > 0 ? this.DV - e : -e\n            },\n            t.prototype.isEven = function() {\n                return 0 == (this.t > 0 ? 1 & this[0] : this.s)\n            },\n            t.prototype.exp = function(e, n) {\n                if (e > 4294967295 || e < 1)\n                    return t.ONE;\n                var r = N(),\n                    o = N(),\n                    i = n.convert(this),\n                    a = H(e) - 1;\n                for (i.copyTo(r); --a >= 0;)\n                    if (n.sqrTo(r, o),\n                        (e & 1 << a) > 0)\n                        n.mulTo(o, i, r);\n                    else {\n                        var s = r;\n                        r = o,\n                            o = s\n                    }\n                return n.revert(r)\n            },\n            t.prototype.chunkSize = function(t) {\n                return Math.floor(Math.LN2 * this.DB / Math.log(t))\n            },\n            t.prototype.toRadix = function(t) {\n                if (null == t && (t = 10),\n                    0 == this.signum() || t < 2 || t > 36)\n                    return \"0\";\n                var e = this.chunkSize(t),\n                    n = Math.pow(t, e),\n                    r = U(n),\n                    o = N(),\n                    i = N(),\n                    a = \"\";\n                for (this.divRemTo(r, o, i); o.signum() > 0;)\n                    a = (n + i.intValue()).toString(t).substr(1) + a,\n                    o.divRemTo(r, o, i);\n                return i.intValue().toString(t) + a\n            },\n            t.prototype.fromRadix = function(e, n) {\n                this.fromInt(0),\n                    null == n && (n = 10);\n                for (var r = this.chunkSize(n), o = Math.pow(n, r), i = !1, a = 0, s = 0, c = 0; c < e.length; ++c) {\n                    var u = F(e, c);\n                    u < 0 ? \"-\" == e.charAt(c) && 0 == this.signum() && (i = !0) : (s = n * s + u,\n                        ++a >= r && (this.dMultiply(o),\n                            this.dAddOffset(s, 0),\n                            a = 0,\n                            s = 0))\n                }\n                a > 0 && (this.dMultiply(Math.pow(n, a)),\n                        this.dAddOffset(s, 0)),\n                    i && t.ZERO.subTo(this, this)\n            },\n            t.prototype.fromNumber = function(e, n, r) {\n                if (\"number\" == typeof n)\n                    if (e < 2)\n                        this.fromInt(1);\n                    else\n                        for (this.fromNumber(e, r),\n                            this.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), o, this),\n                            this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(n);)\n                            this.dAddOffset(2, 0),\n                            this.bitLength() > e && this.subTo(t.ONE.shiftLeft(e - 1), this);\n                else {\n                    var i = [],\n                        a = 7 & e;\n                    i.length = 1 + (e >> 3),\n                        n.nextBytes(i),\n                        a > 0 ? i[0] &= (1 << a) - 1 : i[0] = 0,\n                        this.fromString(i, 256)\n                }\n            },\n            t.prototype.bitwiseTo = function(t, e, n) {\n                var r, o, i = Math.min(t.t, this.t);\n                for (r = 0; r < i; ++r)\n                    n[r] = e(this[r], t[r]);\n                if (t.t < this.t) {\n                    for (o = t.s & this.DM,\n                        r = i; r < this.t; ++r)\n                        n[r] = e(this[r], o);\n                    n.t = this.t\n                } else {\n                    for (o = this.s & this.DM,\n                        r = i; r < t.t; ++r)\n                        n[r] = e(o, t[r]);\n                    n.t = t.t\n                }\n                n.s = e(this.s, t.s),\n                    n.clamp()\n            },\n            t.prototype.changeBit = function(e, n) {\n                var r = t.ONE.shiftLeft(e);\n                return this.bitwiseTo(r, n, r),\n                    r\n            },\n            t.prototype.addTo = function(t, e) {\n                for (var n = 0, r = 0, o = Math.min(t.t, this.t); n < o;)\n                    r += this[n] + t[n],\n                    e[n++] = r & this.DM,\n                    r >>= this.DB;\n                if (t.t < this.t) {\n                    for (r += t.s; n < this.t;)\n                        r += this[n],\n                        e[n++] = r & this.DM,\n                        r >>= this.DB;\n                    r += this.s\n                } else {\n                    for (r += this.s; n < t.t;)\n                        r += t[n],\n                        e[n++] = r & this.DM,\n                        r >>= this.DB;\n                    r += t.s\n                }\n                e.s = r < 0 ? -1 : 0,\n                    r > 0 ? e[n++] = r : r < -1 && (e[n++] = this.DV + r),\n                    e.t = n,\n                    e.clamp()\n            },\n            t.prototype.dMultiply = function(t) {\n                this[this.t] = this.am(0, t - 1, this, 0, 0, this.t),\n                    ++this.t,\n                    this.clamp()\n            },\n            t.prototype.dAddOffset = function(t, e) {\n                if (0 != t) {\n                    for (; this.t <= e;)\n                        this[this.t++] = 0;\n                    for (this[e] += t; this[e] >= this.DV;)\n                        this[e] -= this.DV,\n                        ++e >= this.t && (this[this.t++] = 0),\n                        ++this[e]\n                }\n            },\n            t.prototype.multiplyLowerTo = function(t, e, n) {\n                var r = Math.min(this.t + t.t, e);\n                for (n.s = 0,\n                    n.t = r; r > 0;)\n                    n[--r] = 0;\n                for (var o = n.t - this.t; r < o; ++r)\n                    n[r + this.t] = this.am(0, t[r], n, r, 0, this.t);\n                for (var o = Math.min(t.t, e); r < o; ++r)\n                    this.am(0, t[r], n, r, 0, e - r);\n                n.clamp()\n            },\n            t.prototype.multiplyUpperTo = function(t, e, n) {\n                --e;\n                var r = n.t = this.t + t.t - e;\n                for (n.s = 0; --r >= 0;)\n                    n[r] = 0;\n                for (r = Math.max(e - this.t, 0); r < t.t; ++r)\n                    n[this.t + r - e] = this.am(e - r, t[r], n, 0, 0, this.t + r - e);\n                n.clamp(),\n                    n.drShiftTo(1, n)\n            },\n            t.prototype.modInt = function(t) {\n                if (t <= 0)\n                    return 0;\n                var e = this.DV % t,\n                    n = this.s < 0 ? t - 1 : 0;\n                if (this.t > 0)\n                    if (0 == e)\n                        n = this[0] % t;\n                    else\n                        for (var r = this.t - 1; r >= 0; --r)\n                            n = (e * n + this[r]) % t;\n                return n\n            },\n            t.prototype.millerRabin = function(e) {\n                var n = this.subtract(t.ONE),\n                    r = n.getLowestSetBit();\n                if (r <= 0)\n                    return !1;\n                var o = n.shiftRight(r);\n                (e = e + 1 >> 1) > T.length && (e = T.length);\n                for (var i = N(), a = 0; a < e; ++a) {\n                    i.fromInt(T[Math.floor(Math.random() * T.length)]);\n                    var s = i.modPow(o, this);\n                    if (0 != s.compareTo(t.ONE) && 0 != s.compareTo(n)) {\n                        for (var c = 1; c++ < r && 0 != s.compareTo(n);)\n                            if (0 == (s = s.modPowInt(2, this)).compareTo(t.ONE))\n                                return !1;\n                        if (0 != s.compareTo(n))\n                            return !1\n                    }\n                }\n                return !0\n            },\n            t.prototype.square = function() {\n                var t = N();\n                return this.squareTo(t),\n                    t\n            },\n            t.prototype.gcda = function(t, e) {\n                var n = this.s < 0 ? this.negate() : this.clone(),\n                    r = t.s < 0 ? t.negate() : t.clone();\n                if (n.compareTo(r) < 0) {\n                    var o = n;\n                    n = r,\n                        r = o\n                }\n                var i = n.getLowestSetBit(),\n                    a = r.getLowestSetBit();\n                if (a < 0)\n                    e(n);\n                else {\n                    i < a && (a = i),\n                        a > 0 && (n.rShiftTo(a, n),\n                            r.rShiftTo(a, r));\n                    var s = function() {\n                        (i = n.getLowestSetBit()) > 0 && n.rShiftTo(i, n),\n                            (i = r.getLowestSetBit()) > 0 && r.rShiftTo(i, r),\n                            n.compareTo(r) >= 0 ? (n.subTo(r, n),\n                                n.rShiftTo(1, n)) : (r.subTo(n, r),\n                                r.rShiftTo(1, r)),\n                            n.signum() > 0 ? setTimeout(s, 0) : (a > 0 && r.lShiftTo(a, r),\n                                setTimeout(function() {\n                                    e(r)\n                                }, 0))\n                    };\n                    setTimeout(s, 10)\n                }\n            },\n            t.prototype.fromNumberAsync = function(e, n, r, i) {\n                if (\"number\" == typeof n)\n                    if (e < 2)\n                        this.fromInt(1);\n                    else {\n                        this.fromNumber(e, r),\n                            this.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), o, this),\n                            this.isEven() && this.dAddOffset(1, 0);\n                        var a = this,\n                            s = function() {\n                                a.dAddOffset(2, 0),\n                                    a.bitLength() > e && a.subTo(t.ONE.shiftLeft(e - 1), a),\n                                    a.isProbablePrime(n) ? setTimeout(function() {\n                                        i()\n                                    }, 0) : setTimeout(s, 0)\n                            };\n                        setTimeout(s, 0)\n                    }\n                else {\n                    var c = [],\n                        u = 7 & e;\n                    c.length = 1 + (e >> 3),\n                        n.nextBytes(c),\n                        u > 0 ? c[0] &= (1 << u) - 1 : c[0] = 0,\n                        this.fromString(c, 256)\n                }\n            },\n            t\n    }(),\n    I = function() {\n        function t() {}\n        return t.prototype.convert = function(t) {\n                return t\n            },\n            t.prototype.revert = function(t) {\n                return t\n            },\n            t.prototype.mulTo = function(t, e, n) {\n                t.multiplyTo(e, n)\n            },\n            t.prototype.sqrTo = function(t, e) {\n                t.squareTo(e)\n            },\n            t\n    }(),\n    P = function() {\n        function t(t) {\n            this.m = t\n        }\n        return t.prototype.convert = function(t) {\n                return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t\n            },\n            t.prototype.revert = function(t) {\n                return t\n            },\n            t.prototype.reduce = function(t) {\n                t.divRemTo(this.m, null, t)\n            },\n            t.prototype.mulTo = function(t, e, n) {\n                t.multiplyTo(e, n),\n                    this.reduce(n)\n            },\n            t.prototype.sqrTo = function(t, e) {\n                t.squareTo(e),\n                    this.reduce(e)\n            },\n            t\n    }(),\n    D = function() {\n        function t(t) {\n            this.m = t,\n                this.mp = t.invDigit(),\n                this.mpl = 32767 & this.mp,\n                this.mph = this.mp >> 15,\n                this.um = (1 << t.DB - 15) - 1,\n                this.mt2 = 2 * t.t\n        }\n        return t.prototype.convert = function(t) {\n                var e = N();\n                return t.abs().dlShiftTo(this.m.t, e),\n                    e.divRemTo(this.m, null, e),\n                    t.s < 0 && e.compareTo(A.ZERO) > 0 && this.m.subTo(e, e),\n                    e\n            },\n            t.prototype.revert = function(t) {\n                var e = N();\n                return t.copyTo(e),\n                    this.reduce(e),\n                    e\n            },\n            t.prototype.reduce = function(t) {\n                for (; t.t <= this.mt2;)\n                    t[t.t++] = 0;\n                for (var e = 0; e < this.m.t; ++e) {\n                    var n = 32767 & t[e],\n                        r = n * this.mpl + ((n * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;\n                    for (n = e + this.m.t,\n                        t[n] += this.m.am(0, r, t, e, 0, this.m.t); t[n] >= t.DV;)\n                        t[n] -= t.DV,\n                        t[++n]++\n                }\n                t.clamp(),\n                    t.drShiftTo(this.m.t, t),\n                    t.compareTo(this.m) >= 0 && t.subTo(this.m, t)\n            },\n            t.prototype.mulTo = function(t, e, n) {\n                t.multiplyTo(e, n),\n                    this.reduce(n)\n            },\n            t.prototype.sqrTo = function(t, e) {\n                t.squareTo(e),\n                    this.reduce(e)\n            },\n            t\n    }(),\n    B = function() {\n        function t(t) {\n            this.m = t,\n                this.r2 = N(),\n                this.q3 = N(),\n                A.ONE.dlShiftTo(2 * t.t, this.r2),\n                this.mu = this.r2.divide(t)\n        }\n        return t.prototype.convert = function(t) {\n                if (t.s < 0 || t.t > 2 * this.m.t)\n                    return t.mod(this.m);\n                if (t.compareTo(this.m) < 0)\n                    return t;\n                var e = N();\n                return t.copyTo(e),\n                    this.reduce(e),\n                    e\n            },\n            t.prototype.revert = function(t) {\n                return t\n            },\n            t.prototype.reduce = function(t) {\n                for (t.drShiftTo(this.m.t - 1, this.r2),\n                    t.t > this.m.t + 1 && (t.t = this.m.t + 1,\n                        t.clamp()),\n                    this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3),\n                    this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0;)\n                    t.dAddOffset(1, this.m.t + 1);\n                for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0;)\n                    t.subTo(this.m, t)\n            },\n            t.prototype.mulTo = function(t, e, n) {\n                t.multiplyTo(e, n),\n                    this.reduce(n)\n            },\n            t.prototype.sqrTo = function(t, e) {\n                t.squareTo(e),\n                    this.reduce(e)\n            },\n            t\n    }();\n\nfunction N() {\n    return new A(null)\n}\n\nfunction j(t, e) {\n    return new A(t, e)\n}\n\"Microsoft Internet Explorer\" == navigator.appName ? (A.prototype.am = function(t, e, n, r, o, i) {\n            for (var a = 32767 & e, s = e >> 15; --i >= 0;) {\n                var c = 32767 & this[t],\n                    u = this[t++] >> 15,\n                    l = s * c + u * a;\n                c = a * c + ((32767 & l) << 15) + n[r] + (1073741823 & o),\n                    o = (c >>> 30) + (l >>> 15) + s * u + (o >>> 30),\n                    n[r++] = 1073741823 & c\n            }\n            return o\n        },\n        S = 30) : \"Netscape\" != navigator.appName ? (A.prototype.am = function(t, e, n, r, o, i) {\n            for (; --i >= 0;) {\n                var a = e * this[t++] + n[r] + o;\n                o = Math.floor(a / 67108864),\n                    n[r++] = 67108863 & a\n            }\n            return o\n        },\n        S = 26) : (A.prototype.am = function(t, e, n, r, o, i) {\n            for (var a = 16383 & e, s = e >> 14; --i >= 0;) {\n                var c = 16383 & this[t],\n                    u = this[t++] >> 14,\n                    l = s * c + u * a;\n                c = a * c + ((16383 & l) << 14) + n[r] + o,\n                    o = (c >> 28) + (l >> 14) + s * u,\n                    n[r++] = 268435455 & c\n            }\n            return o\n        },\n        S = 28),\n    A.prototype.DB = S,\n    A.prototype.DM = (1 << S) - 1,\n    A.prototype.DV = 1 << S,\n    A.prototype.FV = Math.pow(2, 52),\n    A.prototype.F1 = 52 - S,\n    A.prototype.F2 = 2 * S - 52;\nvar M, R, L = [];\nfor (M = \"0\".charCodeAt(0),\n    R = 0; R <= 9; ++R)\n    L[M++] = R;\nfor (M = \"a\".charCodeAt(0),\n    R = 10; R < 36; ++R)\n    L[M++] = R;\nfor (M = \"A\".charCodeAt(0),\n    R = 10; R < 36; ++R)\n    L[M++] = R;\n\nfunction F(t, e) {\n    var n = L[t.charCodeAt(e)];\n    return null == n ? -1 : n\n}\n\nfunction U(t) {\n    var e = N();\n    return e.fromInt(t),\n        e\n}\n\nfunction H(t) {\n    var e, n = 1;\n    return 0 != (e = t >>> 16) && (t = e,\n            n += 16),\n        0 != (e = t >> 8) && (t = e,\n            n += 8),\n        0 != (e = t >> 4) && (t = e,\n            n += 4),\n        0 != (e = t >> 2) && (t = e,\n            n += 2),\n        0 != (e = t >> 1) && (t = e,\n            n += 1),\n        n\n}\nA.ZERO = U(0),\n    A.ONE = U(1);\nvar q, z, V = function() {\n        function t() {\n            this.i = 0,\n                this.j = 0,\n                this.S = []\n        }\n        return t.prototype.init = function(t) {\n                var e, n, r;\n                for (e = 0; e < 256; ++e)\n                    this.S[e] = e;\n                for (n = 0,\n                    e = 0; e < 256; ++e)\n                    n = n + this.S[e] + t[e % t.length] & 255,\n                    r = this.S[e],\n                    this.S[e] = this.S[n],\n                    this.S[n] = r;\n                this.i = 0,\n                    this.j = 0\n            },\n            t.prototype.next = function() {\n                var t;\n                return this.i = this.i + 1 & 255,\n                    this.j = this.j + this.S[this.i] & 255,\n                    t = this.S[this.i],\n                    this.S[this.i] = this.S[this.j],\n                    this.S[this.j] = t,\n                    this.S[t + this.S[this.i] & 255]\n            },\n            t\n    }(),\n    W = 256,\n    K = null;\nif (null == K) {\n    K = [],\n        z = 0;\n    var G = void 0;\n    if (window.crypto && window.crypto.getRandomValues) {\n        var $ = new Uint32Array(256);\n        for (window.crypto.getRandomValues($),\n            G = 0; G < $.length; ++G)\n            K[z++] = 255 & $[G]\n    }\n    var X = function(t) {\n        if (this.count = this.count || 0,\n            this.count >= 256 || z >= W)\n            window.removeEventListener ? window.removeEventListener(\"mousemove\", X, !1) : window.detachEvent && window.detachEvent(\n                \"onmousemove\", X);\n        else\n            try {\n                var e = t.x + t.y;\n                K[z++] = 255 & e,\n                    this.count += 1\n            } catch (t) {}\n    };\n    window.addEventListener ? window.addEventListener(\"mousemove\", X, !1) : window.attachEvent && window.attachEvent(\n        \"onmousemove\", X)\n}\n\nfunction Q() {\n    if (null == q) {\n        for (q = new V; z < W;) {\n            var t = Math.floor(65536 * Math.random());\n            K[z++] = 255 & t\n        }\n        for (q.init(K),\n            z = 0; z < K.length; ++z)\n            K[z] = 0;\n        z = 0\n    }\n    return q.next()\n}\nvar Y = function() {\n        function t() {}\n        return t.prototype.nextBytes = function(t) {\n                for (var e = 0; e < t.length; ++e)\n                    t[e] = Q()\n            },\n            t\n    }(),\n    J = function() {\n        function t() {\n            this.n = null,\n                this.e = 0,\n                this.d = null,\n                this.p = null,\n                this.q = null,\n                this.dmp1 = null,\n                this.dmq1 = null,\n                this.coeff = null\n        }\n        return t.prototype.doPublic = function(t) {\n                return t.modPowInt(this.e, this.n)\n            },\n            t.prototype.doPrivate = function(t) {\n                if (null == this.p || null == this.q)\n                    return t.modPow(this.d, this.n);\n                for (var e = t.mod(this.p).modPow(this.dmp1, this.p), n = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(n) <\n                    0;)\n                    e = e.add(this.p);\n                return e.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n)\n            },\n            t.prototype.setPublic = function(t, e) {\n                null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = j(t, 16),\n                    this.e = parseInt(e, 16)) : console.error(\"Invalid RSA public key\")\n            },\n            t.prototype.encrypt = function(t) {\n                var e = function(t, e) {\n                    if (e < t.length + 11)\n                        return console.error(\"Message too long for RSA\"),\n                            null;\n                    for (var n = [], r = t.length - 1; r >= 0 && e > 0;) {\n                        var o = t.charCodeAt(r--);\n                        o < 128 ? n[--e] = o : o > 127 && o < 2048 ? (n[--e] = 63 & o | 128,\n                            n[--e] = o >> 6 | 192) : (n[--e] = 63 & o | 128,\n                            n[--e] = o >> 6 & 63 | 128,\n                            n[--e] = o >> 12 | 224)\n                    }\n                    n[--e] = 0;\n                    for (var i = new Y, a = []; e > 2;) {\n                        for (a[0] = 0; 0 == a[0];)\n                            i.nextBytes(a);\n                        n[--e] = a[0]\n                    }\n                    return n[--e] = 2,\n                        n[--e] = 0,\n                        new A(n)\n                }(t, this.n.bitLength() + 7 >> 3);\n                if (null == e)\n                    return null;\n                var n = this.doPublic(e);\n                if (null == n)\n                    return null;\n                var r = n.toString(16);\n                return 0 == (1 & r.length) ? r : \"0\" + r\n            },\n            t.prototype.setPrivate = function(t, e, n) {\n                null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = j(t, 16),\n                    this.e = parseInt(e, 16),\n                    this.d = j(n, 16)) : console.error(\"Invalid RSA private key\")\n            },\n            t.prototype.setPrivateEx = function(t, e, n, r, o, i, a, s) {\n                null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = j(t, 16),\n                    this.e = parseInt(e, 16),\n                    this.d = j(n, 16),\n                    this.p = j(r, 16),\n                    this.q = j(o, 16),\n                    this.dmp1 = j(i, 16),\n                    this.dmq1 = j(a, 16),\n                    this.coeff = j(s, 16)) : console.error(\"Invalid RSA private key\")\n            },\n            t.prototype.generate = function(t, e) {\n                var n = new Y,\n                    r = t >> 1;\n                this.e = parseInt(e, 16);\n                for (var o = new A(e, 16);;) {\n                    for (; this.p = new A(t - r, 1, n),\n                        0 != this.p.subtract(A.ONE).gcd(o).compareTo(A.ONE) || !this.p.isProbablePrime(10);)\n                    ;\n                    for (; this.q = new A(r, 1, n),\n                        0 != this.q.subtract(A.ONE).gcd(o).compareTo(A.ONE) || !this.q.isProbablePrime(10);)\n                    ;\n                    if (this.p.compareTo(this.q) <= 0) {\n                        var i = this.p;\n                        this.p = this.q,\n                            this.q = i\n                    }\n                    var a = this.p.subtract(A.ONE),\n                        s = this.q.subtract(A.ONE),\n                        c = a.multiply(s);\n                    if (0 == c.gcd(o).compareTo(A.ONE)) {\n                        this.n = this.p.multiply(this.q),\n                            this.d = o.modInverse(c),\n                            this.dmp1 = this.d.mod(a),\n                            this.dmq1 = this.d.mod(s),\n                            this.coeff = this.q.modInverse(this.p);\n                        break\n                    }\n                }\n            },\n            t.prototype.decrypt = function(t) {\n                var e = j(t, 16),\n                    n = this.doPrivate(e);\n                return null == n ? null : function(t, e) {\n                    for (var n = t.toByteArray(), r = 0; r < n.length && 0 == n[r];)\n                        ++r;\n                    if (n.length - r != e - 1 || 2 != n[r])\n                        return null;\n                    for (++r; 0 != n[r];)\n                        if (++r >= n.length)\n                            return null;\n                    for (var o = \"\"; ++r < n.length;) {\n                        var i = 255 & n[r];\n                        i < 128 ? o += String.fromCharCode(i) : i > 191 && i < 224 ? (o += String.fromCharCode((31 & i) << 6 | 63 & n[\n                                r + 1]),\n                            ++r) : (o += String.fromCharCode((15 & i) << 12 | (63 & n[r + 1]) << 6 | 63 & n[r + 2]),\n                            r += 2)\n                    }\n                    return o\n                }(n, this.n.bitLength() + 7 >> 3)\n            },\n            t.prototype.generateAsync = function(t, e, n) {\n                var r = new Y,\n                    o = t >> 1;\n                this.e = parseInt(e, 16);\n                var i = new A(e, 16),\n                    a = this,\n                    s = function() {\n                        var e = function() {\n                                if (a.p.compareTo(a.q) <= 0) {\n                                    var t = a.p;\n                                    a.p = a.q,\n                                        a.q = t\n                                }\n                                var e = a.p.subtract(A.ONE),\n                                    r = a.q.subtract(A.ONE),\n                                    o = e.multiply(r);\n                                0 == o.gcd(i).compareTo(A.ONE) ? (a.n = a.p.multiply(a.q),\n                                    a.d = i.modInverse(o),\n                                    a.dmp1 = a.d.mod(e),\n                                    a.dmq1 = a.d.mod(r),\n                                    a.coeff = a.q.modInverse(a.p),\n                                    setTimeout(function() {\n                                        n()\n                                    }, 0)) : setTimeout(s, 0)\n                            },\n                            c = function() {\n                                a.q = N(),\n                                    a.q.fromNumberAsync(o, 1, r, function() {\n                                        a.q.subtract(A.ONE).gcda(i, function(t) {\n                                            0 == t.compareTo(A.ONE) && a.q.isProbablePrime(10) ? setTimeout(e, 0) : setTimeout(c, 0)\n                                        })\n                                    })\n                            },\n                            u = function() {\n                                a.p = N(),\n                                    a.p.fromNumberAsync(t - o, 1, r, function() {\n                                        a.p.subtract(A.ONE).gcda(i, function(t) {\n                                            0 == t.compareTo(A.ONE) && a.p.isProbablePrime(10) ? setTimeout(c, 0) : setTimeout(u, 0)\n                                        })\n                                    })\n                            };\n                        setTimeout(u, 0)\n                    };\n                setTimeout(s, 0)\n            },\n            t.prototype.sign = function(t, e, n) {\n                var r = function(t) {\n                        return Z[t] || \"\"\n                    }(n),\n                    o = r + e(t).toString(),\n                    i = function(t, e) {\n                        if (e < t.length + 22)\n                            return console.error(\"Message too long for RSA\"),\n                                null;\n                        for (var n = e - t.length - 6, r = \"\", o = 0; o < n; o += 2)\n                            r += \"ff\";\n                        return j(\"0001\" + r + \"00\" + t, 16)\n                    }(o, this.n.bitLength() / 4);\n                if (null == i)\n                    return null;\n                var a = this.doPrivate(i);\n                if (null == a)\n                    return null;\n                var s = a.toString(16);\n                return 0 == (1 & s.length) ? s : \"0\" + s\n            },\n            t.prototype.verify = function(t, e, n) {\n                var r = j(e, 16),\n                    o = this.doPublic(r);\n                if (null == o)\n                    return null;\n                var i = o.toString(16).replace(/^1f+00/, \"\"),\n                    a = function(t) {\n                        for (var e in Z)\n                            if (Z.hasOwnProperty(e)) {\n                                var n = Z[e],\n                                    r = n.length;\n                                if (t.substr(0, r) == n)\n                                    return t.substr(r)\n                            }\n                        return t\n                    }\n                /*!\n                Copyright (c) 2011, Yahoo! Inc. All rights reserved.\n                Code licensed under the BSD License:\n                http://developer.yahoo.com/yui/license.html\n                version: 2.9.0\n                */\n                (i);\n                return a == n(t).toString()\n            },\n            t\n    }(),\n    Z = {\n        md2: \"3020300c06082a864886f70d020205000410\",\n        md5: \"3020300c06082a864886f70d020505000410\",\n        sha1: \"3021300906052b0e03021a05000414\",\n        sha224: \"302d300d06096086480165030402040500041c\",\n        sha256: \"3031300d060960864801650304020105000420\",\n        sha384: \"3041300d060960864801650304020205000430\",\n        sha512: \"3051300d060960864801650304020305000440\",\n        ripemd160: \"3021300906052b2403020105000414\"\n    },\n    tt = {};\ntt.lang = {\n    extend: function(t, e, n) {\n        if (!e || !t)\n            throw new Error(\"YAHOO.lang.extend failed, please check that all dependencies are included.\");\n        var r = function() {};\n        if (r.prototype = e.prototype,\n            t.prototype = new r,\n            t.prototype.constructor = t,\n            t.superclass = e.prototype,\n            e.prototype.constructor == Object.prototype.constructor && (e.prototype.constructor = e),\n            n) {\n            var o;\n            for (o in n)\n                t.prototype[o] = n[o];\n            var i = function() {},\n                a = [\"toString\", \"valueOf\"];\n            try {\n                /MSIE/.test(navigator.userAgent) && (i = function(t, e) {\n                    for (o = 0; o < a.length; o += 1) {\n                        var n = a[o],\n                            r = e[n];\n                        \"function\" == typeof r && r != Object.prototype[n] && (t[n] = r)\n                    }\n                })\n            } catch (t) {}\n            i(t.prototype, n)\n        }\n    }\n};\n/**\n * @fileOverview\n * @name asn1-1.0.js\n * @author Kenji Urushima kenji.urushima@gmail.com\n * @version asn1 1.0.13 (2017-Jun-02)\n * @since jsrsasign 2.1\n * @license <a href=\"https://kjur.github.io/jsrsasign/license/\">MIT License</a>\n */\nvar et = {};\nvoid 0 !== et.asn1 && et.asn1 || (et.asn1 = {}),\n    et.asn1.ASN1Util = new function() {\n        this.integerToByteHex = function(t) {\n                var e = t.toString(16);\n                return e.length % 2 == 1 && (e = \"0\" + e),\n                    e\n            },\n            this.bigIntToMinTwosComplementsHex = function(t) {\n                var e = t.toString(16);\n                if (\"-\" != e.substr(0, 1))\n                    e.length % 2 == 1 ? e = \"0\" + e : e.match(/^[0-7]/) || (e = \"00\" + e);\n                else {\n                    var n = e.substr(1),\n                        r = n.length;\n                    r % 2 == 1 ? r += 1 : e.match(/^[0-7]/) || (r += 2);\n                    for (var o = \"\", i = 0; i < r; i++)\n                        o += \"f\";\n                    var a = new A(o, 16),\n                        s = a.xor(t).add(A.ONE);\n                    e = s.toString(16).replace(/^-/, \"\")\n                }\n                return e\n            },\n            this.getPEMStringFromHex = function(t, e) {\n                return hextopem(t, e)\n            },\n            this.newObject = function(t) {\n                var e = et,\n                    n = e.asn1,\n                    r = n.DERBoolean,\n                    o = n.DERInteger,\n                    i = n.DERBitString,\n                    a = n.DEROctetString,\n                    s = n.DERNull,\n                    c = n.DERObjectIdentifier,\n                    u = n.DEREnumerated,\n                    l = n.DERUTF8String,\n                    f = n.DERNumericString,\n                    p = n.DERPrintableString,\n                    d = n.DERTeletexString,\n                    h = n.DERIA5String,\n                    m = n.DERUTCTime,\n                    g = n.DERGeneralizedTime,\n                    v = n.DERSequence,\n                    y = n.DERSet,\n                    _ = n.DERTaggedObject,\n                    x = n.ASN1Util.newObject,\n                    b = Object.keys(t);\n                if (1 != b.length)\n                    throw \"key of param shall be only one.\";\n                var w = b[0];\n                if (-1 ==\n                    \":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:\".indexOf(\n                        \":\" + w + \":\"))\n                    throw \"undefined key: \" + w;\n                if (\"bool\" == w)\n                    return new r(t[w]);\n                if (\"int\" == w)\n                    return new o(t[w]);\n                if (\"bitstr\" == w)\n                    return new i(t[w]);\n                if (\"octstr\" == w)\n                    return new a(t[w]);\n                if (\"null\" == w)\n                    return new s(t[w]);\n                if (\"oid\" == w)\n                    return new c(t[w]);\n                if (\"enum\" == w)\n                    return new u(t[w]);\n                if (\"utf8str\" == w)\n                    return new l(t[w]);\n                if (\"numstr\" == w)\n                    return new f(t[w]);\n                if (\"prnstr\" == w)\n                    return new p(t[w]);\n                if (\"telstr\" == w)\n                    return new d(t[w]);\n                if (\"ia5str\" == w)\n                    return new h(t[w]);\n                if (\"utctime\" == w)\n                    return new m(t[w]);\n                if (\"gentime\" == w)\n                    return new g(t[w]);\n                if (\"seq\" == w) {\n                    for (var S = t[w], E = [], O = 0; O < S.length; O++) {\n                        var C = x(S[O]);\n                        E.push(C)\n                    }\n                    return new v({\n                        array: E\n                    })\n                }\n                if (\"set\" == w) {\n                    for (var S = t[w], E = [], O = 0; O < S.length; O++) {\n                        var C = x(S[O]);\n                        E.push(C)\n                    }\n                    return new y({\n                        array: E\n                    })\n                }\n                if (\"tag\" == w) {\n                    var T = t[w];\n                    if (\"[object Array]\" === Object.prototype.toString.call(T) && 3 == T.length) {\n                        var k = x(T[2]);\n                        return new _({\n                            tag: T[0],\n                            explicit: T[1],\n                            obj: k\n                        })\n                    }\n                    var A = {};\n                    if (void 0 !== T.explicit && (A.explicit = T.explicit),\n                        void 0 !== T.tag && (A.tag = T.tag),\n                        void 0 === T.obj)\n                        throw \"obj shall be specified for 'tag'.\";\n                    return A.obj = x(T.obj),\n                        new _(A)\n                }\n            },\n            this.jsonToASN1HEX = function(t) {\n                var e = this.newObject(t);\n                return e.getEncodedHex()\n            }\n    },\n    et.asn1.ASN1Util.oidHexToInt = function(t) {\n        for (var e = \"\", n = parseInt(t.substr(0, 2), 16), r = Math.floor(n / 40), o = n % 40, e = r + \".\" + o, i = \"\", a =\n                2; a < t.length; a += 2) {\n            var s = parseInt(t.substr(a, 2), 16),\n                c = (\"00000000\" + s.toString(2)).slice(-8);\n            if (i += c.substr(1, 7),\n                \"0\" == c.substr(0, 1)) {\n                var u = new A(i, 2);\n                e = e + \".\" + u.toString(10),\n                    i = \"\"\n            }\n        }\n        return e\n    },\n    et.asn1.ASN1Util.oidIntToHex = function(t) {\n        var e = function(t) {\n                var e = t.toString(16);\n                return 1 == e.length && (e = \"0\" + e),\n                    e\n            },\n            n = function(t) {\n                var n = \"\",\n                    r = new A(t, 10),\n                    o = r.toString(2),\n                    i = 7 - o.length % 7;\n                7 == i && (i = 0);\n                for (var a = \"\", s = 0; s < i; s++)\n                    a += \"0\";\n                o = a + o;\n                for (var s = 0; s < o.length - 1; s += 7) {\n                    var c = o.substr(s, 7);\n                    s != o.length - 7 && (c = \"1\" + c),\n                        n += e(parseInt(c, 2))\n                }\n                return n\n            };\n        if (!t.match(/^[0-9.]+$/))\n            throw \"malformed oid string: \" + t;\n        var r = \"\",\n            o = t.split(\".\"),\n            i = 40 * parseInt(o[0]) + parseInt(o[1]);\n        r += e(i),\n            o.splice(0, 2);\n        for (var a = 0; a < o.length; a++)\n            r += n(o[a]);\n        return r\n    },\n    et.asn1.ASN1Object = function() {\n        this.getLengthHexFromValue = function() {\n                if (void 0 === this.hV || null == this.hV)\n                    throw \"this.hV is null or undefined.\";\n                if (this.hV.length % 2 == 1)\n                    throw \"value hex must be even length: n=\" + \"\".length + \",v=\" + this.hV;\n                var t = this.hV.length / 2,\n                    e = t.toString(16);\n                if (e.length % 2 == 1 && (e = \"0\" + e),\n                    t < 128)\n                    return e;\n                var n = e.length / 2;\n                if (n > 15)\n                    throw \"ASN.1 length too long to represent by 8x: n = \" + t.toString(16);\n                var r = 128 + n;\n                return r.toString(16) + e\n            },\n            this.getEncodedHex = function() {\n                return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(),\n                        this.hL = this.getLengthHexFromValue(),\n                        this.hTLV = this.hT + this.hL + this.hV,\n                        this.isModified = !1),\n                    this.hTLV\n            },\n            this.getValueHex = function() {\n                return this.getEncodedHex(),\n                    this.hV\n            },\n            this.getFreshValueHex = function() {\n                return \"\"\n            }\n    },\n    et.asn1.DERAbstractString = function(t) {\n        et.asn1.DERAbstractString.superclass.constructor.call(this),\n            this.getString = function() {\n                return this.s\n            },\n            this.setString = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.s = t,\n                    this.hV = stohex(this.s)\n            },\n            this.setStringHex = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.s = null,\n                    this.hV = t\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            },\n            void 0 !== t && (\"string\" == typeof t ? this.setString(t) : void 0 !== t.str ? this.setString(t.str) : void 0 !==\n                t.hex && this.setStringHex(t.hex))\n    },\n    tt.lang.extend(et.asn1.DERAbstractString, et.asn1.ASN1Object),\n    et.asn1.DERAbstractTime = function(t) {\n        et.asn1.DERAbstractTime.superclass.constructor.call(this),\n            this.localDateToUTC = function(t) {\n                utc = t.getTime() + 6e4 * t.getTimezoneOffset();\n                var e = new Date(utc);\n                return e\n            },\n            this.formatDate = function(t, e, n) {\n                var r = this.zeroPadding,\n                    o = this.localDateToUTC(t),\n                    i = String(o.getFullYear());\n                \"utc\" == e && (i = i.substr(2, 2));\n                var a = r(String(o.getMonth() + 1), 2),\n                    s = r(String(o.getDate()), 2),\n                    c = r(String(o.getHours()), 2),\n                    u = r(String(o.getMinutes()), 2),\n                    l = r(String(o.getSeconds()), 2),\n                    f = i + a + s + c + u + l;\n                if (!0 === n) {\n                    var p = o.getMilliseconds();\n                    if (0 != p) {\n                        var d = r(String(p), 3);\n                        d = d.replace(/[0]+$/, \"\"),\n                            f = f + \".\" + d\n                    }\n                }\n                return f + \"Z\"\n            },\n            this.zeroPadding = function(t, e) {\n                return t.length >= e ? t : new Array(e - t.length + 1).join(\"0\") + t\n            },\n            this.getString = function() {\n                return this.s\n            },\n            this.setString = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.s = t,\n                    this.hV = stohex(t)\n            },\n            this.setByDateValue = function(t, e, n, r, o, i) {\n                var a = new Date(Date.UTC(t, e - 1, n, r, o, i, 0));\n                this.setByDate(a)\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            }\n    },\n    tt.lang.extend(et.asn1.DERAbstractTime, et.asn1.ASN1Object),\n    et.asn1.DERAbstractStructured = function(t) {\n        et.asn1.DERAbstractString.superclass.constructor.call(this),\n            this.setByASN1ObjectArray = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.asn1Array = t\n            },\n            this.appendASN1Object = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.asn1Array.push(t)\n            },\n            this.asn1Array = new Array,\n            void 0 !== t && void 0 !== t.array && (this.asn1Array = t.array)\n    },\n    tt.lang.extend(et.asn1.DERAbstractStructured, et.asn1.ASN1Object),\n    et.asn1.DERBoolean = function() {\n        et.asn1.DERBoolean.superclass.constructor.call(this),\n            this.hT = \"01\",\n            this.hTLV = \"0101ff\"\n    },\n    tt.lang.extend(et.asn1.DERBoolean, et.asn1.ASN1Object),\n    et.asn1.DERInteger = function(t) {\n        et.asn1.DERInteger.superclass.constructor.call(this),\n            this.hT = \"02\",\n            this.setByBigInteger = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.hV = et.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)\n            },\n            this.setByInteger = function(t) {\n                var e = new A(String(t), 10);\n                this.setByBigInteger(e)\n            },\n            this.setValueHex = function(t) {\n                this.hV = t\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            },\n            void 0 !== t && (void 0 !== t.bigint ? this.setByBigInteger(t.bigint) : void 0 !== t.int ? this.setByInteger(t.int) :\n                \"number\" == typeof t ? this.setByInteger(t) : void 0 !== t.hex && this.setValueHex(t.hex))\n    },\n    tt.lang.extend(et.asn1.DERInteger, et.asn1.ASN1Object),\n    et.asn1.DERBitString = function(t) {\n        if (void 0 !== t && void 0 !== t.obj) {\n            var e = et.asn1.ASN1Util.newObject(t.obj);\n            t.hex = \"00\" + e.getEncodedHex()\n        }\n        et.asn1.DERBitString.superclass.constructor.call(this),\n            this.hT = \"03\",\n            this.setHexValueIncludingUnusedBits = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.hV = t\n            },\n            this.setUnusedBitsAndHexValue = function(t, e) {\n                if (t < 0 || 7 < t)\n                    throw \"unused bits shall be from 0 to 7: u = \" + t;\n                var n = \"0\" + t;\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.hV = n + e\n            },\n            this.setByBinaryString = function(t) {\n                var e = 8 - (t = t.replace(/0+$/, \"\")).length % 8;\n                8 == e && (e = 0);\n                for (var n = 0; n <= e; n++)\n                    t += \"0\";\n                for (var r = \"\", n = 0; n < t.length - 1; n += 8) {\n                    var o = t.substr(n, 8),\n                        i = parseInt(o, 2).toString(16);\n                    1 == i.length && (i = \"0\" + i),\n                        r += i\n                }\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.hV = \"0\" + e + r\n            },\n            this.setByBooleanArray = function(t) {\n                for (var e = \"\", n = 0; n < t.length; n++)\n                    1 == t[n] ? e += \"1\" : e += \"0\";\n                this.setByBinaryString(e)\n            },\n            this.newFalseArray = function(t) {\n                for (var e = new Array(t), n = 0; n < t; n++)\n                    e[n] = !1;\n                return e\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            },\n            void 0 !== t && (\"string\" == typeof t && t.toLowerCase().match(/^[0-9a-f]+$/) ? this.setHexValueIncludingUnusedBits(\n                t) : void 0 !== t.hex ? this.setHexValueIncludingUnusedBits(t.hex) : void 0 !== t.bin ? this.setByBinaryString(\n                t.bin) : void 0 !== t.array && this.setByBooleanArray(t.array))\n    },\n    tt.lang.extend(et.asn1.DERBitString, et.asn1.ASN1Object),\n    et.asn1.DEROctetString = function(t) {\n        if (void 0 !== t && void 0 !== t.obj) {\n            var e = et.asn1.ASN1Util.newObject(t.obj);\n            t.hex = e.getEncodedHex()\n        }\n        et.asn1.DEROctetString.superclass.constructor.call(this, t),\n            this.hT = \"04\"\n    },\n    tt.lang.extend(et.asn1.DEROctetString, et.asn1.DERAbstractString),\n    et.asn1.DERNull = function() {\n        et.asn1.DERNull.superclass.constructor.call(this),\n            this.hT = \"05\",\n            this.hTLV = \"0500\"\n    },\n    tt.lang.extend(et.asn1.DERNull, et.asn1.ASN1Object),\n    et.asn1.DERObjectIdentifier = function(t) {\n        var e = function(t) {\n                var e = t.toString(16);\n                return 1 == e.length && (e = \"0\" + e),\n                    e\n            },\n            n = function(t) {\n                var n = \"\",\n                    r = new A(t, 10),\n                    o = r.toString(2),\n                    i = 7 - o.length % 7;\n                7 == i && (i = 0);\n                for (var a = \"\", s = 0; s < i; s++)\n                    a += \"0\";\n                o = a + o;\n                for (var s = 0; s < o.length - 1; s += 7) {\n                    var c = o.substr(s, 7);\n                    s != o.length - 7 && (c = \"1\" + c),\n                        n += e(parseInt(c, 2))\n                }\n                return n\n            };\n        et.asn1.DERObjectIdentifier.superclass.constructor.call(this),\n            this.hT = \"06\",\n            this.setValueHex = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.s = null,\n                    this.hV = t\n            },\n            this.setValueOidString = function(t) {\n                if (!t.match(/^[0-9.]+$/))\n                    throw \"malformed oid string: \" + t;\n                var r = \"\",\n                    o = t.split(\".\"),\n                    i = 40 * parseInt(o[0]) + parseInt(o[1]);\n                r += e(i),\n                    o.splice(0, 2);\n                for (var a = 0; a < o.length; a++)\n                    r += n(o[a]);\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.s = null,\n                    this.hV = r\n            },\n            this.setValueName = function(t) {\n                var e = et.asn1.x509.OID.name2oid(t);\n                if (\"\" === e)\n                    throw \"DERObjectIdentifier oidName undefined: \" + t;\n                this.setValueOidString(e)\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            },\n            void 0 !== t && (\"string\" == typeof t ? t.match(/^[0-2].[0-9.]+$/) ? this.setValueOidString(t) : this.setValueName(\n                    t) : void 0 !== t.oid ? this.setValueOidString(t.oid) : void 0 !== t.hex ? this.setValueHex(t.hex) : void 0 !==\n                t.name && this.setValueName(t.name))\n    },\n    tt.lang.extend(et.asn1.DERObjectIdentifier, et.asn1.ASN1Object),\n    et.asn1.DEREnumerated = function(t) {\n        et.asn1.DEREnumerated.superclass.constructor.call(this),\n            this.hT = \"0a\",\n            this.setByBigInteger = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.hV = et.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)\n            },\n            this.setByInteger = function(t) {\n                var e = new A(String(t), 10);\n                this.setByBigInteger(e)\n            },\n            this.setValueHex = function(t) {\n                this.hV = t\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            },\n            void 0 !== t && (void 0 !== t.int ? this.setByInteger(t.int) : \"number\" == typeof t ? this.setByInteger(t) : void 0 !==\n                t.hex && this.setValueHex(t.hex))\n    },\n    tt.lang.extend(et.asn1.DEREnumerated, et.asn1.ASN1Object),\n    et.asn1.DERUTF8String = function(t) {\n        et.asn1.DERUTF8String.superclass.constructor.call(this, t),\n            this.hT = \"0c\"\n    },\n    tt.lang.extend(et.asn1.DERUTF8String, et.asn1.DERAbstractString),\n    et.asn1.DERNumericString = function(t) {\n        et.asn1.DERNumericString.superclass.constructor.call(this, t),\n            this.hT = \"12\"\n    },\n    tt.lang.extend(et.asn1.DERNumericString, et.asn1.DERAbstractString),\n    et.asn1.DERPrintableString = function(t) {\n        et.asn1.DERPrintableString.superclass.constructor.call(this, t),\n            this.hT = \"13\"\n    },\n    tt.lang.extend(et.asn1.DERPrintableString, et.asn1.DERAbstractString),\n    et.asn1.DERTeletexString = function(t) {\n        et.asn1.DERTeletexString.superclass.constructor.call(this, t),\n            this.hT = \"14\"\n    },\n    tt.lang.extend(et.asn1.DERTeletexString, et.asn1.DERAbstractString),\n    et.asn1.DERIA5String = function(t) {\n        et.asn1.DERIA5String.superclass.constructor.call(this, t),\n            this.hT = \"16\"\n    },\n    tt.lang.extend(et.asn1.DERIA5String, et.asn1.DERAbstractString),\n    et.asn1.DERUTCTime = function(t) {\n        et.asn1.DERUTCTime.superclass.constructor.call(this, t),\n            this.hT = \"17\",\n            this.setByDate = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.date = t,\n                    this.s = this.formatDate(this.date, \"utc\"),\n                    this.hV = stohex(this.s)\n            },\n            this.getFreshValueHex = function() {\n                return void 0 === this.date && void 0 === this.s && (this.date = new Date,\n                        this.s = this.formatDate(this.date, \"utc\"),\n                        this.hV = stohex(this.s)),\n                    this.hV\n            },\n            void 0 !== t && (void 0 !== t.str ? this.setString(t.str) : \"string\" == typeof t && t.match(/^[0-9]{12}Z$/) ?\n                this.setString(t) : void 0 !== t.hex ? this.setStringHex(t.hex) : void 0 !== t.date && this.setByDate(t.date))\n    },\n    tt.lang.extend(et.asn1.DERUTCTime, et.asn1.DERAbstractTime),\n    et.asn1.DERGeneralizedTime = function(t) {\n        et.asn1.DERGeneralizedTime.superclass.constructor.call(this, t),\n            this.hT = \"18\",\n            this.withMillis = !1,\n            this.setByDate = function(t) {\n                this.hTLV = null,\n                    this.isModified = !0,\n                    this.date = t,\n                    this.s = this.formatDate(this.date, \"gen\", this.withMillis),\n                    this.hV = stohex(this.s)\n            },\n            this.getFreshValueHex = function() {\n                return void 0 === this.date && void 0 === this.s && (this.date = new Date,\n                        this.s = this.formatDate(this.date, \"gen\", this.withMillis),\n                        this.hV = stohex(this.s)),\n                    this.hV\n            },\n            void 0 !== t && (void 0 !== t.str ? this.setString(t.str) : \"string\" == typeof t && t.match(/^[0-9]{14}Z$/) ?\n                this.setString(t) : void 0 !== t.hex ? this.setStringHex(t.hex) : void 0 !== t.date && this.setByDate(t.date),\n                !0 === t.millis && (this.withMillis = !0))\n    },\n    tt.lang.extend(et.asn1.DERGeneralizedTime, et.asn1.DERAbstractTime),\n    et.asn1.DERSequence = function(t) {\n        et.asn1.DERSequence.superclass.constructor.call(this, t),\n            this.hT = \"30\",\n            this.getFreshValueHex = function() {\n                for (var t = \"\", e = 0; e < this.asn1Array.length; e++) {\n                    var n = this.asn1Array[e];\n                    t += n.getEncodedHex()\n                }\n                return this.hV = t,\n                    this.hV\n            }\n    },\n    tt.lang.extend(et.asn1.DERSequence, et.asn1.DERAbstractStructured),\n    et.asn1.DERSet = function(t) {\n        et.asn1.DERSet.superclass.constructor.call(this, t),\n            this.hT = \"31\",\n            this.sortFlag = !0,\n            this.getFreshValueHex = function() {\n                for (var t = new Array, e = 0; e < this.asn1Array.length; e++) {\n                    var n = this.asn1Array[e];\n                    t.push(n.getEncodedHex())\n                }\n                return 1 == this.sortFlag && t.sort(),\n                    this.hV = t.join(\"\"),\n                    this.hV\n            },\n            void 0 !== t && void 0 !== t.sortflag && 0 == t.sortflag && (this.sortFlag = !1)\n    },\n    tt.lang.extend(et.asn1.DERSet, et.asn1.DERAbstractStructured),\n    et.asn1.DERTaggedObject = function(t) {\n        et.asn1.DERTaggedObject.superclass.constructor.call(this),\n            this.hT = \"a0\",\n            this.hV = \"\",\n            this.isExplicit = !0,\n            this.asn1Object = null,\n            this.setASN1Object = function(t, e, n) {\n                this.hT = e,\n                    this.isExplicit = t,\n                    this.asn1Object = n,\n                    this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(),\n                        this.hTLV = null,\n                        this.isModified = !0) : (this.hV = null,\n                        this.hTLV = n.getEncodedHex(),\n                        this.hTLV = this.hTLV.replace(/^../, e),\n                        this.isModified = !1)\n            },\n            this.getFreshValueHex = function() {\n                return this.hV\n            },\n            void 0 !== t && (void 0 !== t.tag && (this.hT = t.tag),\n                void 0 !== t.explicit && (this.isExplicit = t.explicit),\n                void 0 !== t.obj && (this.asn1Object = t.obj,\n                    this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)))\n    },\n    tt.lang.extend(et.asn1.DERTaggedObject, et.asn1.ASN1Object);\nvar nt = function(t) {\n        function e(n) {\n            var r = t.call(this) || this;\n            return n && (\"string\" == typeof n ? r.parseKey(n) : (e.hasPrivateKeyProperty(n) || e.hasPublicKeyProperty(n)) &&\n                    r.parsePropertiesFrom(n)),\n                r\n        }\n        return function(t, e) {\n                function n() {\n                    this.constructor = t\n                }\n                m(t, e),\n                    t.prototype = null === e ? Object.create(e) : (n.prototype = e.prototype,\n                        new n)\n            }(e, t),\n            e.prototype.parseKey = function(t) {\n                try {\n                    var e = 0,\n                        n = 0,\n                        r = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/.test(t) ? g.decode(t) : v.unarmor(t),\n                        o = O.decode(r);\n                    if (3 === o.sub.length && (o = o.sub[2].sub[0]),\n                        9 === o.sub.length) {\n                        e = o.sub[1].getHexStringValue(),\n                            this.n = j(e, 16),\n                            n = o.sub[2].getHexStringValue(),\n                            this.e = parseInt(n, 16);\n                        var i = o.sub[3].getHexStringValue();\n                        this.d = j(i, 16);\n                        var a = o.sub[4].getHexStringValue();\n                        this.p = j(a, 16);\n                        var s = o.sub[5].getHexStringValue();\n                        this.q = j(s, 16);\n                        var c = o.sub[6].getHexStringValue();\n                        this.dmp1 = j(c, 16);\n                        var u = o.sub[7].getHexStringValue();\n                        this.dmq1 = j(u, 16);\n                        var l = o.sub[8].getHexStringValue();\n                        this.coeff = j(l, 16)\n                    } else {\n                        if (2 !== o.sub.length)\n                            return !1;\n                        var f = o.sub[1],\n                            p = f.sub[0];\n                        e = p.sub[0].getHexStringValue(),\n                            this.n = j(e, 16),\n                            n = p.sub[1].getHexStringValue(),\n                            this.e = parseInt(n, 16)\n                    }\n                    return !0\n                } catch (t) {\n                    return !1\n                }\n            },\n            e.prototype.getPrivateBaseKey = function() {\n                var t = {\n                        array: [new et.asn1.DERInteger({\n                            int: 0\n                        }), new et.asn1.DERInteger({\n                            bigint: this.n\n                        }), new et.asn1.DERInteger({\n                            int: this.e\n                        }), new et.asn1.DERInteger({\n                            bigint: this.d\n                        }), new et.asn1.DERInteger({\n                            bigint: this.p\n                        }), new et.asn1.DERInteger({\n                            bigint: this.q\n                        }), new et.asn1.DERInteger({\n                            bigint: this.dmp1\n                        }), new et.asn1.DERInteger({\n                            bigint: this.dmq1\n                        }), new et.asn1.DERInteger({\n                            bigint: this.coeff\n                        })]\n                    },\n                    e = new et.asn1.DERSequence(t);\n                return e.getEncodedHex()\n            },\n            e.prototype.getPrivateBaseKeyB64 = function() {\n                return f(this.getPrivateBaseKey())\n            },\n            e.prototype.getPublicBaseKey = function() {\n                var t = new et.asn1.DERSequence({\n                        array: [new et.asn1.DERObjectIdentifier({\n                            oid: \"1.2.840.113549.1.1.1\"\n                        }), new et.asn1.DERNull]\n                    }),\n                    e = new et.asn1.DERSequence({\n                        array: [new et.asn1.DERInteger({\n                            bigint: this.n\n                        }), new et.asn1.DERInteger({\n                            int: this.e\n                        })]\n                    }),\n                    n = new et.asn1.DERBitString({\n                        hex: \"00\" + e.getEncodedHex()\n                    }),\n                    r = new et.asn1.DERSequence({\n                        array: [t, n]\n                    });\n                return r.getEncodedHex()\n            },\n            e.prototype.getPublicBaseKeyB64 = function() {\n                return f(this.getPublicBaseKey())\n            },\n            e.wordwrap = function(t, e) {\n                if (e = e || 64,\n                    !t)\n                    return t;\n                var n = \"(.{1,\" + e + \"})( +|$\\n?)|(.{1,\" + e + \"})\";\n                return t.match(RegExp(n, \"g\")).join(\"\\n\")\n            },\n            e.prototype.getPrivateKey = function() {\n                var t = \"-----BEGIN RSA PRIVATE KEY-----\\n\";\n                return t += e.wordwrap(this.getPrivateBaseKeyB64()) + \"\\n\",\n                    t += \"-----END RSA PRIVATE KEY-----\"\n            },\n            e.prototype.getPublicKey = function() {\n                var t = \"-----BEGIN PUBLIC KEY-----\\n\";\n                return t += e.wordwrap(this.getPublicBaseKeyB64()) + \"\\n\",\n                    t += \"-----END PUBLIC KEY-----\"\n            },\n            e.hasPublicKeyProperty = function(t) {\n                return (t = t || {}).hasOwnProperty(\"n\") && t.hasOwnProperty(\"e\")\n            },\n            e.hasPrivateKeyProperty = function(t) {\n                return (t = t || {}).hasOwnProperty(\"n\") && t.hasOwnProperty(\"e\") && t.hasOwnProperty(\"d\") && t.hasOwnProperty(\n                    \"p\") && t.hasOwnProperty(\"q\") && t.hasOwnProperty(\"dmp1\") && t.hasOwnProperty(\"dmq1\") && t.hasOwnProperty(\n                    \"coeff\")\n            },\n            e.prototype.parsePropertiesFrom = function(t) {\n                this.n = t.n,\n                    this.e = t.e,\n                    t.hasOwnProperty(\"d\") && (this.d = t.d,\n                        this.p = t.p,\n                        this.q = t.q,\n                        this.dmp1 = t.dmp1,\n                        this.dmq1 = t.dmq1,\n                        this.coeff = t.coeff)\n            },\n            e\n    }(J),\n    rt = function() {\n        function t(t) {\n            t = t || {},\n                this.default_key_size = parseInt(t.default_key_size, 10) || 1024,\n                this.default_public_exponent = t.default_public_exponent || \"010001\",\n                this.log = t.log || !1,\n                this.key = null\n        }\n        return t.prototype.setKey = function(t) {\n                this.log && this.key && console.warn(\"A key was already set, overriding existing.\"),\n                    this.key = new nt(t)\n            },\n            t.prototype.setPrivateKey = function(t) {\n                this.setKey(t)\n            },\n            t.prototype.setPublicKey = function(t) {\n                this.setKey(t)\n            },\n            t.prototype.decrypt = function(t) {\n                try {\n                    return this.getKey().decrypt(p(t))\n                } catch (t) {\n                    return !1\n                }\n            },\n            t.prototype.encrypt = function(t) {\n                try {\n                    return f(this.getKey().encrypt(t))\n                } catch (t) {\n                    return !1\n                }\n            },\n            t.prototype.sign = function(t, e, n) {\n                try {\n                    return f(this.getKey().sign(t, e, n))\n                } catch (t) {\n                    return !1\n                }\n            },\n            t.prototype.verify = function(t, e, n) {\n                try {\n                    return this.getKey().verify(t, p(e), n)\n                } catch (t) {\n                    return !1\n                }\n            },\n            t.prototype.getKey = function(t) {\n                if (!this.key) {\n                    if (this.key = new nt,\n                        t && \"[object Function]\" === {}.toString.call(t))\n                        return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t);\n                    this.key.generate(this.default_key_size, this.default_public_exponent)\n                }\n                return this.key\n            },\n            t.prototype.getPrivateKey = function() {\n                return this.getKey().getPrivateKey()\n            },\n            t.prototype.getPrivateKeyB64 = function() {\n                return this.getKey().getPrivateBaseKeyB64()\n            },\n            t.prototype.getPublicKey = function() {\n                return this.getKey().getPublicKey()\n            },\n            t.prototype.getPublicKeyB64 = function() {\n                return this.getKey().getPublicBaseKeyB64()\n            },\n            t.version = \"3.0.0-rc.1\",\n            t\n    }();\n// 1. 将上面这一坨匿名函数掐头去尾留中间，将其暴露出来, 这样才能使这个匿名函数暴露出来。\n// 2. 改写 将 rt 解密对象，赋值给 JSEncrypt\nJSEncrypt = rt\n\n// 自己写一个 func 来调用加密, 摘抄加密处如何使用的即可\nfunction test(text){\n    var p = new JSEncrypt; // 上面刚刚得到的JSEncrpyt 正好new 一个赋值给 p\n    // 经过测试 PublickKey 为固定值,摘抄即可\n    p.setPublicKey(\"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOJ3pYE2cYqdHAnQhd0akAQ6tKiepF6ZCXnYix8HyZJapWm5aeJRmXpWPaH2l+tZzgwOELJLu0BYk6eefWpd79Zm63+cSRdRqhgSv3/Anh4XVjBBewc26KUKMq5MWnEVCyjEDZSzUvCnDiVOl+Uid9tRRr1ZrBMKsXwSgjvge0NwIDAQAB\"),\n    password = p.encrypt(a); // 适当改写\n    return password\n};\n\ntest('密码')"
  },
  {
    "path": "【文书】app查询接口/main.py",
    "content": "# __author__ = \"zok\" 362416272@qq.com\n# Date: 2020/7/24 Python:3.7\n\nimport requests\nimport time\nimport random\nimport json\nimport base64\nimport pyDes\nfrom datetime import datetime\n\n\nclass TripleDesUtils:\n\n    def encryption(self, data: str, key, iv) -> str:\n        \"\"\"3des 加密\n        \"\"\"\n        _encryption_result = pyDes.triple_des(key, pyDes.CBC, iv, None, pyDes.PAD_PKCS5).encrypt(data)\n        _encryption_result = self._base64encode(_encryption_result).decode()\n        return _encryption_result\n\n    def decrypt(self, data: str, key, iv) -> str:\n        \"\"\"3des 解密\n        \"\"\"\n        data = self._base64decode(data)\n        _decrypt_result = pyDes.triple_des(key, pyDes.CBC, iv, None, pyDes.PAD_PKCS5).decrypt(data).decode('utf-8')\n        return _decrypt_result\n\n    @staticmethod\n    def _base64encode(data):\n        try:\n            _b64encode_result = base64.b64encode(data)\n        except Exception as e:\n            raise Exception(f\"base64 encode error:{e}\")\n        return _b64encode_result\n\n    @staticmethod\n    def _base64decode(data):\n        try:\n            _b64decode_result = base64.b64decode(data)\n        except Exception as e:\n            raise Exception(f\"base64 decode error:{e}\")\n        return _b64decode_result\n\n\nclass WenShu:\n\n    def __init__(self):\n        self.js = None\n\n    @staticmethod\n    def get_now_data():\n        \"\"\"时间\n        \"\"\"\n        return datetime.now().strftime('%Y%m%d')\n\n    @staticmethod\n    def random_key():\n        \"\"\"字符串\n        \"\"\"\n        random_str = ''\n        base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789'\n        length = len(base_str) - 1\n        for i in range(24):\n            random_str += base_str[random.randint(0, length)]\n        return random_str\n\n    @staticmethod\n    def make_id():\n        \"\"\"id\n        \"\"\"\n        return datetime.now().strftime('%Y%m%d%H%M%S')\n\n    def make_cipher_text(self):\n        \"\"\"生成 ciphertext\n        \"\"\"\n        time_13 = str(int(round(time.time() * 1000)))\n        key = self.random_key()\n        now = self.get_now_data()\n        _str = des3.encryption(time_13, key, now)\n        _str = key + now + _str\n        new_str = ''\n        for i in _str:\n            if i != 1:\n                new_str += \" \"\n            new_str += str(bin(ord(i))[2:])\n\n        msg = \"\"\"【key生成】: {key}\\n【now生成】: {now}\\n【_str生成】: {_str}\\n【ciphertext生成】: {ciphertext}\"\"\".format(key=key,\n                                                                                                          now=now,\n                                                                                                          _str=_str,\n                                                                                                          ciphertext=new_str)\n        print(msg)\n\n        return new_str.strip()\n\n    def make_request(self):\n        \"\"\"生成明文的请求 data 内容\n        【这里需要根据实际需求修改请求内容】自行抓包研究！！\n        \"\"\"\n        info = {\n            \"id\": self.make_id(),  # 年月日时分秒\n            \"command\": \"queryDoc\",  # 固定\n            \"params\": {\n                \"devid\": \"41d861ffe5b347d28454dc3f07dd4212\",  # 设备号\n                \"devtype\": \"1\",\n                \"ciphertext\": self.make_cipher_text(),\n                \"pageSize\": \"20\",\n                \"sortFields\": \"s50:desc\",  # 固定\n                \"pageNum\": \"1\",\n                \"queryCondition\": [{\n                    \"key\": \"s8\",\n                    \"value\": \"02\"\n                }]  # 关键词 + 搜索文本的类型；\n            }\n        }\n        return info\n\n    def to_index(self):\n        url = 'http://wenshuapp.court.gov.cn/appinterface/rest.q4w'\n        headers = {\n            'Content-Type': 'application/x-www-form-urlencoded',\n            'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; MIX 2 MIUI/V11.0.2.0.PDECNXM)',\n            'Host': 'wenshuapp.court.gov.cn',\n            'Connection': 'Keep-Alive',\n            'Accept-Encoding': 'gzip',\n        }\n        txt = str(self.make_request())\n\n        request = base64.b64encode(txt.encode('utf-8')).decode('utf-8')\n        data = {\n            'request': request\n        }\n        msg = \"\"\"【明文请求体】： {txt}\\n【密文请求体】： {data}\\n【官网速度较慢，耐心等待】....\"\"\".format(txt=txt, data=data)\n        print(msg)\n        response = requests.post(url, headers=headers, data=data)\n        if 'HTTP Status 503' in response.text:\n            print('【服务器繁忙】 爬的人太多了， 请重试')\n            exit()\n        data = json.loads(response.text)\n        content = data.get('data').get('content')\n        key = data.get('data').get('secretKey')\n        iv = self.get_now_data()\n        msg = \"\"\"【页面访问结果】： {text}\\n【捕获key】：{key}\\n【捕获iv】：{iv}\\n【捕获content】：{content}\"\"\".format(text=response.text,\n                                                                                               key=key, iv=iv,\n                                                                                               content=content)\n        print(msg)\n        self.parse_html(content, key, iv)\n\n    def parse_html(self, content, key, iv):\n        _str = des3.decrypt(content, key, iv)\n        print(\"【解密返回结果】：\", _str)\n\n\ndes3 = TripleDesUtils()\n\nif __name__ == '__main__':\n    \"\"\"\n    《入门级安卓逆向 - 文书网app爬虫》\n    https://www.zhangkunzhi.com/index.php/archives/162/\n    \"\"\"\n    ws = WenShu()\n    ws.to_index()\n"
  },
  {
    "path": "【淘宝】自动登陆/auto_login_pyppeteer.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-6  Python: 3.7\n\nimport time\nimport random\nimport asyncio\nimport pyppeteer\n\n\nclass LoginTaoBao:\n    \"\"\"\n    类异步\n    \"\"\"\n    pyppeteer.DEBUG = True\n    page = None\n\n    async def _injection_js(self):\n        \"\"\"注入js\n        \"\"\"\n        await self.page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'\n                                         '{ webdriver:{ get: () => false } }) }')  # 本页刷新后值不变\n\n    async def _init(self):\n        \"\"\"初始化浏览器\n        \"\"\"\n        browser = await pyppeteer.launch({'headless': False,\n                                          # 'userDataDir': './userdata',\n                                          'args': [\n                                              '--window-size={1300},{600}'\n                                              '--disable-extensions',\n                                              '--hide-scrollbars',\n                                              '--disable-bundled-ppapi-flash',\n                                              '--mute-audio',\n                                              '--no-sandbox',\n                                              '--disable-setuid-sandbox',\n                                              '--disable-gpu',\n                                              '--disable-infobars'\n                                          ],\n                                          'dumpio': True\n                                          })\n        self.page = await browser.newPage()\n        # 设置浏览器头部\n        await self.page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '\n                                     '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299')\n        # 设置浏览器大小\n        await self.page.setViewport({'width': 1200, 'height': 600})\n\n    async def get_cookie(self):\n        cookies_list = await self.page.cookies()\n        cookies = ''\n        for cookie in cookies_list:\n            str_cookie = '{0}={1};'\n            str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value'))\n            cookies += str_cookie\n        print(cookies)\n        return cookies\n\n    async def mouse_slider(self):\n        \"\"\"滑动滑块\n        \"\"\"\n        await asyncio.sleep(3)\n        try:\n            await self.page.hover('#nc_1_n1z')\n            # 鼠标按下按钮\n            await self.page.mouse.down()\n            # 移动鼠标\n            await self.page.mouse.move(2000, 0, {'steps': 30})\n            # 松开鼠标\n            await self.page.mouse.up()\n            await asyncio.sleep(2)\n        except Exception as e:\n            print(e, '      :错误')\n            return None\n        else:\n            await asyncio.sleep(3)\n            # 获取元素内容\n            slider_again = await self.page.querySelectorEval('#nc_1__scale_text', 'node => node.textContent')\n            if slider_again != '验证通过':\n                return None\n            else:\n                print('验证通过')\n                return True\n\n    async def main(self, username_, pwd_):\n        \"\"\"登陆\n        \"\"\"\n        # 初始化浏览器\n        await self._init()\n        # 注入js\n        await self._injection_js()\n        # 打开淘宝登陆页面\n        await self.page.goto('https://login.taobao.com')\n\n        # await self.page.goto('https://www.taobao.com')\n        # time.sleep(1000000)\n        # 点击密码登陆按钮\n        await self.page.click('div.login-switch')\n        time.sleep(random.random() * 2)\n        # 输入用户名\n        await self.page.type('#TPL_username_1', username_, {'delay': random.randint(100, 151) - 50})\n        # 输入密码\n        await self.page.type('#TPL_password_1', pwd_, {'delay': random.randint(100, 151)})\n        time.sleep(random.random() * 2)\n        # 获取滑块元素\n        slider = await self.page.Jeval('#nocaptcha', 'node => node.style')\n        if slider:\n            print('有滑块')\n            # 移动滑块\n            flag = await self.mouse_slider()\n            if not flag:\n                print('滑动滑块失败')\n                return None\n            time.sleep(random.random() + 1.5)\n            # 点击登陆\n            print('点击登陆')\n            await self.page.click('#J_SubmitStatic')\n            await asyncio.sleep(1000)\n\n        print('点击登陆')\n        await self.page.keyboard.press('Enter')\n\n        cookies = await self.get_cookie()\n        time.sleep(10000)\n\n\nif __name__ == '__main__':\n    username = input('请输入淘宝用户名')\n    password = input('密码')\n    login = LoginTaoBao()\n    loop = asyncio.get_event_loop()\n    task = asyncio.ensure_future(login.main(username, password))\n    loop.run_until_complete(task)\n"
  },
  {
    "path": "【淘宝】自动登陆/login_for_sina.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-11  Python: 3.7\n\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n\nclass TB_Spider:\n\n    def __init__(self, username, password):\n        \"\"\"初始化参数\"\"\"\n        url = 'https://login.taobao.com/member/login.jhtml'\n        self.url = url\n\n        options = webdriver.ChromeOptions()\n        # 不加载图片,加快访问速度\n        options.add_experimental_option(\"prefs\", {\"profile.managed_default_content_settings.images\": 2})\n        # 设置为开发者模式，避免被识别\n        options.add_experimental_option('excludeSwitches',\n                                        ['enable-automation'])\n        self.browser = webdriver.Chrome(executable_path='./chromedriver', options=options)\n        self.wait = WebDriverWait(self.browser, 40)\n        # 初始化用户名\n        self.username = username\n        # 初始化密码\n        self.password = password\n\n    def run(self):\n        \"\"\"登陆接口\"\"\"\n        self.browser.get(self.url)\n        try:\n            # 这里设置等待：等待输入框\n            login_element = self.wait.until(\n                EC.presence_of_element_located((By.CSS_SELECTOR, '.qrcode-login > .login-links > .forget-pwd')))\n            login_element.click()\n\n            sina_login = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.weibo-login')))\n            sina_login.click()\n\n            weibo_user = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.username > .W_input')))\n            weibo_user.send_keys(self.username)\n\n            sina_password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.password > .W_input')))\n            sina_password.send_keys(self.password)\n\n            submit = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.btn_tip > a > span')))\n            submit.click()\n\n            taobao_name = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,\n                                                                          '.site-nav-bd > ul.site-nav-bd-l > li#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-user > a.site-nav-login-info-nick ')))\n            # 登陆成功打印提示信息\n            print(\"登陆成功：%s\" % taobao_name.text)\n        except Exception:\n            self.browser.close()\n            print(\"登陆失败\")\n\n\nif __name__ == \"__main__\":\n    name = input(\"请输入你的微博用户名:\")\n    pas = input(\"请输入密码:\")\n    spider = TB_Spider(name, pas)\n    spider.run()\n"
  },
  {
    "path": "其他实战/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-11  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【5173网】自动登录/auto_login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-26  Python: 3.7\n\nimport re\nimport requests\nimport execjs.runtime_names\n\n\nclass YX(object):\n    \"\"\"\n    易通贷自动登陆\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.session = requests.session()\n        self.url = 'https://passport.5173.com/'\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',\n            'Host': 'passport.5173.com',\n        }\n        print('引擎', execjs.get().name)\n\n    def make_pwd(self, key):\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            ctx = execjs.compile(f.read())\n        return ctx.call(\"make_js\", self.pwd, key)\n\n    def make_data(self, token, key):\n        data = {\n            'userName': self.user,\n            'password': self.make_pwd(key),\n            'mobileNo': '',\n            'captcha': '',\n            'smsCaptcha': '',\n            'category': '',\n            'passpod': '',\n            'smsLogin': '0',\n            '__validationToken__': token,\n            '__validationDna__': '',\n        }\n        return data\n\n    def login(self):\n        \"\"\"start\n        \"\"\"\n        response = self.session.get(self.url)\n        info = re.search(r'SecurityToken:\"(.*?)\",[\\s\\S]*?PasswordKey:\"(.*?)\",', response.text)\n        try:\n            token = info.group(1)\n            key = info.group(2)\n            data = self.make_data(token, key)\n            result = self.session.post(self.url, data=data, headers=self.headers)\n            if '5173auth' in str(result.cookies):\n                print(result.cookies)\n                print('【登陆成功】')\n            else:\n                print('【登陆失败】')\n        except AttributeError:\n            print('【获取key失败】')\n\n\nif __name__ == '__main__':\n    username = input('请输入账号')\n    password = input('密码')\n    yx = YX(username, password)\n    yx.login()\n\n\n\n"
  },
  {
    "path": "其他实战/【5173网】自动登录/encryp.js",
    "content": "var hexcase = 0, b64pad = \"\", chrsz = 8;\n\nfunction hex_md5(b) {\n    return binl2hex(core_md5(str2binl(b), b.length * chrsz))\n}\n\nfunction b64_md5(b) {\n    return binl2b64(core_md5(str2binl(b), b.length * chrsz))\n}\n\nfunction str_md5(b) {\n    return binl2str(core_md5(str2binl(b), b.length * chrsz))\n}\n\nfunction hex_hmac_md5(b, a) {\n    return binl2hex(core_hmac_md5(b, a))\n}\n\nfunction b64_hmac_md5(b, a) {\n    return binl2b64(core_hmac_md5(b, a))\n}\n\nfunction str_hmac_md5(b, a) {\n    return binl2str(core_hmac_md5(b, a))\n}\n\nfunction md5_vm_test() {\n    return hex_md5(\"abc\") == \"900150983cd24fb0d6963f7d28e17f72\"\n}\n\nfunction core_md5(b, a) {\n    b[a >> 5] |= 128 << a % 32;\n    b[(a + 64 >>> 9 << 4) + 14] = a;\n    a = 1732584193;\n    for (var c = -271733879, d = -1732584194, e = 271733878, f = 0; f < b.length; f += 16) {\n        var g = a, h = c, i = d, j = e;\n        a = md5_ff(a, c, d, e, b[f + 0], 7, -680876936);\n        e = md5_ff(e, a, c, d, b[f + 1], 12, -389564586);\n        d = md5_ff(d, e, a, c, b[f + 2], 17, 606105819);\n        c = md5_ff(c, d, e, a, b[f + 3], 22, -1044525330);\n        a = md5_ff(a, c, d, e, b[f + 4], 7, -176418897);\n        e = md5_ff(e, a, c, d, b[f + 5], 12, 1200080426);\n        d = md5_ff(d, e, a, c, b[f + 6], 17, -1473231341);\n        c = md5_ff(c, d, e, a, b[f + 7], 22, -45705983);\n        a = md5_ff(a, c, d, e, b[f + 8], 7,\n            1770035416);\n        e = md5_ff(e, a, c, d, b[f + 9], 12, -1958414417);\n        d = md5_ff(d, e, a, c, b[f + 10], 17, -42063);\n        c = md5_ff(c, d, e, a, b[f + 11], 22, -1990404162);\n        a = md5_ff(a, c, d, e, b[f + 12], 7, 1804603682);\n        e = md5_ff(e, a, c, d, b[f + 13], 12, -40341101);\n        d = md5_ff(d, e, a, c, b[f + 14], 17, -1502002290);\n        c = md5_ff(c, d, e, a, b[f + 15], 22, 1236535329);\n        a = md5_gg(a, c, d, e, b[f + 1], 5, -165796510);\n        e = md5_gg(e, a, c, d, b[f + 6], 9, -1069501632);\n        d = md5_gg(d, e, a, c, b[f + 11], 14, 643717713);\n        c = md5_gg(c, d, e, a, b[f + 0], 20, -373897302);\n        a = md5_gg(a, c, d, e, b[f + 5], 5, -701558691);\n        e = md5_gg(e, a, c, d, b[f +\n        10], 9, 38016083);\n        d = md5_gg(d, e, a, c, b[f + 15], 14, -660478335);\n        c = md5_gg(c, d, e, a, b[f + 4], 20, -405537848);\n        a = md5_gg(a, c, d, e, b[f + 9], 5, 568446438);\n        e = md5_gg(e, a, c, d, b[f + 14], 9, -1019803690);\n        d = md5_gg(d, e, a, c, b[f + 3], 14, -187363961);\n        c = md5_gg(c, d, e, a, b[f + 8], 20, 1163531501);\n        a = md5_gg(a, c, d, e, b[f + 13], 5, -1444681467);\n        e = md5_gg(e, a, c, d, b[f + 2], 9, -51403784);\n        d = md5_gg(d, e, a, c, b[f + 7], 14, 1735328473);\n        c = md5_gg(c, d, e, a, b[f + 12], 20, -1926607734);\n        a = md5_hh(a, c, d, e, b[f + 5], 4, -378558);\n        e = md5_hh(e, a, c, d, b[f + 8], 11, -2022574463);\n        d = md5_hh(d, e, a, c, b[f +\n        11], 16, 1839030562);\n        c = md5_hh(c, d, e, a, b[f + 14], 23, -35309556);\n        a = md5_hh(a, c, d, e, b[f + 1], 4, -1530992060);\n        e = md5_hh(e, a, c, d, b[f + 4], 11, 1272893353);\n        d = md5_hh(d, e, a, c, b[f + 7], 16, -155497632);\n        c = md5_hh(c, d, e, a, b[f + 10], 23, -1094730640);\n        a = md5_hh(a, c, d, e, b[f + 13], 4, 681279174);\n        e = md5_hh(e, a, c, d, b[f + 0], 11, -358537222);\n        d = md5_hh(d, e, a, c, b[f + 3], 16, -722521979);\n        c = md5_hh(c, d, e, a, b[f + 6], 23, 76029189);\n        a = md5_hh(a, c, d, e, b[f + 9], 4, -640364487);\n        e = md5_hh(e, a, c, d, b[f + 12], 11, -421815835);\n        d = md5_hh(d, e, a, c, b[f + 15], 16, 530742520);\n        c = md5_hh(c, d, e,\n            a, b[f + 2], 23, -995338651);\n        a = md5_ii(a, c, d, e, b[f + 0], 6, -198630844);\n        e = md5_ii(e, a, c, d, b[f + 7], 10, 1126891415);\n        d = md5_ii(d, e, a, c, b[f + 14], 15, -1416354905);\n        c = md5_ii(c, d, e, a, b[f + 5], 21, -57434055);\n        a = md5_ii(a, c, d, e, b[f + 12], 6, 1700485571);\n        e = md5_ii(e, a, c, d, b[f + 3], 10, -1894986606);\n        d = md5_ii(d, e, a, c, b[f + 10], 15, -1051523);\n        c = md5_ii(c, d, e, a, b[f + 1], 21, -2054922799);\n        a = md5_ii(a, c, d, e, b[f + 8], 6, 1873313359);\n        e = md5_ii(e, a, c, d, b[f + 15], 10, -30611744);\n        d = md5_ii(d, e, a, c, b[f + 6], 15, -1560198380);\n        c = md5_ii(c, d, e, a, b[f + 13], 21, 1309151649);\n        a = md5_ii(a,\n            c, d, e, b[f + 4], 6, -145523070);\n        e = md5_ii(e, a, c, d, b[f + 11], 10, -1120210379);\n        d = md5_ii(d, e, a, c, b[f + 2], 15, 718787259);\n        c = md5_ii(c, d, e, a, b[f + 9], 21, -343485551);\n        a = safe_add(a, g);\n        c = safe_add(c, h);\n        d = safe_add(d, i);\n        e = safe_add(e, j)\n    }\n    return Array(a, c, d, e)\n}\n\nfunction md5_cmn(b, a, c, d, e, f) {\n    return safe_add(bit_rol(safe_add(safe_add(a, b), safe_add(d, f)), e), c)\n}\n\nfunction md5_ff(b, a, c, d, e, f, g) {\n    return md5_cmn(a & c | ~a & d, b, a, e, f, g)\n}\n\nfunction md5_gg(b, a, c, d, e, f, g) {\n    return md5_cmn(a & d | c & ~d, b, a, e, f, g)\n}\n\nfunction md5_hh(b, a, c, d, e, f, g) {\n    return md5_cmn(a ^ c ^ d, b, a, e, f, g)\n}\n\nfunction md5_ii(b, a, c, d, e, f, g) {\n    return md5_cmn(c ^ (a | ~d), b, a, e, f, g)\n}\n\nfunction core_hmac_md5(b, a) {\n    var c = str2binl(b);\n    if (c.length > 16) c = core_md5(c, b.length * chrsz);\n    var d = Array(16);\n    b = Array(16);\n    for (var e = 0; e < 16; e++) {\n        d[e] = c[e] ^ 909522486;\n        b[e] = c[e] ^ 1549556828\n    }\n    a = core_md5(d.concat(str2binl(a)), 512 + a.length * chrsz);\n    return core_md5(b.concat(a), 640)\n}\n\nfunction safe_add(b, a) {\n    var c = (b & 65535) + (a & 65535);\n    return (b >> 16) + (a >> 16) + (c >> 16) << 16 | c & 65535\n}\n\nfunction bit_rol(b, a) {\n    return b << a | b >>> 32 - a\n}\n\nfunction str2binl(b) {\n    for (var a = Array(), c = (1 << chrsz) - 1, d = 0; d < b.length * chrsz; d += chrsz) a[d >> 5] |= (b.charCodeAt(d / chrsz) & c) << d % 32;\n    return a\n}\n\nfunction binl2str(b) {\n    for (var a = \"\", c = (1 << chrsz) - 1, d = 0; d < b.length * 32; d += chrsz) a += String.fromCharCode(b[d >> 5] >>> d % 32 & c);\n    return a\n}\n\nfunction binl2hex(b) {\n    for (var a = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\", c = \"\", d = 0; d < b.length * 4; d++) c += a.charAt(b[d >> 2] >> d % 4 * 8 + 4 & 15) + a.charAt(b[d >> 2] >> d % 4 * 8 & 15);\n    return c\n}\n\nfunction binl2b64(b) {\n    for (var a = \"\", c = 0; c < b.length * 4; c += 3) for (var d = (b[c >> 2] >> 8 * (c % 4) & 255) << 16 | (b[c + 1 >> 2] >> 8 * ((c + 1) % 4) & 255) << 8 | b[c + 2 >> 2] >> 8 * ((c + 2) % 4) & 255, e = 0; e < 4; e++) a += c * 8 + e * 6 > b.length * 32 ? b64pad : \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(d >> 6 * (3 - e) & 63);\n    return a\n}\n\nfunction make_js(pwd, a) {\n    return hex_md5(hex_md5(pwd).substr(8, 16) + a)\n};"
  },
  {
    "path": "其他实战/【9377网】自动登录/9377login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-23  Python: 3.7\n\nimport requests\n\n\nclass Login9377:\n    \"\"\"9377游戏平台自动登陆\n    \"\"\"\n\n    def __init__(self, username, password):\n        self.headers = {\n            'Upgrade-Insecure-Requests': '1',\n            'Host': 'wvw.9377.com',\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'\n        }\n        if len(password) < 6 or len(username) < 6:\n            print('请输入正确账号密码!')\n            exit()\n        self.username = username\n        self.password = password\n        self.login_url = 'http://wvw.9377.com/login.php'\n        self.host = 'https://www.9377.com/'\n        self.session = requests.session()\n\n    def login(self):\n        \"\"\"登陆\n        \"\"\"\n        data = {\n            'do': 'login',\n            'gourl': self.host,\n            'login_save': '1',\n            'username': self.username,\n            'password': self.password\n        }\n        self.session.get(self.login_url, headers=self.headers)\n        result = self.session.post(self.login_url, headers=self.headers, data=data)\n        self.check(result)\n\n    def check(self, result):\n        \"\"\"检测登陆状态\n        \"\"\"\n        if self.username in str(result.cookies):\n            print('登陆成功')\n        else:\n            print('用户名或密码错误')\n\n\nif __name__ == '__main__':\n    name = input('输入账号')\n    word = input('输入密码')\n    lg = Login9377(name, word)\n    lg.login()\n"
  },
  {
    "path": "其他实战/【9377网】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-24  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【DNS】自动登录/Login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-08  Python: 3.7\nimport requests\nimport re\nimport execjs.runtime_names\n\n\nclass DNS:\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.js = None\n        self.url = 'https://www.dns.com/login.html'\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',\n            'Host': 'www.dns.com'\n        }\n        self.read_js()\n\n    def get_token(self):\n        response = requests.get(self.url, headers=self.headers)\n        try:\n            token = re.search(r'<input type=\"hidden\" name=\"_token\" value=\"(.*?)\">', response.text).group(1)\n            print(token)\n        except AttributeError:\n            print('token 捕获失败')\n\n    def read_js(self):\n        with open(\"dns.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def login(self):\n        data = {\n            '_token': self.get_token(),\n            'password': self.js.call('aes', self.pwd),\n            'email': self.js.call('aes', self.user),\n            'redirectTo': 'https://www.dns.com/dashboard',\n        }\n        response = requests.post(self.url, data=data, headers=self.headers)\n        print(response)\n\n\nif __name__ == '__main__':\n    username = input('请输入账号')\n    password = input('密码')\n    dns = DNS(username, password)\n    dns.login()\n"
  },
  {
    "path": "其他实战/【DNS】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【DNS】自动登录/dns.js",
    "content": "\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t    /*\n\t     * Local polyfil of Object.create\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {};\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }())\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var i = 0; i < thatSigBytes; i += 4) {\n\t                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            var r = (function (m_w) {\n\t                var m_w = m_w;\n\t                var m_z = 0x3ade68b1;\n\t                var mask = 0xffffffff;\n\n\t                return function () {\n\t                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t                    var result = ((m_z << 0x10) + m_w) & mask;\n\t                    result /= 0x100000000;\n\t                    result += 0.5;\n\t                    return result * (Math.random() > .5 ? 1 : -1);\n\t                }\n\t            });\n\n\t            for (var i = 0, rcache; i < nBytes; i += 4) {\n\t                var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t                rcache = _r() * 0x3ade67b7;\n\t                words.push((_r() * 0x100000000) | 0);\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                var processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * Base64 encoding strategy.\n\t     */\n\t    var Base64 = C_enc.Base64 = {\n\t        /**\n\t         * Converts a word array to a Base64 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Base64 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\t            var map = this._map;\n\n\t            // Clamp excess bits\n\t            wordArray.clamp();\n\n\t            // Convert\n\t            var base64Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 3) {\n\t                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n\t                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n\t                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n\t                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n\t                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n\t                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n\t                }\n\t            }\n\n\t            // Add padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                while (base64Chars.length % 4) {\n\t                    base64Chars.push(paddingChar);\n\t                }\n\t            }\n\n\t            return base64Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Base64 string to a word array.\n\t         *\n\t         * @param {string} base64Str The Base64 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n\t         */\n\t        parse: function (base64Str) {\n\t            // Shortcuts\n\t            var base64StrLength = base64Str.length;\n\t            var map = this._map;\n\t            var reverseMap = this._reverseMap;\n\n\t            if (!reverseMap) {\n\t                    reverseMap = this._reverseMap = [];\n\t                    for (var j = 0; j < map.length; j++) {\n\t                        reverseMap[map.charCodeAt(j)] = j;\n\t                    }\n\t            }\n\n\t            // Ignore padding\n\t            var paddingChar = map.charAt(64);\n\t            if (paddingChar) {\n\t                var paddingIndex = base64Str.indexOf(paddingChar);\n\t                if (paddingIndex !== -1) {\n\t                    base64StrLength = paddingIndex;\n\t                }\n\t            }\n\n\t            // Convert\n\t            return parseLoop(base64Str, base64StrLength, reverseMap);\n\n\t        },\n\n\t        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n\t    };\n\n\t    function parseLoop(base64Str, base64StrLength, reverseMap) {\n\t      var words = [];\n\t      var nBytes = 0;\n\t      for (var i = 0; i < base64StrLength; i++) {\n\t          if (i % 4) {\n\t              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n\t              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n\t              words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);\n\t              nBytes++;\n\t          }\n\t      }\n\t      return WordArray.create(words, nBytes);\n\t    }\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var T = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        for (var i = 0; i < 64; i++) {\n\t            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n\t        }\n\t    }());\n\n\t    /**\n\t     * MD5 hash algorithm.\n\t     */\n\t    var MD5 = C_algo.MD5 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var M_offset_0  = M[offset + 0];\n\t            var M_offset_1  = M[offset + 1];\n\t            var M_offset_2  = M[offset + 2];\n\t            var M_offset_3  = M[offset + 3];\n\t            var M_offset_4  = M[offset + 4];\n\t            var M_offset_5  = M[offset + 5];\n\t            var M_offset_6  = M[offset + 6];\n\t            var M_offset_7  = M[offset + 7];\n\t            var M_offset_8  = M[offset + 8];\n\t            var M_offset_9  = M[offset + 9];\n\t            var M_offset_10 = M[offset + 10];\n\t            var M_offset_11 = M[offset + 11];\n\t            var M_offset_12 = M[offset + 12];\n\t            var M_offset_13 = M[offset + 13];\n\t            var M_offset_14 = M[offset + 14];\n\t            var M_offset_15 = M[offset + 15];\n\n\t            // Working varialbes\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\n\t            // Computation\n\t            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);\n\t            d = FF(d, a, b, c, M_offset_1,  12, T[1]);\n\t            c = FF(c, d, a, b, M_offset_2,  17, T[2]);\n\t            b = FF(b, c, d, a, M_offset_3,  22, T[3]);\n\t            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);\n\t            d = FF(d, a, b, c, M_offset_5,  12, T[5]);\n\t            c = FF(c, d, a, b, M_offset_6,  17, T[6]);\n\t            b = FF(b, c, d, a, M_offset_7,  22, T[7]);\n\t            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);\n\t            d = FF(d, a, b, c, M_offset_9,  12, T[9]);\n\t            c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n\t            b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n\t            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);\n\t            d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n\t            c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n\t            b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n\t            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);\n\t            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);\n\t            c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n\t            b = GG(b, c, d, a, M_offset_0,  20, T[19]);\n\t            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);\n\t            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);\n\t            c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n\t            b = GG(b, c, d, a, M_offset_4,  20, T[23]);\n\t            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);\n\t            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);\n\t            c = GG(c, d, a, b, M_offset_3,  14, T[26]);\n\t            b = GG(b, c, d, a, M_offset_8,  20, T[27]);\n\t            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);\n\t            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);\n\t            c = GG(c, d, a, b, M_offset_7,  14, T[30]);\n\t            b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n\t            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);\n\t            d = HH(d, a, b, c, M_offset_8,  11, T[33]);\n\t            c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n\t            b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n\t            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);\n\t            d = HH(d, a, b, c, M_offset_4,  11, T[37]);\n\t            c = HH(c, d, a, b, M_offset_7,  16, T[38]);\n\t            b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n\t            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);\n\t            d = HH(d, a, b, c, M_offset_0,  11, T[41]);\n\t            c = HH(c, d, a, b, M_offset_3,  16, T[42]);\n\t            b = HH(b, c, d, a, M_offset_6,  23, T[43]);\n\t            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);\n\t            d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n\t            c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n\t            b = HH(b, c, d, a, M_offset_2,  23, T[47]);\n\n\t            a = II(a, b, c, d, M_offset_0,  6,  T[48]);\n\t            d = II(d, a, b, c, M_offset_7,  10, T[49]);\n\t            c = II(c, d, a, b, M_offset_14, 15, T[50]);\n\t            b = II(b, c, d, a, M_offset_5,  21, T[51]);\n\t            a = II(a, b, c, d, M_offset_12, 6,  T[52]);\n\t            d = II(d, a, b, c, M_offset_3,  10, T[53]);\n\t            c = II(c, d, a, b, M_offset_10, 15, T[54]);\n\t            b = II(b, c, d, a, M_offset_1,  21, T[55]);\n\t            a = II(a, b, c, d, M_offset_8,  6,  T[56]);\n\t            d = II(d, a, b, c, M_offset_15, 10, T[57]);\n\t            c = II(c, d, a, b, M_offset_6,  15, T[58]);\n\t            b = II(b, c, d, a, M_offset_13, 21, T[59]);\n\t            a = II(a, b, c, d, M_offset_4,  6,  T[60]);\n\t            d = II(d, a, b, c, M_offset_11, 10, T[61]);\n\t            c = II(c, d, a, b, M_offset_2,  15, T[62]);\n\t            b = II(b, c, d, a, M_offset_9,  21, T[63]);\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n\t            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n\t            var nBitsTotalL = nBitsTotal;\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n\t                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)\n\t            );\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)\n\t            );\n\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    function FF(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & c) | (~b & d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function GG(a, b, c, d, x, s, t) {\n\t        var n = a + ((b & d) | (c & ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function HH(a, b, c, d, x, s, t) {\n\t        var n = a + (b ^ c ^ d) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    function II(a, b, c, d, x, s, t) {\n\t        var n = a + (c ^ (b | ~d)) + x + t;\n\t        return ((n << s) | (n >>> (32 - s))) + b;\n\t    }\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.MD5('message');\n\t     *     var hash = CryptoJS.MD5(wordArray);\n\t     */\n\t    C.MD5 = Hasher._createHelper(MD5);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacMD5(message, key);\n\t     */\n\t    C.HmacMD5 = Hasher._createHmacHelper(MD5);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-1 hash algorithm.\n\t     */\n\t    var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476,\n\t                0xc3d2e1f0\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\n\t            // Computation\n\t            for (var i = 0; i < 80; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t                    W[i] = (n << 1) | (n >>> 31);\n\t                }\n\n\t                var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t                if (i < 20) {\n\t                    t += ((b & c) | (~b & d)) + 0x5a827999;\n\t                } else if (i < 40) {\n\t                    t += (b ^ c ^ d) + 0x6ed9eba1;\n\t                } else if (i < 60) {\n\t                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t                } else /* if (i < 80) */ {\n\t                    t += (b ^ c ^ d) - 0x359d3e2a;\n\t                }\n\n\t                e = d;\n\t                d = c;\n\t                c = (b << 30) | (b >>> 2);\n\t                b = a;\n\t                a = t;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA1('message');\n\t     *     var hash = CryptoJS.SHA1(wordArray);\n\t     */\n\t    C.SHA1 = Hasher._createHelper(SHA1);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA1(message, key);\n\t     */\n\t    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_enc = C.enc;\n\n\t    /**\n\t     * UTF-16 BE encoding strategy.\n\t     */\n\t    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 BE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 BE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 BE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 BE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-16 LE encoding strategy.\n\t     */\n\t    C_enc.Utf16LE = {\n\t        /**\n\t         * Converts a word array to a UTF-16 LE string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-16 LE string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var utf16Chars = [];\n\t            for (var i = 0; i < sigBytes; i += 2) {\n\t                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n\t                utf16Chars.push(String.fromCharCode(codePoint));\n\t            }\n\n\t            return utf16Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a UTF-16 LE string to a word array.\n\t         *\n\t         * @param {string} utf16Str The UTF-16 LE string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n\t         */\n\t        parse: function (utf16Str) {\n\t            // Shortcut\n\t            var utf16StrLength = utf16Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < utf16StrLength; i++) {\n\t                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n\t            }\n\n\t            return WordArray.create(words, utf16StrLength * 2);\n\t        }\n\t    };\n\n\t    function swapEndian(word) {\n\t        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n\t    }\n\t}());\n\n\n\t(function () {\n\t    // Check if typed arrays are supported\n\t    if (typeof ArrayBuffer != 'function') {\n\t        return;\n\t    }\n\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\n\t    // Reference original init\n\t    var superInit = WordArray.init;\n\n\t    // Augment WordArray.init to handle typed arrays\n\t    var subInit = WordArray.init = function (typedArray) {\n\t        // Convert buffers to uint8\n\t        if (typedArray instanceof ArrayBuffer) {\n\t            typedArray = new Uint8Array(typedArray);\n\t        }\n\n\t        // Convert other array views to uint8\n\t        if (\n\t            typedArray instanceof Int8Array ||\n\t            (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n\t            typedArray instanceof Int16Array ||\n\t            typedArray instanceof Uint16Array ||\n\t            typedArray instanceof Int32Array ||\n\t            typedArray instanceof Uint32Array ||\n\t            typedArray instanceof Float32Array ||\n\t            typedArray instanceof Float64Array\n\t        ) {\n\t            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n\t        }\n\n\t        // Handle Uint8Array\n\t        if (typedArray instanceof Uint8Array) {\n\t            // Shortcut\n\t            var typedArrayByteLength = typedArray.byteLength;\n\n\t            // Extract bytes\n\t            var words = [];\n\t            for (var i = 0; i < typedArrayByteLength; i++) {\n\t                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n\t            }\n\n\t            // Initialize this word array\n\t            superInit.call(this, words, typedArrayByteLength);\n\t        } else {\n\t            // Else call normal init\n\t            superInit.apply(this, arguments);\n\t        }\n\t    };\n\n\t    subInit.prototype = WordArray;\n\t}());\n\n\n\t/** @preserve\n\t(c) 2012 by Cédric Mesnil. All rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n\t    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\t    - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Constants table\n\t    var _zl = WordArray.create([\n\t        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n\t        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,\n\t        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,\n\t        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,\n\t        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);\n\t    var _zr = WordArray.create([\n\t        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,\n\t        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,\n\t        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,\n\t        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,\n\t        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);\n\t    var _sl = WordArray.create([\n\t         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,\n\t        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,\n\t        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,\n\t          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,\n\t        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);\n\t    var _sr = WordArray.create([\n\t        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,\n\t        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,\n\t        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,\n\t        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,\n\t        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);\n\n\t    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n\t    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n\t    /**\n\t     * RIPEMD160 hash algorithm.\n\t     */\n\t    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\n\t            // Swap endian\n\t            for (var i = 0; i < 16; i++) {\n\t                // Shortcuts\n\t                var offset_i = offset + i;\n\t                var M_offset_i = M[offset_i];\n\n\t                // Swap\n\t                M[offset_i] = (\n\t                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n\t                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n\t                );\n\t            }\n\t            // Shortcut\n\t            var H  = this._hash.words;\n\t            var hl = _hl.words;\n\t            var hr = _hr.words;\n\t            var zl = _zl.words;\n\t            var zr = _zr.words;\n\t            var sl = _sl.words;\n\t            var sr = _sr.words;\n\n\t            // Working variables\n\t            var al, bl, cl, dl, el;\n\t            var ar, br, cr, dr, er;\n\n\t            ar = al = H[0];\n\t            br = bl = H[1];\n\t            cr = cl = H[2];\n\t            dr = dl = H[3];\n\t            er = el = H[4];\n\t            // Computation\n\t            var t;\n\t            for (var i = 0; i < 80; i += 1) {\n\t                t = (al +  M[offset+zl[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f1(bl,cl,dl) + hl[0];\n\t                } else if (i<32) {\n\t\t            t +=  f2(bl,cl,dl) + hl[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(bl,cl,dl) + hl[2];\n\t                } else if (i<64) {\n\t\t            t +=  f4(bl,cl,dl) + hl[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f5(bl,cl,dl) + hl[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sl[i]);\n\t                t = (t+el)|0;\n\t                al = el;\n\t                el = dl;\n\t                dl = rotl(cl, 10);\n\t                cl = bl;\n\t                bl = t;\n\n\t                t = (ar + M[offset+zr[i]])|0;\n\t                if (i<16){\n\t\t            t +=  f5(br,cr,dr) + hr[0];\n\t                } else if (i<32) {\n\t\t            t +=  f4(br,cr,dr) + hr[1];\n\t                } else if (i<48) {\n\t\t            t +=  f3(br,cr,dr) + hr[2];\n\t                } else if (i<64) {\n\t\t            t +=  f2(br,cr,dr) + hr[3];\n\t                } else {// if (i<80) {\n\t\t            t +=  f1(br,cr,dr) + hr[4];\n\t                }\n\t                t = t|0;\n\t                t =  rotl(t,sr[i]) ;\n\t                t = (t+er)|0;\n\t                ar = er;\n\t                er = dr;\n\t                dr = rotl(cr, 10);\n\t                cr = br;\n\t                br = t;\n\t            }\n\t            // Intermediate hash value\n\t            t    = (H[1] + cl + dr)|0;\n\t            H[1] = (H[2] + dl + er)|0;\n\t            H[2] = (H[3] + el + ar)|0;\n\t            H[3] = (H[4] + al + br)|0;\n\t            H[4] = (H[0] + bl + cr)|0;\n\t            H[0] =  t;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n\t                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n\t                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)\n\t            );\n\t            data.sigBytes = (dataWords.length + 1) * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var hash = this._hash;\n\t            var H = hash.words;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 5; i++) {\n\t                // Shortcut\n\t                var H_i = H[i];\n\n\t                // Swap\n\t                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n\t                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\n\t    function f1(x, y, z) {\n\t        return ((x) ^ (y) ^ (z));\n\n\t    }\n\n\t    function f2(x, y, z) {\n\t        return (((x)&(y)) | ((~x)&(z)));\n\t    }\n\n\t    function f3(x, y, z) {\n\t        return (((x) | (~(y))) ^ (z));\n\t    }\n\n\t    function f4(x, y, z) {\n\t        return (((x) & (z)) | ((y)&(~(z))));\n\t    }\n\n\t    function f5(x, y, z) {\n\t        return ((x) ^ ((y) |(~(z))));\n\n\t    }\n\n\t    function rotl(x,n) {\n\t        return (x<<n) | (x>>>(32-n));\n\t    }\n\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.RIPEMD160('message');\n\t     *     var hash = CryptoJS.RIPEMD160(wordArray);\n\t     */\n\t    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);\n\t     */\n\t    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * HMAC algorithm.\n\t     */\n\t    var HMAC = C_algo.HMAC = Base.extend({\n\t        /**\n\t         * Initializes a newly created HMAC.\n\t         *\n\t         * @param {Hasher} hasher The hash algorithm to use.\n\t         * @param {WordArray|string} key The secret key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t         */\n\t        init: function (hasher, key) {\n\t            // Init hasher\n\t            hasher = this._hasher = new hasher.init();\n\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof key == 'string') {\n\t                key = Utf8.parse(key);\n\t            }\n\n\t            // Shortcuts\n\t            var hasherBlockSize = hasher.blockSize;\n\t            var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t            // Allow arbitrary length keys\n\t            if (key.sigBytes > hasherBlockSizeBytes) {\n\t                key = hasher.finalize(key);\n\t            }\n\n\t            // Clamp excess bits\n\t            key.clamp();\n\n\t            // Clone key for inner and outer pads\n\t            var oKey = this._oKey = key.clone();\n\t            var iKey = this._iKey = key.clone();\n\n\t            // Shortcuts\n\t            var oKeyWords = oKey.words;\n\t            var iKeyWords = iKey.words;\n\n\t            // XOR keys with pad constants\n\t            for (var i = 0; i < hasherBlockSize; i++) {\n\t                oKeyWords[i] ^= 0x5c5c5c5c;\n\t                iKeyWords[i] ^= 0x36363636;\n\t            }\n\t            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this HMAC to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Reset\n\t            hasher.reset();\n\t            hasher.update(this._iKey);\n\t        },\n\n\t        /**\n\t         * Updates this HMAC with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {HMAC} This HMAC instance.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.update('message');\n\t         *     hmacHasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            this._hasher.update(messageUpdate);\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the HMAC computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The HMAC.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmac = hmacHasher.finalize();\n\t         *     var hmac = hmacHasher.finalize('message');\n\t         *     var hmac = hmacHasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Compute HMAC\n\t            var innerHash = hasher.finalize(messageUpdate);\n\t            hasher.reset();\n\t            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t            return hmac;\n\t        }\n\t    });\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA1 = C_algo.SHA1;\n\t    var HMAC = C_algo.HMAC;\n\n\t    /**\n\t     * Password-Based Key Derivation Function 2 algorithm.\n\t     */\n\t    var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hasher to use. Default: SHA1\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: SHA1,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create();\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Computes the Password-Based Key Derivation Function 2.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init HMAC\n\t            var hmac = HMAC.create(cfg.hasher, password);\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\t            var blockIndex = WordArray.create([0x00000001]);\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var blockIndexWords = blockIndex.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                var block = hmac.update(salt).finalize(blockIndex);\n\t                hmac.reset();\n\n\t                // Shortcuts\n\t                var blockWords = block.words;\n\t                var blockWordsLength = blockWords.length;\n\n\t                // Iterations\n\t                var intermediate = block;\n\t                for (var i = 1; i < iterations; i++) {\n\t                    intermediate = hmac.finalize(intermediate);\n\t                    hmac.reset();\n\n\t                    // Shortcut\n\t                    var intermediateWords = intermediate.words;\n\n\t                    // XOR intermediate with block\n\t                    for (var j = 0; j < blockWordsLength; j++) {\n\t                        blockWords[j] ^= intermediateWords[j];\n\t                    }\n\t                }\n\n\t                derivedKey.concat(block);\n\t                blockIndexWords[0]++;\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Computes the Password-Based Key Derivation Function 2.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.PBKDF2(password, salt);\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.PBKDF2 = function (password, salt, cfg) {\n\t        return PBKDF2.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var MD5 = C_algo.MD5;\n\n\t    /**\n\t     * This key derivation function is meant to conform with EVP_BytesToKey.\n\t     * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n\t     */\n\t    var EvpKDF = C_algo.EvpKDF = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n\t         * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n\t         * @property {number} iterations The number of iterations to perform. Default: 1\n\t         */\n\t        cfg: Base.extend({\n\t            keySize: 128/32,\n\t            hasher: MD5,\n\t            iterations: 1\n\t        }),\n\n\t        /**\n\t         * Initializes a newly created key derivation function.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create();\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n\t         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n\t         */\n\t        init: function (cfg) {\n\t            this.cfg = this.cfg.extend(cfg);\n\t        },\n\n\t        /**\n\t         * Derives a key from a password.\n\t         *\n\t         * @param {WordArray|string} password The password.\n\t         * @param {WordArray|string} salt A salt.\n\t         *\n\t         * @return {WordArray} The derived key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var key = kdf.compute(password, salt);\n\t         */\n\t        compute: function (password, salt) {\n\t            // Shortcut\n\t            var cfg = this.cfg;\n\n\t            // Init hasher\n\t            var hasher = cfg.hasher.create();\n\n\t            // Initial values\n\t            var derivedKey = WordArray.create();\n\n\t            // Shortcuts\n\t            var derivedKeyWords = derivedKey.words;\n\t            var keySize = cfg.keySize;\n\t            var iterations = cfg.iterations;\n\n\t            // Generate key\n\t            while (derivedKeyWords.length < keySize) {\n\t                if (block) {\n\t                    hasher.update(block);\n\t                }\n\t                var block = hasher.update(password).finalize(salt);\n\t                hasher.reset();\n\n\t                // Iterations\n\t                for (var i = 1; i < iterations; i++) {\n\t                    block = hasher.finalize(block);\n\t                    hasher.reset();\n\t                }\n\n\t                derivedKey.concat(block);\n\t            }\n\t            derivedKey.sigBytes = keySize * 4;\n\n\t            return derivedKey;\n\t        }\n\t    });\n\n\t    /**\n\t     * Derives a key from a password.\n\t     *\n\t     * @param {WordArray|string} password The password.\n\t     * @param {WordArray|string} salt A salt.\n\t     * @param {Object} cfg (Optional) The configuration options to use for this computation.\n\t     *\n\t     * @return {WordArray} The derived key.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var key = CryptoJS.EvpKDF(password, salt);\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n\t     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n\t     */\n\t    C.EvpKDF = function (password, salt, cfg) {\n\t        return EvpKDF.create(cfg).compute(password, salt);\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA256 = C_algo.SHA256;\n\n\t    /**\n\t     * SHA-224 hash algorithm.\n\t     */\n\t    var SHA224 = C_algo.SHA224 = SHA256.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n\t                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA256._doFinalize.call(this);\n\n\t            hash.sigBytes -= 4;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA224('message');\n\t     *     var hash = CryptoJS.SHA224(wordArray);\n\t     */\n\t    C.SHA224 = SHA256._createHelper(SHA224);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA224(message, key);\n\t     */\n\t    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n\t}());\n\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var X32WordArray = C_lib.WordArray;\n\n\t    /**\n\t     * x64 namespace.\n\t     */\n\t    var C_x64 = C.x64 = {};\n\n\t    /**\n\t     * A 64-bit word.\n\t     */\n\t    var X64Word = C_x64.Word = Base.extend({\n\t        /**\n\t         * Initializes a newly created 64-bit word.\n\t         *\n\t         * @param {number} high The high 32 bits.\n\t         * @param {number} low The low 32 bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n\t         */\n\t        init: function (high, low) {\n\t            this.high = high;\n\t            this.low = low;\n\t        }\n\n\t        /**\n\t         * Bitwise NOTs this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after negating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var negated = x64Word.not();\n\t         */\n\t        // not: function () {\n\t            // var high = ~this.high;\n\t            // var low = ~this.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ANDs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to AND with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ANDing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var anded = x64Word.and(anotherX64Word);\n\t         */\n\t        // and: function (word) {\n\t            // var high = this.high & word.high;\n\t            // var low = this.low & word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise ORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to OR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after ORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var ored = x64Word.or(anotherX64Word);\n\t         */\n\t        // or: function (word) {\n\t            // var high = this.high | word.high;\n\t            // var low = this.low | word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Bitwise XORs this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to XOR with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after XORing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var xored = x64Word.xor(anotherX64Word);\n\t         */\n\t        // xor: function (word) {\n\t            // var high = this.high ^ word.high;\n\t            // var low = this.low ^ word.low;\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftL(25);\n\t         */\n\t        // shiftL: function (n) {\n\t            // if (n < 32) {\n\t                // var high = (this.high << n) | (this.low >>> (32 - n));\n\t                // var low = this.low << n;\n\t            // } else {\n\t                // var high = this.low << (n - 32);\n\t                // var low = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Shifts this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to shift.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after shifting.\n\t         *\n\t         * @example\n\t         *\n\t         *     var shifted = x64Word.shiftR(7);\n\t         */\n\t        // shiftR: function (n) {\n\t            // if (n < 32) {\n\t                // var low = (this.low >>> n) | (this.high << (32 - n));\n\t                // var high = this.high >>> n;\n\t            // } else {\n\t                // var low = this.high >>> (n - 32);\n\t                // var high = 0;\n\t            // }\n\n\t            // return X64Word.create(high, low);\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the left.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotL(25);\n\t         */\n\t        // rotL: function (n) {\n\t            // return this.shiftL(n).or(this.shiftR(64 - n));\n\t        // },\n\n\t        /**\n\t         * Rotates this word n bits to the right.\n\t         *\n\t         * @param {number} n The number of bits to rotate.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after rotating.\n\t         *\n\t         * @example\n\t         *\n\t         *     var rotated = x64Word.rotR(7);\n\t         */\n\t        // rotR: function (n) {\n\t            // return this.shiftR(n).or(this.shiftL(64 - n));\n\t        // },\n\n\t        /**\n\t         * Adds this word with the passed word.\n\t         *\n\t         * @param {X64Word} word The x64-Word to add with this word.\n\t         *\n\t         * @return {X64Word} A new x64-Word object after adding.\n\t         *\n\t         * @example\n\t         *\n\t         *     var added = x64Word.add(anotherX64Word);\n\t         */\n\t        // add: function (word) {\n\t            // var low = (this.low + word.low) | 0;\n\t            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n\t            // var high = (this.high + word.high + carry) | 0;\n\n\t            // return X64Word.create(high, low);\n\t        // }\n\t    });\n\n\t    /**\n\t     * An array of 64-bit words.\n\t     *\n\t     * @property {Array} words The array of CryptoJS.x64.Word objects.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var X64WordArray = C_x64.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create();\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ]);\n\t         *\n\t         *     var wordArray = CryptoJS.x64.WordArray.create([\n\t         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n\t         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n\t         *     ], 10);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 8;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this 64-bit word array to a 32-bit word array.\n\t         *\n\t         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var x32WordArray = x64WordArray.toX32();\n\t         */\n\t        toX32: function () {\n\t            // Shortcuts\n\t            var x64Words = this.words;\n\t            var x64WordsLength = x64Words.length;\n\n\t            // Convert\n\t            var x32Words = [];\n\t            for (var i = 0; i < x64WordsLength; i++) {\n\t                var x64Word = x64Words[i];\n\t                x32Words.push(x64Word.high);\n\t                x32Words.push(x64Word.low);\n\t            }\n\n\t            return X32WordArray.create(x32Words, this.sigBytes);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {X64WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = x64WordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\n\t            // Clone \"words\" array\n\t            var words = clone.words = this.words.slice(0);\n\n\t            // Clone each X64Word object\n\t            var wordsLength = words.length;\n\t            for (var i = 0; i < wordsLength; i++) {\n\t                words[i] = words[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\t}());\n\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var C_algo = C.algo;\n\n\t    // Constants tables\n\t    var RHO_OFFSETS = [];\n\t    var PI_INDEXES  = [];\n\t    var ROUND_CONSTANTS = [];\n\n\t    // Compute Constants\n\t    (function () {\n\t        // Compute rho offset constants\n\t        var x = 1, y = 0;\n\t        for (var t = 0; t < 24; t++) {\n\t            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n\t            var newX = y % 5;\n\t            var newY = (2 * x + 3 * y) % 5;\n\t            x = newX;\n\t            y = newY;\n\t        }\n\n\t        // Compute pi index constants\n\t        for (var x = 0; x < 5; x++) {\n\t            for (var y = 0; y < 5; y++) {\n\t                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n\t            }\n\t        }\n\n\t        // Compute round constants\n\t        var LFSR = 0x01;\n\t        for (var i = 0; i < 24; i++) {\n\t            var roundConstantMsw = 0;\n\t            var roundConstantLsw = 0;\n\n\t            for (var j = 0; j < 7; j++) {\n\t                if (LFSR & 0x01) {\n\t                    var bitPosition = (1 << j) - 1;\n\t                    if (bitPosition < 32) {\n\t                        roundConstantLsw ^= 1 << bitPosition;\n\t                    } else /* if (bitPosition >= 32) */ {\n\t                        roundConstantMsw ^= 1 << (bitPosition - 32);\n\t                    }\n\t                }\n\n\t                // Compute next LFSR\n\t                if (LFSR & 0x80) {\n\t                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n\t                    LFSR = (LFSR << 1) ^ 0x71;\n\t                } else {\n\t                    LFSR <<= 1;\n\t                }\n\t            }\n\n\t            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n\t        }\n\t    }());\n\n\t    // Reusable objects for temporary values\n\t    var T = [];\n\t    (function () {\n\t        for (var i = 0; i < 25; i++) {\n\t            T[i] = X64Word.create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-3 hash algorithm.\n\t     */\n\t    var SHA3 = C_algo.SHA3 = Hasher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} outputLength\n\t         *   The desired number of bits in the output hash.\n\t         *   Only values permitted are: 224, 256, 384, 512.\n\t         *   Default: 512\n\t         */\n\t        cfg: Hasher.cfg.extend({\n\t            outputLength: 512\n\t        }),\n\n\t        _doReset: function () {\n\t            var state = this._state = []\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = new X64Word.init();\n\t            }\n\n\t            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var nBlockSizeLanes = this.blockSize / 2;\n\n\t            // Absorb\n\t            for (var i = 0; i < nBlockSizeLanes; i++) {\n\t                // Shortcuts\n\t                var M2i  = M[offset + 2 * i];\n\t                var M2i1 = M[offset + 2 * i + 1];\n\n\t                // Swap endian\n\t                M2i = (\n\t                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)\n\t                );\n\t                M2i1 = (\n\t                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |\n\t                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Absorb message into state\n\t                var lane = state[i];\n\t                lane.high ^= M2i1;\n\t                lane.low  ^= M2i;\n\t            }\n\n\t            // Rounds\n\t            for (var round = 0; round < 24; round++) {\n\t                // Theta\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Mix column lanes\n\t                    var tMsw = 0, tLsw = 0;\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        tMsw ^= lane.high;\n\t                        tLsw ^= lane.low;\n\t                    }\n\n\t                    // Temporary values\n\t                    var Tx = T[x];\n\t                    Tx.high = tMsw;\n\t                    Tx.low  = tLsw;\n\t                }\n\t                for (var x = 0; x < 5; x++) {\n\t                    // Shortcuts\n\t                    var Tx4 = T[(x + 4) % 5];\n\t                    var Tx1 = T[(x + 1) % 5];\n\t                    var Tx1Msw = Tx1.high;\n\t                    var Tx1Lsw = Tx1.low;\n\n\t                    // Mix surrounding columns\n\t                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n\t                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n\t                    for (var y = 0; y < 5; y++) {\n\t                        var lane = state[x + 5 * y];\n\t                        lane.high ^= tMsw;\n\t                        lane.low  ^= tLsw;\n\t                    }\n\t                }\n\n\t                // Rho Pi\n\t                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n\t                    // Shortcuts\n\t                    var lane = state[laneIndex];\n\t                    var laneMsw = lane.high;\n\t                    var laneLsw = lane.low;\n\t                    var rhoOffset = RHO_OFFSETS[laneIndex];\n\n\t                    // Rotate lanes\n\t                    if (rhoOffset < 32) {\n\t                        var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n\t                        var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n\t                    } else /* if (rhoOffset >= 32) */ {\n\t                        var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n\t                        var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n\t                    }\n\n\t                    // Transpose lanes\n\t                    var TPiLane = T[PI_INDEXES[laneIndex]];\n\t                    TPiLane.high = tMsw;\n\t                    TPiLane.low  = tLsw;\n\t                }\n\n\t                // Rho pi at x = y = 0\n\t                var T0 = T[0];\n\t                var state0 = state[0];\n\t                T0.high = state0.high;\n\t                T0.low  = state0.low;\n\n\t                // Chi\n\t                for (var x = 0; x < 5; x++) {\n\t                    for (var y = 0; y < 5; y++) {\n\t                        // Shortcuts\n\t                        var laneIndex = x + 5 * y;\n\t                        var lane = state[laneIndex];\n\t                        var TLane = T[laneIndex];\n\t                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n\t                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n\t                        // Mix rows\n\t                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n\t                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);\n\t                    }\n\t                }\n\n\t                // Iota\n\t                var lane = state[0];\n\t                var roundConstant = ROUND_CONSTANTS[round];\n\t                lane.high ^= roundConstant.high;\n\t                lane.low  ^= roundConstant.low;;\n\t            }\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\t            var blockSizeBits = this.blockSize * 32;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n\t            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Shortcuts\n\t            var state = this._state;\n\t            var outputLengthBytes = this.cfg.outputLength / 8;\n\t            var outputLengthLanes = outputLengthBytes / 8;\n\n\t            // Squeeze\n\t            var hashWords = [];\n\t            for (var i = 0; i < outputLengthLanes; i++) {\n\t                // Shortcuts\n\t                var lane = state[i];\n\t                var laneMsw = lane.high;\n\t                var laneLsw = lane.low;\n\n\t                // Swap endian\n\t                laneMsw = (\n\t                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)\n\t                );\n\t                laneLsw = (\n\t                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |\n\t                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)\n\t                );\n\n\t                // Squeeze state to retrieve hash\n\t                hashWords.push(laneLsw);\n\t                hashWords.push(laneMsw);\n\t            }\n\n\t            // Return final computed hash\n\t            return new WordArray.init(hashWords, outputLengthBytes);\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\n\t            var state = clone._state = this._state.slice(0);\n\t            for (var i = 0; i < 25; i++) {\n\t                state[i] = state[i].clone();\n\t            }\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA3('message');\n\t     *     var hash = CryptoJS.SHA3(wordArray);\n\t     */\n\t    C.SHA3 = Hasher._createHelper(SHA3);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA3(message, key);\n\t     */\n\t    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n\t}(Math));\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\n\t    function X64Word_create() {\n\t        return X64Word.create.apply(X64Word, arguments);\n\t    }\n\n\t    // Constants\n\t    var K = [\n\t        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n\t        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n\t        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n\t        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n\t        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n\t        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n\t        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n\t        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n\t        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n\t        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n\t        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n\t        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n\t        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n\t        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n\t        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n\t        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n\t        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n\t        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n\t        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n\t        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n\t        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n\t        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n\t        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n\t        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n\t        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n\t        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n\t        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n\t        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n\t        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n\t        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n\t        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n\t        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n\t        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n\t        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n\t        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n\t        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n\t        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n\t        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n\t        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n\t        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n\t    ];\n\n\t    // Reusable objects\n\t    var W = [];\n\t    (function () {\n\t        for (var i = 0; i < 80; i++) {\n\t            W[i] = X64Word_create();\n\t        }\n\t    }());\n\n\t    /**\n\t     * SHA-512 hash algorithm.\n\t     */\n\t    var SHA512 = C_algo.SHA512 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n\t                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n\t                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n\t                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcuts\n\t            var H = this._hash.words;\n\n\t            var H0 = H[0];\n\t            var H1 = H[1];\n\t            var H2 = H[2];\n\t            var H3 = H[3];\n\t            var H4 = H[4];\n\t            var H5 = H[5];\n\t            var H6 = H[6];\n\t            var H7 = H[7];\n\n\t            var H0h = H0.high;\n\t            var H0l = H0.low;\n\t            var H1h = H1.high;\n\t            var H1l = H1.low;\n\t            var H2h = H2.high;\n\t            var H2l = H2.low;\n\t            var H3h = H3.high;\n\t            var H3l = H3.low;\n\t            var H4h = H4.high;\n\t            var H4l = H4.low;\n\t            var H5h = H5.high;\n\t            var H5l = H5.low;\n\t            var H6h = H6.high;\n\t            var H6l = H6.low;\n\t            var H7h = H7.high;\n\t            var H7l = H7.low;\n\n\t            // Working variables\n\t            var ah = H0h;\n\t            var al = H0l;\n\t            var bh = H1h;\n\t            var bl = H1l;\n\t            var ch = H2h;\n\t            var cl = H2l;\n\t            var dh = H3h;\n\t            var dl = H3l;\n\t            var eh = H4h;\n\t            var el = H4l;\n\t            var fh = H5h;\n\t            var fl = H5l;\n\t            var gh = H6h;\n\t            var gl = H6l;\n\t            var hh = H7h;\n\t            var hl = H7l;\n\n\t            // Rounds\n\t            for (var i = 0; i < 80; i++) {\n\t                // Shortcut\n\t                var Wi = W[i];\n\n\t                // Extend message\n\t                if (i < 16) {\n\t                    var Wih = Wi.high = M[offset + i * 2]     | 0;\n\t                    var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;\n\t                } else {\n\t                    // Gamma0\n\t                    var gamma0x  = W[i - 15];\n\t                    var gamma0xh = gamma0x.high;\n\t                    var gamma0xl = gamma0x.low;\n\t                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n\t                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n\t                    // Gamma1\n\t                    var gamma1x  = W[i - 2];\n\t                    var gamma1xh = gamma1x.high;\n\t                    var gamma1xl = gamma1x.low;\n\t                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n\t                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n\t                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n\t                    var Wi7  = W[i - 7];\n\t                    var Wi7h = Wi7.high;\n\t                    var Wi7l = Wi7.low;\n\n\t                    var Wi16  = W[i - 16];\n\t                    var Wi16h = Wi16.high;\n\t                    var Wi16l = Wi16.low;\n\n\t                    var Wil = gamma0l + Wi7l;\n\t                    var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n\t                    var Wil = Wil + gamma1l;\n\t                    var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n\t                    var Wil = Wil + Wi16l;\n\t                    var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n\t                    Wi.high = Wih;\n\t                    Wi.low  = Wil;\n\t                }\n\n\t                var chh  = (eh & fh) ^ (~eh & gh);\n\t                var chl  = (el & fl) ^ (~el & gl);\n\t                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n\t                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n\t                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n\t                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n\t                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n\t                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n\t                // t1 = h + sigma1 + ch + K[i] + W[i]\n\t                var Ki  = K[i];\n\t                var Kih = Ki.high;\n\t                var Kil = Ki.low;\n\n\t                var t1l = hl + sigma1l;\n\t                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + chl;\n\t                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Kil;\n\t                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n\t                var t1l = t1l + Wil;\n\t                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n\t                // t2 = sigma0 + maj\n\t                var t2l = sigma0l + majl;\n\t                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n\t                // Update working variables\n\t                hh = gh;\n\t                hl = gl;\n\t                gh = fh;\n\t                gl = fl;\n\t                fh = eh;\n\t                fl = el;\n\t                el = (dl + t1l) | 0;\n\t                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n\t                dh = ch;\n\t                dl = cl;\n\t                ch = bh;\n\t                cl = bl;\n\t                bh = ah;\n\t                bl = al;\n\t                al = (t1l + t2l) | 0;\n\t                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H0l = H0.low  = (H0l + al);\n\t            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n\t            H1l = H1.low  = (H1l + bl);\n\t            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n\t            H2l = H2.low  = (H2l + cl);\n\t            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n\t            H3l = H3.low  = (H3l + dl);\n\t            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n\t            H4l = H4.low  = (H4l + el);\n\t            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n\t            H5l = H5.low  = (H5l + fl);\n\t            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n\t            H6l = H6.low  = (H6l + gl);\n\t            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n\t            H7l = H7.low  = (H7l + hl);\n\t            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Convert hash to 32-bit word array before returning\n\t            var hash = this._hash.toX32();\n\n\t            // Return final computed hash\n\t            return hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        },\n\n\t        blockSize: 1024/32\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA512('message');\n\t     *     var hash = CryptoJS.SHA512(wordArray);\n\t     */\n\t    C.SHA512 = Hasher._createHelper(SHA512);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA512(message, key);\n\t     */\n\t    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_x64 = C.x64;\n\t    var X64Word = C_x64.Word;\n\t    var X64WordArray = C_x64.WordArray;\n\t    var C_algo = C.algo;\n\t    var SHA512 = C_algo.SHA512;\n\n\t    /**\n\t     * SHA-384 hash algorithm.\n\t     */\n\t    var SHA384 = C_algo.SHA384 = SHA512.extend({\n\t        _doReset: function () {\n\t            this._hash = new X64WordArray.init([\n\t                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n\t                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n\t                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n\t                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n\t            ]);\n\t        },\n\n\t        _doFinalize: function () {\n\t            var hash = SHA512._doFinalize.call(this);\n\n\t            hash.sigBytes -= 16;\n\n\t            return hash;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA384('message');\n\t     *     var hash = CryptoJS.SHA384(wordArray);\n\t     */\n\t    C.SHA384 = SHA512._createHelper(SHA384);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA384(message, key);\n\t     */\n\t    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n\t}());\n\n\n\t/**\n\t * Cipher core components.\n\t */\n\tCryptoJS.lib.Cipher || (function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var WordArray = C_lib.WordArray;\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var Base64 = C_enc.Base64;\n\t    var C_algo = C.algo;\n\t    var EvpKDF = C_algo.EvpKDF;\n\n\t    /**\n\t     * Abstract base cipher template.\n\t     *\n\t     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n\t     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n\t     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n\t     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n\t     */\n\t    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {WordArray} iv The IV to use for this operation.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Creates this cipher in encryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createEncryptor: function (key, cfg) {\n\t            return this.create(this._ENC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Creates this cipher in decryption mode.\n\t         *\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {Cipher} A cipher instance.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n\t         */\n\t        createDecryptor: function (key, cfg) {\n\t            return this.create(this._DEC_XFORM_MODE, key, cfg);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created cipher.\n\t         *\n\t         * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n\t         */\n\t        init: function (xformMode, key, cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Store transform mode and key\n\t            this._xformMode = xformMode;\n\t            this._key = key;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this cipher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     cipher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-cipher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Adds data to be encrypted or decrypted.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.process('data');\n\t         *     var encrypted = cipher.process(wordArray);\n\t         */\n\t        process: function (dataUpdate) {\n\t            // Append\n\t            this._append(dataUpdate);\n\n\t            // Process available blocks\n\t            return this._process();\n\t        },\n\n\t        /**\n\t         * Finalizes the encryption or decryption process.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n\t         *\n\t         * @return {WordArray} The data after final processing.\n\t         *\n\t         * @example\n\t         *\n\t         *     var encrypted = cipher.finalize();\n\t         *     var encrypted = cipher.finalize('data');\n\t         *     var encrypted = cipher.finalize(wordArray);\n\t         */\n\t        finalize: function (dataUpdate) {\n\t            // Final data update\n\t            if (dataUpdate) {\n\t                this._append(dataUpdate);\n\t            }\n\n\t            // Perform concrete-cipher logic\n\t            var finalProcessedData = this._doFinalize();\n\n\t            return finalProcessedData;\n\t        },\n\n\t        keySize: 128/32,\n\n\t        ivSize: 128/32,\n\n\t        _ENC_XFORM_MODE: 1,\n\n\t        _DEC_XFORM_MODE: 2,\n\n\t        /**\n\t         * Creates shortcut functions to a cipher's object interface.\n\t         *\n\t         * @param {Cipher} cipher The cipher to create a helper for.\n\t         *\n\t         * @return {Object} An object with encrypt and decrypt shortcut functions.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n\t         */\n\t        _createHelper: (function () {\n\t            function selectCipherStrategy(key) {\n\t                if (typeof key == 'string') {\n\t                    return PasswordBasedCipher;\n\t                } else {\n\t                    return SerializableCipher;\n\t                }\n\t            }\n\n\t            return function (cipher) {\n\t                return {\n\t                    encrypt: function (message, key, cfg) {\n\t                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n\t                    },\n\n\t                    decrypt: function (ciphertext, key, cfg) {\n\t                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n\t                    }\n\t                };\n\t            };\n\t        }())\n\t    });\n\n\t    /**\n\t     * Abstract base stream cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n\t     */\n\t    var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n\t        _doFinalize: function () {\n\t            // Process partial blocks\n\t            var finalProcessedBlocks = this._process(!!'flush');\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 1\n\t    });\n\n\t    /**\n\t     * Mode namespace.\n\t     */\n\t    var C_mode = C.mode = {};\n\n\t    /**\n\t     * Abstract base block cipher mode template.\n\t     */\n\t    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n\t        /**\n\t         * Creates this mode for encryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n\t         */\n\t        createEncryptor: function (cipher, iv) {\n\t            return this.Encryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Creates this mode for decryption.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n\t         */\n\t        createDecryptor: function (cipher, iv) {\n\t            return this.Decryptor.create(cipher, iv);\n\t        },\n\n\t        /**\n\t         * Initializes a newly created mode.\n\t         *\n\t         * @param {Cipher} cipher A block cipher instance.\n\t         * @param {Array} iv The IV words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n\t         */\n\t        init: function (cipher, iv) {\n\t            this._cipher = cipher;\n\t            this._iv = iv;\n\t        }\n\t    });\n\n\t    /**\n\t     * Cipher Block Chaining mode.\n\t     */\n\t    var CBC = C_mode.CBC = (function () {\n\t        /**\n\t         * Abstract base CBC mode.\n\t         */\n\t        var CBC = BlockCipherMode.extend();\n\n\t        /**\n\t         * CBC encryptor.\n\t         */\n\t        CBC.Encryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // XOR and encrypt\n\t                xorBlock.call(this, words, offset, blockSize);\n\t                cipher.encryptBlock(words, offset);\n\n\t                // Remember this block to use with next block\n\t                this._prevBlock = words.slice(offset, offset + blockSize);\n\t            }\n\t        });\n\n\t        /**\n\t         * CBC decryptor.\n\t         */\n\t        CBC.Decryptor = CBC.extend({\n\t            /**\n\t             * Processes the data block at offset.\n\t             *\n\t             * @param {Array} words The data words to operate on.\n\t             * @param {number} offset The offset where the block starts.\n\t             *\n\t             * @example\n\t             *\n\t             *     mode.processBlock(data.words, offset);\n\t             */\n\t            processBlock: function (words, offset) {\n\t                // Shortcuts\n\t                var cipher = this._cipher;\n\t                var blockSize = cipher.blockSize;\n\n\t                // Remember this block to use with next block\n\t                var thisBlock = words.slice(offset, offset + blockSize);\n\n\t                // Decrypt and XOR\n\t                cipher.decryptBlock(words, offset);\n\t                xorBlock.call(this, words, offset, blockSize);\n\n\t                // This block becomes the previous block\n\t                this._prevBlock = thisBlock;\n\t            }\n\t        });\n\n\t        function xorBlock(words, offset, blockSize) {\n\t            // Shortcut\n\t            var iv = this._iv;\n\n\t            // Choose mixing block\n\t            if (iv) {\n\t                var block = iv;\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            } else {\n\t                var block = this._prevBlock;\n\t            }\n\n\t            // XOR blocks\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= block[i];\n\t            }\n\t        }\n\n\t        return CBC;\n\t    }());\n\n\t    /**\n\t     * Padding namespace.\n\t     */\n\t    var C_pad = C.pad = {};\n\n\t    /**\n\t     * PKCS #5/7 padding strategy.\n\t     */\n\t    var Pkcs7 = C_pad.Pkcs7 = {\n\t        /**\n\t         * Pads data using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to pad.\n\t         * @param {number} blockSize The multiple that the data should be padded to.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n\t         */\n\t        pad: function (data, blockSize) {\n\t            // Shortcut\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count padding bytes\n\t            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t            // Create padding word\n\t            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n\t            // Create padding\n\t            var paddingWords = [];\n\t            for (var i = 0; i < nPaddingBytes; i += 4) {\n\t                paddingWords.push(paddingWord);\n\t            }\n\t            var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n\t            // Add padding\n\t            data.concat(padding);\n\t        },\n\n\t        /**\n\t         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n\t         *\n\t         * @param {WordArray} data The data to unpad.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n\t         */\n\t        unpad: function (data) {\n\t            // Get number of padding bytes from last byte\n\t            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t            // Remove padding\n\t            data.sigBytes -= nPaddingBytes;\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract base block cipher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n\t     */\n\t    var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Mode} mode The block mode to use. Default: CBC\n\t         * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n\t         */\n\t        cfg: Cipher.cfg.extend({\n\t            mode: CBC,\n\t            padding: Pkcs7\n\t        }),\n\n\t        reset: function () {\n\t            // Reset cipher\n\t            Cipher.reset.call(this);\n\n\t            // Shortcuts\n\t            var cfg = this.cfg;\n\t            var iv = cfg.iv;\n\t            var mode = cfg.mode;\n\n\t            // Reset block mode\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                var modeCreator = mode.createEncryptor;\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                var modeCreator = mode.createDecryptor;\n\t                // Keep at least one block in the buffer for unpadding\n\t                this._minBufferSize = 1;\n\t            }\n\n\t            if (this._mode && this._mode.__creator == modeCreator) {\n\t                this._mode.init(this, iv && iv.words);\n\t            } else {\n\t                this._mode = modeCreator.call(mode, this, iv && iv.words);\n\t                this._mode.__creator = modeCreator;\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (words, offset) {\n\t            this._mode.processBlock(words, offset);\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcut\n\t            var padding = this.cfg.padding;\n\n\t            // Finalize\n\t            if (this._xformMode == this._ENC_XFORM_MODE) {\n\t                // Pad data\n\t                padding.pad(this._data, this.blockSize);\n\n\t                // Process final blocks\n\t                var finalProcessedBlocks = this._process(!!'flush');\n\t            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n\t                // Process final blocks\n\t                var finalProcessedBlocks = this._process(!!'flush');\n\n\t                // Unpad data\n\t                padding.unpad(finalProcessedBlocks);\n\t            }\n\n\t            return finalProcessedBlocks;\n\t        },\n\n\t        blockSize: 128/32\n\t    });\n\n\t    /**\n\t     * A collection of cipher parameters.\n\t     *\n\t     * @property {WordArray} ciphertext The raw ciphertext.\n\t     * @property {WordArray} key The key to this ciphertext.\n\t     * @property {WordArray} iv The IV used in the ciphering operation.\n\t     * @property {WordArray} salt The salt used with a key derivation function.\n\t     * @property {Cipher} algorithm The cipher algorithm.\n\t     * @property {Mode} mode The block mode used in the ciphering operation.\n\t     * @property {Padding} padding The padding scheme used in the ciphering operation.\n\t     * @property {number} blockSize The block size of the cipher.\n\t     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n\t     */\n\t    var CipherParams = C_lib.CipherParams = Base.extend({\n\t        /**\n\t         * Initializes a newly created cipher params object.\n\t         *\n\t         * @param {Object} cipherParams An object with any of the possible cipher parameters.\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.lib.CipherParams.create({\n\t         *         ciphertext: ciphertextWordArray,\n\t         *         key: keyWordArray,\n\t         *         iv: ivWordArray,\n\t         *         salt: saltWordArray,\n\t         *         algorithm: CryptoJS.algo.AES,\n\t         *         mode: CryptoJS.mode.CBC,\n\t         *         padding: CryptoJS.pad.PKCS7,\n\t         *         blockSize: 4,\n\t         *         formatter: CryptoJS.format.OpenSSL\n\t         *     });\n\t         */\n\t        init: function (cipherParams) {\n\t            this.mixIn(cipherParams);\n\t        },\n\n\t        /**\n\t         * Converts this cipher params object to a string.\n\t         *\n\t         * @param {Format} formatter (Optional) The formatting strategy to use.\n\t         *\n\t         * @return {string} The stringified cipher params.\n\t         *\n\t         * @throws Error If neither the formatter nor the default formatter is set.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = cipherParams + '';\n\t         *     var string = cipherParams.toString();\n\t         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n\t         */\n\t        toString: function (formatter) {\n\t            return (formatter || this.formatter).stringify(this);\n\t        }\n\t    });\n\n\t    /**\n\t     * Format namespace.\n\t     */\n\t    var C_format = C.format = {};\n\n\t    /**\n\t     * OpenSSL formatting strategy.\n\t     */\n\t    var OpenSSLFormatter = C_format.OpenSSL = {\n\t        /**\n\t         * Converts a cipher params object to an OpenSSL-compatible string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The OpenSSL-compatible string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            // Shortcuts\n\t            var ciphertext = cipherParams.ciphertext;\n\t            var salt = cipherParams.salt;\n\n\t            // Format\n\t            if (salt) {\n\t                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n\t            } else {\n\t                var wordArray = ciphertext;\n\t            }\n\n\t            return wordArray.toString(Base64);\n\t        },\n\n\t        /**\n\t         * Converts an OpenSSL-compatible string to a cipher params object.\n\t         *\n\t         * @param {string} openSSLStr The OpenSSL-compatible string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n\t         */\n\t        parse: function (openSSLStr) {\n\t            // Parse base64\n\t            var ciphertext = Base64.parse(openSSLStr);\n\n\t            // Shortcut\n\t            var ciphertextWords = ciphertext.words;\n\n\t            // Test for salt\n\t            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n\t                // Extract salt\n\t                var salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n\t                // Remove salt from ciphertext\n\t                ciphertextWords.splice(0, 4);\n\t                ciphertext.sigBytes -= 16;\n\t            }\n\n\t            return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n\t         */\n\t        cfg: Base.extend({\n\t            format: OpenSSLFormatter\n\t        }),\n\n\t        /**\n\t         * Encrypts a message.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Encrypt\n\t            var encryptor = cipher.createEncryptor(key, cfg);\n\t            var ciphertext = encryptor.finalize(message);\n\n\t            // Shortcut\n\t            var cipherCfg = encryptor.cfg;\n\n\t            // Create and return serializable cipher params\n\t            return CipherParams.create({\n\t                ciphertext: ciphertext,\n\t                key: key,\n\t                iv: cipherCfg.iv,\n\t                algorithm: cipher,\n\t                mode: cipherCfg.mode,\n\t                padding: cipherCfg.padding,\n\t                blockSize: cipher.blockSize,\n\t                formatter: cfg.format\n\t            });\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {WordArray} key The key.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, key, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Decrypt\n\t            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n\t            return plaintext;\n\t        },\n\n\t        /**\n\t         * Converts serialized ciphertext to CipherParams,\n\t         * else assumed CipherParams already and returns ciphertext unchanged.\n\t         *\n\t         * @param {CipherParams|string} ciphertext The ciphertext.\n\t         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n\t         *\n\t         * @return {CipherParams} The unserialized ciphertext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n\t         */\n\t        _parse: function (ciphertext, format) {\n\t            if (typeof ciphertext == 'string') {\n\t                return format.parse(ciphertext, this);\n\t            } else {\n\t                return ciphertext;\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Key derivation function namespace.\n\t     */\n\t    var C_kdf = C.kdf = {};\n\n\t    /**\n\t     * OpenSSL key derivation function.\n\t     */\n\t    var OpenSSLKdf = C_kdf.OpenSSL = {\n\t        /**\n\t         * Derives a key and IV from a password.\n\t         *\n\t         * @param {string} password The password to derive from.\n\t         * @param {number} keySize The size in words of the key to generate.\n\t         * @param {number} ivSize The size in words of the IV to generate.\n\t         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n\t         *\n\t         * @return {CipherParams} A cipher params object with the key, IV, and salt.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n\t         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n\t         */\n\t        execute: function (password, keySize, ivSize, salt) {\n\t            // Generate random salt\n\t            if (!salt) {\n\t                salt = WordArray.random(64/8);\n\t            }\n\n\t            // Derive key and IV\n\t            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n\t            // Separate key and IV\n\t            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n\t            key.sigBytes = keySize * 4;\n\n\t            // Return params\n\t            return CipherParams.create({ key: key, iv: iv, salt: salt });\n\t        }\n\t    };\n\n\t    /**\n\t     * A serializable cipher wrapper that derives the key from a password,\n\t     * and returns ciphertext as a serializable cipher params object.\n\t     */\n\t    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n\t         */\n\t        cfg: SerializableCipher.cfg.extend({\n\t            kdf: OpenSSLKdf\n\t        }),\n\n\t        /**\n\t         * Encrypts a message using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {WordArray|string} message The message to encrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {CipherParams} A cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n\t         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        encrypt: function (cipher, message, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Encrypt\n\t            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n\t            // Mix in derived params\n\t            ciphertext.mixIn(derivedParams);\n\n\t            return ciphertext;\n\t        },\n\n\t        /**\n\t         * Decrypts serialized ciphertext using a password.\n\t         *\n\t         * @param {Cipher} cipher The cipher algorithm to use.\n\t         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n\t         * @param {string} password The password.\n\t         * @param {Object} cfg (Optional) The configuration options to use for this operation.\n\t         *\n\t         * @return {WordArray} The plaintext.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n\t         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n\t         */\n\t        decrypt: function (cipher, ciphertext, password, cfg) {\n\t            // Apply config defaults\n\t            cfg = this.cfg.extend(cfg);\n\n\t            // Convert string to CipherParams\n\t            ciphertext = this._parse(ciphertext, cfg.format);\n\n\t            // Derive key and other params\n\t            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n\t            // Add IV to config\n\t            cfg.iv = derivedParams.iv;\n\n\t            // Decrypt\n\t            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n\t            return plaintext;\n\t        }\n\t    });\n\t}());\n\n\n\t/**\n\t * Cipher Feedback block mode.\n\t */\n\tCryptoJS.mode.CFB = (function () {\n\t    var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    CFB.Encryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // Remember this block to use with next block\n\t            this._prevBlock = words.slice(offset, offset + blockSize);\n\t        }\n\t    });\n\n\t    CFB.Decryptor = CFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher;\n\t            var blockSize = cipher.blockSize;\n\n\t            // Remember this block to use with next block\n\t            var thisBlock = words.slice(offset, offset + blockSize);\n\n\t            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n\t            // This block becomes the previous block\n\t            this._prevBlock = thisBlock;\n\t        }\n\t    });\n\n\t    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n\t        // Shortcut\n\t        var iv = this._iv;\n\n\t        // Generate keystream\n\t        if (iv) {\n\t            var keystream = iv.slice(0);\n\n\t            // Remove IV for subsequent blocks\n\t            this._iv = undefined;\n\t        } else {\n\t            var keystream = this._prevBlock;\n\t        }\n\t        cipher.encryptBlock(keystream, 0);\n\n\t        // Encrypt\n\t        for (var i = 0; i < blockSize; i++) {\n\t            words[offset + i] ^= keystream[i];\n\t        }\n\t    }\n\n\t    return CFB;\n\t}());\n\n\n\t/**\n\t * Electronic Codebook block mode.\n\t */\n\tCryptoJS.mode.ECB = (function () {\n\t    var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    ECB.Encryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.encryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    ECB.Decryptor = ECB.extend({\n\t        processBlock: function (words, offset) {\n\t            this._cipher.decryptBlock(words, offset);\n\t        }\n\t    });\n\n\t    return ECB;\n\t}());\n\n\n\t/**\n\t * ANSI X.923 padding strategy.\n\t */\n\tCryptoJS.pad.AnsiX923 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcuts\n\t        var dataSigBytes = data.sigBytes;\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n\t        // Compute last byte position\n\t        var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n\t        data.sigBytes += nPaddingBytes;\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\t/**\n\t * ISO 10126 padding strategy.\n\t */\n\tCryptoJS.pad.Iso10126 = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Count padding bytes\n\t        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n\t        // Pad\n\t        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n\t             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n\t    },\n\n\t    unpad: function (data) {\n\t        // Get number of padding bytes from last byte\n\t        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n\t        // Remove padding\n\t        data.sigBytes -= nPaddingBytes;\n\t    }\n\t};\n\n\n\t/**\n\t * ISO/IEC 9797-1 Padding Method 2.\n\t */\n\tCryptoJS.pad.Iso97971 = {\n\t    pad: function (data, blockSize) {\n\t        // Add 0x80 byte\n\t        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n\t        // Zero pad the rest\n\t        CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Remove zero padding\n\t        CryptoJS.pad.ZeroPadding.unpad(data);\n\n\t        // Remove one more byte -- the 0x80 byte\n\t        data.sigBytes--;\n\t    }\n\t};\n\n\n\t/**\n\t * Output Feedback block mode.\n\t */\n\tCryptoJS.mode.OFB = (function () {\n\t    var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = OFB.Encryptor = OFB.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var keystream = this._keystream;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                keystream = this._keystream = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    OFB.Decryptor = Encryptor;\n\n\t    return OFB;\n\t}());\n\n\n\t/**\n\t * A noop padding strategy.\n\t */\n\tCryptoJS.pad.NoPadding = {\n\t    pad: function () {\n\t    },\n\n\t    unpad: function () {\n\t    }\n\t};\n\n\n\t(function (undefined) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var CipherParams = C_lib.CipherParams;\n\t    var C_enc = C.enc;\n\t    var Hex = C_enc.Hex;\n\t    var C_format = C.format;\n\n\t    var HexFormatter = C_format.Hex = {\n\t        /**\n\t         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n\t         *\n\t         * @param {CipherParams} cipherParams The cipher params object.\n\t         *\n\t         * @return {string} The hexadecimally encoded string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n\t         */\n\t        stringify: function (cipherParams) {\n\t            return cipherParams.ciphertext.toString(Hex);\n\t        },\n\n\t        /**\n\t         * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n\t         *\n\t         * @param {string} input The hexadecimally encoded string.\n\t         *\n\t         * @return {CipherParams} The cipher params object.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);\n\t         */\n\t        parse: function (input) {\n\t            var ciphertext = Hex.parse(input);\n\t            return CipherParams.create({ ciphertext: ciphertext });\n\t        }\n\t    };\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Lookup tables\n\t    var SBOX = [];\n\t    var INV_SBOX = [];\n\t    var SUB_MIX_0 = [];\n\t    var SUB_MIX_1 = [];\n\t    var SUB_MIX_2 = [];\n\t    var SUB_MIX_3 = [];\n\t    var INV_SUB_MIX_0 = [];\n\t    var INV_SUB_MIX_1 = [];\n\t    var INV_SUB_MIX_2 = [];\n\t    var INV_SUB_MIX_3 = [];\n\n\t    // Compute lookup tables\n\t    (function () {\n\t        // Compute double table\n\t        var d = [];\n\t        for (var i = 0; i < 256; i++) {\n\t            if (i < 128) {\n\t                d[i] = i << 1;\n\t            } else {\n\t                d[i] = (i << 1) ^ 0x11b;\n\t            }\n\t        }\n\n\t        // Walk GF(2^8)\n\t        var x = 0;\n\t        var xi = 0;\n\t        for (var i = 0; i < 256; i++) {\n\t            // Compute sbox\n\t            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n\t            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n\t            SBOX[x] = sx;\n\t            INV_SBOX[sx] = x;\n\n\t            // Compute multiplication\n\t            var x2 = d[x];\n\t            var x4 = d[x2];\n\t            var x8 = d[x4];\n\n\t            // Compute sub bytes, mix columns tables\n\t            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n\t            SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n\t            SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n\t            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);\n\t            SUB_MIX_3[x] = t;\n\n\t            // Compute inv sub bytes, inv mix columns tables\n\t            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n\t            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n\t            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n\t            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);\n\t            INV_SUB_MIX_3[sx] = t;\n\n\t            // Compute next counter\n\t            if (!x) {\n\t                x = xi = 1;\n\t            } else {\n\t                x = x2 ^ d[d[d[x8 ^ x2]]];\n\t                xi ^= d[d[xi]];\n\t            }\n\t        }\n\t    }());\n\n\t    // Precomputed Rcon lookup\n\t    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n\t    /**\n\t     * AES block cipher algorithm.\n\t     */\n\t    var AES = C_algo.AES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Skip reset of nRounds has been set before and key did not change\n\t            if (this._nRounds && this._keyPriorReset === this._key) {\n\t                return;\n\t            }\n\n\t            // Shortcuts\n\t            var key = this._keyPriorReset = this._key;\n\t            var keyWords = key.words;\n\t            var keySize = key.sigBytes / 4;\n\n\t            // Compute number of rounds\n\t            var nRounds = this._nRounds = keySize + 6;\n\n\t            // Compute number of key schedule rows\n\t            var ksRows = (nRounds + 1) * 4;\n\n\t            // Compute key schedule\n\t            var keySchedule = this._keySchedule = [];\n\t            for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n\t                if (ksRow < keySize) {\n\t                    keySchedule[ksRow] = keyWords[ksRow];\n\t                } else {\n\t                    var t = keySchedule[ksRow - 1];\n\n\t                    if (!(ksRow % keySize)) {\n\t                        // Rot word\n\t                        t = (t << 8) | (t >>> 24);\n\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n\t                        // Mix Rcon\n\t                        t ^= RCON[(ksRow / keySize) | 0] << 24;\n\t                    } else if (keySize > 6 && ksRow % keySize == 4) {\n\t                        // Sub word\n\t                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\t                    }\n\n\t                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n\t                }\n\t            }\n\n\t            // Compute inv key schedule\n\t            var invKeySchedule = this._invKeySchedule = [];\n\t            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n\t                var ksRow = ksRows - invKsRow;\n\n\t                if (invKsRow % 4) {\n\t                    var t = keySchedule[ksRow];\n\t                } else {\n\t                    var t = keySchedule[ksRow - 4];\n\t                }\n\n\t                if (invKsRow < 4 || ksRow <= 4) {\n\t                    invKeySchedule[invKsRow] = t;\n\t                } else {\n\t                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n\t                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n\t                }\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            // Swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\n\t            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n\t            // Inv swap 2nd and 4th rows\n\t            var t = M[offset + 1];\n\t            M[offset + 1] = M[offset + 3];\n\t            M[offset + 3] = t;\n\t        },\n\n\t        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n\t            // Shortcut\n\t            var nRounds = this._nRounds;\n\n\t            // Get input, add round key\n\t            var s0 = M[offset]     ^ keySchedule[0];\n\t            var s1 = M[offset + 1] ^ keySchedule[1];\n\t            var s2 = M[offset + 2] ^ keySchedule[2];\n\t            var s3 = M[offset + 3] ^ keySchedule[3];\n\n\t            // Key schedule row counter\n\t            var ksRow = 4;\n\n\t            // Rounds\n\t            for (var round = 1; round < nRounds; round++) {\n\t                // Shift rows, sub bytes, mix columns, add round key\n\t                var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n\t                var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n\t                var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n\t                var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n\t                // Update state\n\t                s0 = t0;\n\t                s1 = t1;\n\t                s2 = t2;\n\t                s3 = t3;\n\t            }\n\n\t            // Shift rows, sub bytes, add round key\n\t            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n\t            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n\t            // Set output\n\t            M[offset]     = t0;\n\t            M[offset + 1] = t1;\n\t            M[offset + 2] = t2;\n\t            M[offset + 3] = t3;\n\t        },\n\n\t        keySize: 256/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.AES = BlockCipher._createHelper(AES);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var BlockCipher = C_lib.BlockCipher;\n\t    var C_algo = C.algo;\n\n\t    // Permuted Choice 1 constants\n\t    var PC1 = [\n\t        57, 49, 41, 33, 25, 17, 9,  1,\n\t        58, 50, 42, 34, 26, 18, 10, 2,\n\t        59, 51, 43, 35, 27, 19, 11, 3,\n\t        60, 52, 44, 36, 63, 55, 47, 39,\n\t        31, 23, 15, 7,  62, 54, 46, 38,\n\t        30, 22, 14, 6,  61, 53, 45, 37,\n\t        29, 21, 13, 5,  28, 20, 12, 4\n\t    ];\n\n\t    // Permuted Choice 2 constants\n\t    var PC2 = [\n\t        14, 17, 11, 24, 1,  5,\n\t        3,  28, 15, 6,  21, 10,\n\t        23, 19, 12, 4,  26, 8,\n\t        16, 7,  27, 20, 13, 2,\n\t        41, 52, 31, 37, 47, 55,\n\t        30, 40, 51, 45, 33, 48,\n\t        44, 49, 39, 56, 34, 53,\n\t        46, 42, 50, 36, 29, 32\n\t    ];\n\n\t    // Cumulative bit shift constants\n\t    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n\t    // SBOXes and round permutation constants\n\t    var SBOX_P = [\n\t        {\n\t            0x0: 0x808200,\n\t            0x10000000: 0x8000,\n\t            0x20000000: 0x808002,\n\t            0x30000000: 0x2,\n\t            0x40000000: 0x200,\n\t            0x50000000: 0x808202,\n\t            0x60000000: 0x800202,\n\t            0x70000000: 0x800000,\n\t            0x80000000: 0x202,\n\t            0x90000000: 0x800200,\n\t            0xa0000000: 0x8200,\n\t            0xb0000000: 0x808000,\n\t            0xc0000000: 0x8002,\n\t            0xd0000000: 0x800002,\n\t            0xe0000000: 0x0,\n\t            0xf0000000: 0x8202,\n\t            0x8000000: 0x0,\n\t            0x18000000: 0x808202,\n\t            0x28000000: 0x8202,\n\t            0x38000000: 0x8000,\n\t            0x48000000: 0x808200,\n\t            0x58000000: 0x200,\n\t            0x68000000: 0x808002,\n\t            0x78000000: 0x2,\n\t            0x88000000: 0x800200,\n\t            0x98000000: 0x8200,\n\t            0xa8000000: 0x808000,\n\t            0xb8000000: 0x800202,\n\t            0xc8000000: 0x800002,\n\t            0xd8000000: 0x8002,\n\t            0xe8000000: 0x202,\n\t            0xf8000000: 0x800000,\n\t            0x1: 0x8000,\n\t            0x10000001: 0x2,\n\t            0x20000001: 0x808200,\n\t            0x30000001: 0x800000,\n\t            0x40000001: 0x808002,\n\t            0x50000001: 0x8200,\n\t            0x60000001: 0x200,\n\t            0x70000001: 0x800202,\n\t            0x80000001: 0x808202,\n\t            0x90000001: 0x808000,\n\t            0xa0000001: 0x800002,\n\t            0xb0000001: 0x8202,\n\t            0xc0000001: 0x202,\n\t            0xd0000001: 0x800200,\n\t            0xe0000001: 0x8002,\n\t            0xf0000001: 0x0,\n\t            0x8000001: 0x808202,\n\t            0x18000001: 0x808000,\n\t            0x28000001: 0x800000,\n\t            0x38000001: 0x200,\n\t            0x48000001: 0x8000,\n\t            0x58000001: 0x800002,\n\t            0x68000001: 0x2,\n\t            0x78000001: 0x8202,\n\t            0x88000001: 0x8002,\n\t            0x98000001: 0x800202,\n\t            0xa8000001: 0x202,\n\t            0xb8000001: 0x808200,\n\t            0xc8000001: 0x800200,\n\t            0xd8000001: 0x0,\n\t            0xe8000001: 0x8200,\n\t            0xf8000001: 0x808002\n\t        },\n\t        {\n\t            0x0: 0x40084010,\n\t            0x1000000: 0x4000,\n\t            0x2000000: 0x80000,\n\t            0x3000000: 0x40080010,\n\t            0x4000000: 0x40000010,\n\t            0x5000000: 0x40084000,\n\t            0x6000000: 0x40004000,\n\t            0x7000000: 0x10,\n\t            0x8000000: 0x84000,\n\t            0x9000000: 0x40004010,\n\t            0xa000000: 0x40000000,\n\t            0xb000000: 0x84010,\n\t            0xc000000: 0x80010,\n\t            0xd000000: 0x0,\n\t            0xe000000: 0x4010,\n\t            0xf000000: 0x40080000,\n\t            0x800000: 0x40004000,\n\t            0x1800000: 0x84010,\n\t            0x2800000: 0x10,\n\t            0x3800000: 0x40004010,\n\t            0x4800000: 0x40084010,\n\t            0x5800000: 0x40000000,\n\t            0x6800000: 0x80000,\n\t            0x7800000: 0x40080010,\n\t            0x8800000: 0x80010,\n\t            0x9800000: 0x0,\n\t            0xa800000: 0x4000,\n\t            0xb800000: 0x40080000,\n\t            0xc800000: 0x40000010,\n\t            0xd800000: 0x84000,\n\t            0xe800000: 0x40084000,\n\t            0xf800000: 0x4010,\n\t            0x10000000: 0x0,\n\t            0x11000000: 0x40080010,\n\t            0x12000000: 0x40004010,\n\t            0x13000000: 0x40084000,\n\t            0x14000000: 0x40080000,\n\t            0x15000000: 0x10,\n\t            0x16000000: 0x84010,\n\t            0x17000000: 0x4000,\n\t            0x18000000: 0x4010,\n\t            0x19000000: 0x80000,\n\t            0x1a000000: 0x80010,\n\t            0x1b000000: 0x40000010,\n\t            0x1c000000: 0x84000,\n\t            0x1d000000: 0x40004000,\n\t            0x1e000000: 0x40000000,\n\t            0x1f000000: 0x40084010,\n\t            0x10800000: 0x84010,\n\t            0x11800000: 0x80000,\n\t            0x12800000: 0x40080000,\n\t            0x13800000: 0x4000,\n\t            0x14800000: 0x40004000,\n\t            0x15800000: 0x40084010,\n\t            0x16800000: 0x10,\n\t            0x17800000: 0x40000000,\n\t            0x18800000: 0x40084000,\n\t            0x19800000: 0x40000010,\n\t            0x1a800000: 0x40004010,\n\t            0x1b800000: 0x80010,\n\t            0x1c800000: 0x0,\n\t            0x1d800000: 0x4010,\n\t            0x1e800000: 0x40080010,\n\t            0x1f800000: 0x84000\n\t        },\n\t        {\n\t            0x0: 0x104,\n\t            0x100000: 0x0,\n\t            0x200000: 0x4000100,\n\t            0x300000: 0x10104,\n\t            0x400000: 0x10004,\n\t            0x500000: 0x4000004,\n\t            0x600000: 0x4010104,\n\t            0x700000: 0x4010000,\n\t            0x800000: 0x4000000,\n\t            0x900000: 0x4010100,\n\t            0xa00000: 0x10100,\n\t            0xb00000: 0x4010004,\n\t            0xc00000: 0x4000104,\n\t            0xd00000: 0x10000,\n\t            0xe00000: 0x4,\n\t            0xf00000: 0x100,\n\t            0x80000: 0x4010100,\n\t            0x180000: 0x4010004,\n\t            0x280000: 0x0,\n\t            0x380000: 0x4000100,\n\t            0x480000: 0x4000004,\n\t            0x580000: 0x10000,\n\t            0x680000: 0x10004,\n\t            0x780000: 0x104,\n\t            0x880000: 0x4,\n\t            0x980000: 0x100,\n\t            0xa80000: 0x4010000,\n\t            0xb80000: 0x10104,\n\t            0xc80000: 0x10100,\n\t            0xd80000: 0x4000104,\n\t            0xe80000: 0x4010104,\n\t            0xf80000: 0x4000000,\n\t            0x1000000: 0x4010100,\n\t            0x1100000: 0x10004,\n\t            0x1200000: 0x10000,\n\t            0x1300000: 0x4000100,\n\t            0x1400000: 0x100,\n\t            0x1500000: 0x4010104,\n\t            0x1600000: 0x4000004,\n\t            0x1700000: 0x0,\n\t            0x1800000: 0x4000104,\n\t            0x1900000: 0x4000000,\n\t            0x1a00000: 0x4,\n\t            0x1b00000: 0x10100,\n\t            0x1c00000: 0x4010000,\n\t            0x1d00000: 0x104,\n\t            0x1e00000: 0x10104,\n\t            0x1f00000: 0x4010004,\n\t            0x1080000: 0x4000000,\n\t            0x1180000: 0x104,\n\t            0x1280000: 0x4010100,\n\t            0x1380000: 0x0,\n\t            0x1480000: 0x10004,\n\t            0x1580000: 0x4000100,\n\t            0x1680000: 0x100,\n\t            0x1780000: 0x4010004,\n\t            0x1880000: 0x10000,\n\t            0x1980000: 0x4010104,\n\t            0x1a80000: 0x10104,\n\t            0x1b80000: 0x4000004,\n\t            0x1c80000: 0x4000104,\n\t            0x1d80000: 0x4010000,\n\t            0x1e80000: 0x4,\n\t            0x1f80000: 0x10100\n\t        },\n\t        {\n\t            0x0: 0x80401000,\n\t            0x10000: 0x80001040,\n\t            0x20000: 0x401040,\n\t            0x30000: 0x80400000,\n\t            0x40000: 0x0,\n\t            0x50000: 0x401000,\n\t            0x60000: 0x80000040,\n\t            0x70000: 0x400040,\n\t            0x80000: 0x80000000,\n\t            0x90000: 0x400000,\n\t            0xa0000: 0x40,\n\t            0xb0000: 0x80001000,\n\t            0xc0000: 0x80400040,\n\t            0xd0000: 0x1040,\n\t            0xe0000: 0x1000,\n\t            0xf0000: 0x80401040,\n\t            0x8000: 0x80001040,\n\t            0x18000: 0x40,\n\t            0x28000: 0x80400040,\n\t            0x38000: 0x80001000,\n\t            0x48000: 0x401000,\n\t            0x58000: 0x80401040,\n\t            0x68000: 0x0,\n\t            0x78000: 0x80400000,\n\t            0x88000: 0x1000,\n\t            0x98000: 0x80401000,\n\t            0xa8000: 0x400000,\n\t            0xb8000: 0x1040,\n\t            0xc8000: 0x80000000,\n\t            0xd8000: 0x400040,\n\t            0xe8000: 0x401040,\n\t            0xf8000: 0x80000040,\n\t            0x100000: 0x400040,\n\t            0x110000: 0x401000,\n\t            0x120000: 0x80000040,\n\t            0x130000: 0x0,\n\t            0x140000: 0x1040,\n\t            0x150000: 0x80400040,\n\t            0x160000: 0x80401000,\n\t            0x170000: 0x80001040,\n\t            0x180000: 0x80401040,\n\t            0x190000: 0x80000000,\n\t            0x1a0000: 0x80400000,\n\t            0x1b0000: 0x401040,\n\t            0x1c0000: 0x80001000,\n\t            0x1d0000: 0x400000,\n\t            0x1e0000: 0x40,\n\t            0x1f0000: 0x1000,\n\t            0x108000: 0x80400000,\n\t            0x118000: 0x80401040,\n\t            0x128000: 0x0,\n\t            0x138000: 0x401000,\n\t            0x148000: 0x400040,\n\t            0x158000: 0x80000000,\n\t            0x168000: 0x80001040,\n\t            0x178000: 0x40,\n\t            0x188000: 0x80000040,\n\t            0x198000: 0x1000,\n\t            0x1a8000: 0x80001000,\n\t            0x1b8000: 0x80400040,\n\t            0x1c8000: 0x1040,\n\t            0x1d8000: 0x80401000,\n\t            0x1e8000: 0x400000,\n\t            0x1f8000: 0x401040\n\t        },\n\t        {\n\t            0x0: 0x80,\n\t            0x1000: 0x1040000,\n\t            0x2000: 0x40000,\n\t            0x3000: 0x20000000,\n\t            0x4000: 0x20040080,\n\t            0x5000: 0x1000080,\n\t            0x6000: 0x21000080,\n\t            0x7000: 0x40080,\n\t            0x8000: 0x1000000,\n\t            0x9000: 0x20040000,\n\t            0xa000: 0x20000080,\n\t            0xb000: 0x21040080,\n\t            0xc000: 0x21040000,\n\t            0xd000: 0x0,\n\t            0xe000: 0x1040080,\n\t            0xf000: 0x21000000,\n\t            0x800: 0x1040080,\n\t            0x1800: 0x21000080,\n\t            0x2800: 0x80,\n\t            0x3800: 0x1040000,\n\t            0x4800: 0x40000,\n\t            0x5800: 0x20040080,\n\t            0x6800: 0x21040000,\n\t            0x7800: 0x20000000,\n\t            0x8800: 0x20040000,\n\t            0x9800: 0x0,\n\t            0xa800: 0x21040080,\n\t            0xb800: 0x1000080,\n\t            0xc800: 0x20000080,\n\t            0xd800: 0x21000000,\n\t            0xe800: 0x1000000,\n\t            0xf800: 0x40080,\n\t            0x10000: 0x40000,\n\t            0x11000: 0x80,\n\t            0x12000: 0x20000000,\n\t            0x13000: 0x21000080,\n\t            0x14000: 0x1000080,\n\t            0x15000: 0x21040000,\n\t            0x16000: 0x20040080,\n\t            0x17000: 0x1000000,\n\t            0x18000: 0x21040080,\n\t            0x19000: 0x21000000,\n\t            0x1a000: 0x1040000,\n\t            0x1b000: 0x20040000,\n\t            0x1c000: 0x40080,\n\t            0x1d000: 0x20000080,\n\t            0x1e000: 0x0,\n\t            0x1f000: 0x1040080,\n\t            0x10800: 0x21000080,\n\t            0x11800: 0x1000000,\n\t            0x12800: 0x1040000,\n\t            0x13800: 0x20040080,\n\t            0x14800: 0x20000000,\n\t            0x15800: 0x1040080,\n\t            0x16800: 0x80,\n\t            0x17800: 0x21040000,\n\t            0x18800: 0x40080,\n\t            0x19800: 0x21040080,\n\t            0x1a800: 0x0,\n\t            0x1b800: 0x21000000,\n\t            0x1c800: 0x1000080,\n\t            0x1d800: 0x40000,\n\t            0x1e800: 0x20040000,\n\t            0x1f800: 0x20000080\n\t        },\n\t        {\n\t            0x0: 0x10000008,\n\t            0x100: 0x2000,\n\t            0x200: 0x10200000,\n\t            0x300: 0x10202008,\n\t            0x400: 0x10002000,\n\t            0x500: 0x200000,\n\t            0x600: 0x200008,\n\t            0x700: 0x10000000,\n\t            0x800: 0x0,\n\t            0x900: 0x10002008,\n\t            0xa00: 0x202000,\n\t            0xb00: 0x8,\n\t            0xc00: 0x10200008,\n\t            0xd00: 0x202008,\n\t            0xe00: 0x2008,\n\t            0xf00: 0x10202000,\n\t            0x80: 0x10200000,\n\t            0x180: 0x10202008,\n\t            0x280: 0x8,\n\t            0x380: 0x200000,\n\t            0x480: 0x202008,\n\t            0x580: 0x10000008,\n\t            0x680: 0x10002000,\n\t            0x780: 0x2008,\n\t            0x880: 0x200008,\n\t            0x980: 0x2000,\n\t            0xa80: 0x10002008,\n\t            0xb80: 0x10200008,\n\t            0xc80: 0x0,\n\t            0xd80: 0x10202000,\n\t            0xe80: 0x202000,\n\t            0xf80: 0x10000000,\n\t            0x1000: 0x10002000,\n\t            0x1100: 0x10200008,\n\t            0x1200: 0x10202008,\n\t            0x1300: 0x2008,\n\t            0x1400: 0x200000,\n\t            0x1500: 0x10000000,\n\t            0x1600: 0x10000008,\n\t            0x1700: 0x202000,\n\t            0x1800: 0x202008,\n\t            0x1900: 0x0,\n\t            0x1a00: 0x8,\n\t            0x1b00: 0x10200000,\n\t            0x1c00: 0x2000,\n\t            0x1d00: 0x10002008,\n\t            0x1e00: 0x10202000,\n\t            0x1f00: 0x200008,\n\t            0x1080: 0x8,\n\t            0x1180: 0x202000,\n\t            0x1280: 0x200000,\n\t            0x1380: 0x10000008,\n\t            0x1480: 0x10002000,\n\t            0x1580: 0x2008,\n\t            0x1680: 0x10202008,\n\t            0x1780: 0x10200000,\n\t            0x1880: 0x10202000,\n\t            0x1980: 0x10200008,\n\t            0x1a80: 0x2000,\n\t            0x1b80: 0x202008,\n\t            0x1c80: 0x200008,\n\t            0x1d80: 0x0,\n\t            0x1e80: 0x10000000,\n\t            0x1f80: 0x10002008\n\t        },\n\t        {\n\t            0x0: 0x100000,\n\t            0x10: 0x2000401,\n\t            0x20: 0x400,\n\t            0x30: 0x100401,\n\t            0x40: 0x2100401,\n\t            0x50: 0x0,\n\t            0x60: 0x1,\n\t            0x70: 0x2100001,\n\t            0x80: 0x2000400,\n\t            0x90: 0x100001,\n\t            0xa0: 0x2000001,\n\t            0xb0: 0x2100400,\n\t            0xc0: 0x2100000,\n\t            0xd0: 0x401,\n\t            0xe0: 0x100400,\n\t            0xf0: 0x2000000,\n\t            0x8: 0x2100001,\n\t            0x18: 0x0,\n\t            0x28: 0x2000401,\n\t            0x38: 0x2100400,\n\t            0x48: 0x100000,\n\t            0x58: 0x2000001,\n\t            0x68: 0x2000000,\n\t            0x78: 0x401,\n\t            0x88: 0x100401,\n\t            0x98: 0x2000400,\n\t            0xa8: 0x2100000,\n\t            0xb8: 0x100001,\n\t            0xc8: 0x400,\n\t            0xd8: 0x2100401,\n\t            0xe8: 0x1,\n\t            0xf8: 0x100400,\n\t            0x100: 0x2000000,\n\t            0x110: 0x100000,\n\t            0x120: 0x2000401,\n\t            0x130: 0x2100001,\n\t            0x140: 0x100001,\n\t            0x150: 0x2000400,\n\t            0x160: 0x2100400,\n\t            0x170: 0x100401,\n\t            0x180: 0x401,\n\t            0x190: 0x2100401,\n\t            0x1a0: 0x100400,\n\t            0x1b0: 0x1,\n\t            0x1c0: 0x0,\n\t            0x1d0: 0x2100000,\n\t            0x1e0: 0x2000001,\n\t            0x1f0: 0x400,\n\t            0x108: 0x100400,\n\t            0x118: 0x2000401,\n\t            0x128: 0x2100001,\n\t            0x138: 0x1,\n\t            0x148: 0x2000000,\n\t            0x158: 0x100000,\n\t            0x168: 0x401,\n\t            0x178: 0x2100400,\n\t            0x188: 0x2000001,\n\t            0x198: 0x2100000,\n\t            0x1a8: 0x0,\n\t            0x1b8: 0x2100401,\n\t            0x1c8: 0x100401,\n\t            0x1d8: 0x400,\n\t            0x1e8: 0x2000400,\n\t            0x1f8: 0x100001\n\t        },\n\t        {\n\t            0x0: 0x8000820,\n\t            0x1: 0x20000,\n\t            0x2: 0x8000000,\n\t            0x3: 0x20,\n\t            0x4: 0x20020,\n\t            0x5: 0x8020820,\n\t            0x6: 0x8020800,\n\t            0x7: 0x800,\n\t            0x8: 0x8020000,\n\t            0x9: 0x8000800,\n\t            0xa: 0x20800,\n\t            0xb: 0x8020020,\n\t            0xc: 0x820,\n\t            0xd: 0x0,\n\t            0xe: 0x8000020,\n\t            0xf: 0x20820,\n\t            0x80000000: 0x800,\n\t            0x80000001: 0x8020820,\n\t            0x80000002: 0x8000820,\n\t            0x80000003: 0x8000000,\n\t            0x80000004: 0x8020000,\n\t            0x80000005: 0x20800,\n\t            0x80000006: 0x20820,\n\t            0x80000007: 0x20,\n\t            0x80000008: 0x8000020,\n\t            0x80000009: 0x820,\n\t            0x8000000a: 0x20020,\n\t            0x8000000b: 0x8020800,\n\t            0x8000000c: 0x0,\n\t            0x8000000d: 0x8020020,\n\t            0x8000000e: 0x8000800,\n\t            0x8000000f: 0x20000,\n\t            0x10: 0x20820,\n\t            0x11: 0x8020800,\n\t            0x12: 0x20,\n\t            0x13: 0x800,\n\t            0x14: 0x8000800,\n\t            0x15: 0x8000020,\n\t            0x16: 0x8020020,\n\t            0x17: 0x20000,\n\t            0x18: 0x0,\n\t            0x19: 0x20020,\n\t            0x1a: 0x8020000,\n\t            0x1b: 0x8000820,\n\t            0x1c: 0x8020820,\n\t            0x1d: 0x20800,\n\t            0x1e: 0x820,\n\t            0x1f: 0x8000000,\n\t            0x80000010: 0x20000,\n\t            0x80000011: 0x800,\n\t            0x80000012: 0x8020020,\n\t            0x80000013: 0x20820,\n\t            0x80000014: 0x20,\n\t            0x80000015: 0x8020000,\n\t            0x80000016: 0x8000000,\n\t            0x80000017: 0x8000820,\n\t            0x80000018: 0x8020820,\n\t            0x80000019: 0x8000020,\n\t            0x8000001a: 0x8000800,\n\t            0x8000001b: 0x0,\n\t            0x8000001c: 0x20800,\n\t            0x8000001d: 0x820,\n\t            0x8000001e: 0x20020,\n\t            0x8000001f: 0x8020800\n\t        }\n\t    ];\n\n\t    // Masks that select the SBOX input\n\t    var SBOX_MASK = [\n\t        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n\t        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n\t    ];\n\n\t    /**\n\t     * DES block cipher algorithm.\n\t     */\n\t    var DES = C_algo.DES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\n\t            // Select 56 bits according to PC1\n\t            var keyBits = [];\n\t            for (var i = 0; i < 56; i++) {\n\t                var keyBitPos = PC1[i] - 1;\n\t                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n\t            }\n\n\t            // Assemble 16 subkeys\n\t            var subKeys = this._subKeys = [];\n\t            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n\t                // Create subkey\n\t                var subKey = subKeys[nSubKey] = [];\n\n\t                // Shortcut\n\t                var bitShift = BIT_SHIFTS[nSubKey];\n\n\t                // Select 48 bits according to PC2\n\t                for (var i = 0; i < 24; i++) {\n\t                    // Select from the left 28 key bits\n\t                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n\t                    // Select from the right 28 key bits\n\t                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n\t                }\n\n\t                // Since each subkey is applied to an expanded 32-bit input,\n\t                // the subkey can be broken into 8 values scaled to 32-bits,\n\t                // which allows the key to be used without expansion\n\t                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n\t                for (var i = 1; i < 7; i++) {\n\t                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n\t                }\n\t                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n\t            }\n\n\t            // Compute inverse subkeys\n\t            var invSubKeys = this._invSubKeys = [];\n\t            for (var i = 0; i < 16; i++) {\n\t                invSubKeys[i] = subKeys[15 - i];\n\t            }\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._subKeys);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._doCryptBlock(M, offset, this._invSubKeys);\n\t        },\n\n\t        _doCryptBlock: function (M, offset, subKeys) {\n\t            // Get input\n\t            this._lBlock = M[offset];\n\t            this._rBlock = M[offset + 1];\n\n\t            // Initial permutation\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeLR.call(this, 1,  0x55555555);\n\n\t            // Rounds\n\t            for (var round = 0; round < 16; round++) {\n\t                // Shortcuts\n\t                var subKey = subKeys[round];\n\t                var lBlock = this._lBlock;\n\t                var rBlock = this._rBlock;\n\n\t                // Feistel function\n\t                var f = 0;\n\t                for (var i = 0; i < 8; i++) {\n\t                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n\t                }\n\t                this._lBlock = rBlock;\n\t                this._rBlock = lBlock ^ f;\n\t            }\n\n\t            // Undo swap from last round\n\t            var t = this._lBlock;\n\t            this._lBlock = this._rBlock;\n\t            this._rBlock = t;\n\n\t            // Final permutation\n\t            exchangeLR.call(this, 1,  0x55555555);\n\t            exchangeRL.call(this, 8,  0x00ff00ff);\n\t            exchangeRL.call(this, 2,  0x33333333);\n\t            exchangeLR.call(this, 16, 0x0000ffff);\n\t            exchangeLR.call(this, 4,  0x0f0f0f0f);\n\n\t            // Set output\n\t            M[offset] = this._lBlock;\n\t            M[offset + 1] = this._rBlock;\n\t        },\n\n\t        keySize: 64/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    // Swap bits across the left and right words\n\t    function exchangeLR(offset, mask) {\n\t        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n\t        this._rBlock ^= t;\n\t        this._lBlock ^= t << offset;\n\t    }\n\n\t    function exchangeRL(offset, mask) {\n\t        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n\t        this._lBlock ^= t;\n\t        this._rBlock ^= t << offset;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.DES = BlockCipher._createHelper(DES);\n\n\t    /**\n\t     * Triple-DES block cipher algorithm.\n\t     */\n\t    var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\n\t            // Create DES instances\n\t            this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));\n\t            this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));\n\t            this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));\n\t        },\n\n\t        encryptBlock: function (M, offset) {\n\t            this._des1.encryptBlock(M, offset);\n\t            this._des2.decryptBlock(M, offset);\n\t            this._des3.encryptBlock(M, offset);\n\t        },\n\n\t        decryptBlock: function (M, offset) {\n\t            this._des3.decryptBlock(M, offset);\n\t            this._des2.encryptBlock(M, offset);\n\t            this._des1.decryptBlock(M, offset);\n\t        },\n\n\t        keySize: 192/32,\n\n\t        ivSize: 64/32,\n\n\t        blockSize: 64/32\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.TripleDES = BlockCipher._createHelper(TripleDES);\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * RC4 stream cipher algorithm.\n\t     */\n\t    var RC4 = C_algo.RC4 = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var key = this._key;\n\t            var keyWords = key.words;\n\t            var keySigBytes = key.sigBytes;\n\n\t            // Init sbox\n\t            var S = this._S = [];\n\t            for (var i = 0; i < 256; i++) {\n\t                S[i] = i;\n\t            }\n\n\t            // Key setup\n\t            for (var i = 0, j = 0; i < 256; i++) {\n\t                var keyByteIndex = i % keySigBytes;\n\t                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n\t                j = (j + S[i] + keyByte) % 256;\n\n\t                // Swap\n\t                var t = S[i];\n\t                S[i] = S[j];\n\t                S[j] = t;\n\t            }\n\n\t            // Counters\n\t            this._i = this._j = 0;\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            M[offset] ^= generateKeystreamWord.call(this);\n\t        },\n\n\t        keySize: 256/32,\n\n\t        ivSize: 0\n\t    });\n\n\t    function generateKeystreamWord() {\n\t        // Shortcuts\n\t        var S = this._S;\n\t        var i = this._i;\n\t        var j = this._j;\n\n\t        // Generate keystream word\n\t        var keystreamWord = 0;\n\t        for (var n = 0; n < 4; n++) {\n\t            i = (i + 1) % 256;\n\t            j = (j + S[i]) % 256;\n\n\t            // Swap\n\t            var t = S[i];\n\t            S[i] = S[j];\n\t            S[j] = t;\n\n\t            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n\t        }\n\n\t        // Update counters\n\t        this._i = i;\n\t        this._j = j;\n\n\t        return keystreamWord;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4 = StreamCipher._createHelper(RC4);\n\n\t    /**\n\t     * Modified RC4 stream cipher algorithm.\n\t     */\n\t    var RC4Drop = C_algo.RC4Drop = RC4.extend({\n\t        /**\n\t         * Configuration options.\n\t         *\n\t         * @property {number} drop The number of keystream words to drop. Default 192\n\t         */\n\t        cfg: RC4.cfg.extend({\n\t            drop: 192\n\t        }),\n\n\t        _doReset: function () {\n\t            RC4._doReset.call(this);\n\n\t            // Drop\n\t            for (var i = this.cfg.drop; i > 0; i--) {\n\t                generateKeystreamWord.call(this);\n\t            }\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n\t}());\n\n\n\t/** @preserve\n\t * Counter block mode compatible with  Dr Brian Gladman fileenc.c\n\t * derived from CryptoJS.mode.CTR\n\t * Jan Hruby jhruby.web@gmail.com\n\t */\n\tCryptoJS.mode.CTRGladman = (function () {\n\t    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n\t\tfunction incWord(word)\n\t\t{\n\t\t\tif (((word >> 24) & 0xff) === 0xff) { //overflow\n\t\t\tvar b1 = (word >> 16)&0xff;\n\t\t\tvar b2 = (word >> 8)&0xff;\n\t\t\tvar b3 = word & 0xff;\n\n\t\t\tif (b1 === 0xff) // overflow b1\n\t\t\t{\n\t\t\tb1 = 0;\n\t\t\tif (b2 === 0xff)\n\t\t\t{\n\t\t\t\tb2 = 0;\n\t\t\t\tif (b3 === 0xff)\n\t\t\t\t{\n\t\t\t\t\tb3 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t++b3;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t++b2;\n\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t++b1;\n\t\t\t}\n\n\t\t\tword = 0;\n\t\t\tword += (b1 << 16);\n\t\t\tword += (b2 << 8);\n\t\t\tword += b3;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\tword += (0x01 << 24);\n\t\t\t}\n\t\t\treturn word;\n\t\t}\n\n\t\tfunction incCounter(counter)\n\t\t{\n\t\t\tif ((counter[0] = incWord(counter[0])) === 0)\n\t\t\t{\n\t\t\t\t// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8\n\t\t\t\tcounter[1] = incWord(counter[1]);\n\t\t\t}\n\t\t\treturn counter;\n\t\t}\n\n\t    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\n\t\t\t\tincCounter(counter);\n\n\t\t\t\tvar keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTRGladman.Decryptor = Encryptor;\n\n\t    return CTRGladman;\n\t}());\n\n\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm\n\t     */\n\t    var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Swap endian\n\t            for (var i = 0; i < 4; i++) {\n\t                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);\n\t            }\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.Rabbit = StreamCipher._createHelper(Rabbit);\n\t}());\n\n\n\t/**\n\t * Counter block mode.\n\t */\n\tCryptoJS.mode.CTR = (function () {\n\t    var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n\t    var Encryptor = CTR.Encryptor = CTR.extend({\n\t        processBlock: function (words, offset) {\n\t            // Shortcuts\n\t            var cipher = this._cipher\n\t            var blockSize = cipher.blockSize;\n\t            var iv = this._iv;\n\t            var counter = this._counter;\n\n\t            // Generate keystream\n\t            if (iv) {\n\t                counter = this._counter = iv.slice(0);\n\n\t                // Remove IV for subsequent blocks\n\t                this._iv = undefined;\n\t            }\n\t            var keystream = counter.slice(0);\n\t            cipher.encryptBlock(keystream, 0);\n\n\t            // Increment counter\n\t            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n\t            // Encrypt\n\t            for (var i = 0; i < blockSize; i++) {\n\t                words[offset + i] ^= keystream[i];\n\t            }\n\t        }\n\t    });\n\n\t    CTR.Decryptor = Encryptor;\n\n\t    return CTR;\n\t}());\n\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var StreamCipher = C_lib.StreamCipher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable objects\n\t    var S  = [];\n\t    var C_ = [];\n\t    var G  = [];\n\n\t    /**\n\t     * Rabbit stream cipher algorithm.\n\t     *\n\t     * This is a legacy version that neglected to convert the key to little-endian.\n\t     * This error doesn't affect the cipher's security,\n\t     * but it does affect its compatibility with other implementations.\n\t     */\n\t    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n\t        _doReset: function () {\n\t            // Shortcuts\n\t            var K = this._key.words;\n\t            var iv = this.cfg.iv;\n\n\t            // Generate initial state values\n\t            var X = this._X = [\n\t                K[0], (K[3] << 16) | (K[2] >>> 16),\n\t                K[1], (K[0] << 16) | (K[3] >>> 16),\n\t                K[2], (K[1] << 16) | (K[0] >>> 16),\n\t                K[3], (K[2] << 16) | (K[1] >>> 16)\n\t            ];\n\n\t            // Generate initial counter values\n\t            var C = this._C = [\n\t                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n\t                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n\t                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n\t                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n\t            ];\n\n\t            // Carry bit\n\t            this._b = 0;\n\n\t            // Iterate the system four times\n\t            for (var i = 0; i < 4; i++) {\n\t                nextState.call(this);\n\t            }\n\n\t            // Modify the counters\n\t            for (var i = 0; i < 8; i++) {\n\t                C[i] ^= X[(i + 4) & 7];\n\t            }\n\n\t            // IV setup\n\t            if (iv) {\n\t                // Shortcuts\n\t                var IV = iv.words;\n\t                var IV_0 = IV[0];\n\t                var IV_1 = IV[1];\n\n\t                // Generate four subvectors\n\t                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n\t                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n\t                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n\t                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n\t                // Modify counter values\n\t                C[0] ^= i0;\n\t                C[1] ^= i1;\n\t                C[2] ^= i2;\n\t                C[3] ^= i3;\n\t                C[4] ^= i0;\n\t                C[5] ^= i1;\n\t                C[6] ^= i2;\n\t                C[7] ^= i3;\n\n\t                // Iterate the system four times\n\t                for (var i = 0; i < 4; i++) {\n\t                    nextState.call(this);\n\t                }\n\t            }\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var X = this._X;\n\n\t            // Iterate the system\n\t            nextState.call(this);\n\n\t            // Generate four keystream words\n\t            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n\t            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n\t            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n\t            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n\t            for (var i = 0; i < 4; i++) {\n\t                // Swap endian\n\t                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n\t                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n\t                // Encrypt\n\t                M[offset + i] ^= S[i];\n\t            }\n\t        },\n\n\t        blockSize: 128/32,\n\n\t        ivSize: 64/32\n\t    });\n\n\t    function nextState() {\n\t        // Shortcuts\n\t        var X = this._X;\n\t        var C = this._C;\n\n\t        // Save old counter values\n\t        for (var i = 0; i < 8; i++) {\n\t            C_[i] = C[i];\n\t        }\n\n\t        // Calculate new counter values\n\t        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n\t        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n\t        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n\t        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n\t        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n\t        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n\t        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n\t        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n\t        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n\t        // Calculate the g-values\n\t        for (var i = 0; i < 8; i++) {\n\t            var gx = X[i] + C[i];\n\n\t            // Construct high and low argument for squaring\n\t            var ga = gx & 0xffff;\n\t            var gb = gx >>> 16;\n\n\t            // Calculate high and low result of squaring\n\t            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n\t            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n\t            // High XOR low\n\t            G[i] = gh ^ gl;\n\t        }\n\n\t        // Calculate new state values\n\t        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n\t        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n\t        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n\t        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n\t        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n\t        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n\t        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n\t        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n\t    }\n\n\t    /**\n\t     * Shortcut functions to the cipher's object interface.\n\t     *\n\t     * @example\n\t     *\n\t     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n\t     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n\t     */\n\t    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n\t}());\n\n\n\t/**\n\t * Zero padding strategy.\n\t */\n\tCryptoJS.pad.ZeroPadding = {\n\t    pad: function (data, blockSize) {\n\t        // Shortcut\n\t        var blockSizeBytes = blockSize * 4;\n\n\t        // Pad\n\t        data.clamp();\n\t        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n\t    },\n\n\t    unpad: function (data) {\n\t        // Shortcut\n\t        var dataWords = data.words;\n\n\t        // Unpad\n\t        var i = data.sigBytes - 1;\n\t        while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n\t            i--;\n\t        }\n\t        data.sigBytes = i + 1;\n\t    }\n\t};\n\n\n\nfunction aes(val) {\n    var k = CryptoJS.enc.Utf8.parse('1234567890abcDEF');\n    var iv = CryptoJS.enc.Utf8.parse('1234567890abcDEF');\n    return CryptoJS.AES.encrypt(val, k, {iv: iv, mode:CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding}).toString();\n}"
  },
  {
    "path": "其他实战/【GitHub】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【GitHub】自动登录/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-11  Python: 3.7\n\"\"\"\n1. get login html token\n2. login\n\"\"\"\n\nimport requests\nfrom lxml import etree\n\n\nclass Login(object):\n    def __init__(self, username, password):\n\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',\n            'Referer': 'https://github.com/',\n            'Host': 'github.com'\n        }\n\n        self.login_url = 'https://github.com/login'\n        self.post_url = 'https://github.com/session'\n        self.session = requests.Session()\n\n        self.username = username\n        self.password = password\n\n    def login_GitHub(self):\n        \"\"\"\n        模拟登陆\n        :return:\n        \"\"\"\n\n        post_data = {\n            'commit': 'Sign in',\n            'utf8': '✓',\n            'authenticity_token': self.get_token(),\n            'login': self.username,\n            'password': self.password\n        }\n\n        response = self.session.post(self.post_url, data=post_data, headers=self.headers)\n\n        if response.status_code == 200:\n            html = etree.HTML(response.content.decode())\n            if html.xpath('/html/body/div[1]/header/div[7]/details/summary'):\n                pro_list = html.xpath('//ul[@class=\"list-style-none\"]/li/div/a/span[2]/text()')\n                print(\"登录成功！正在拉取你的所有项目..\")\n                print(pro_list)\n\n            else:\n                print('账号或密码错误')\n        else:\n            print(\"登录失败！\")\n\n    def get_token(self):\n        \"\"\"\n        获取token\n        :return:\n        \"\"\"\n\n        response = self.session.get(self.login_url, headers=self.headers)\n        html = etree.HTML(response.content.decode())\n\n        token = html.xpath('//input[@name=\"authenticity_token\"]/@value')[0]\n\n        return token\n\n\nif __name__ == '__main__':\n    user = input('请输入您的账号： ')\n    key = input('请输入您的密码： ')\n\n    login = Login(user, key)\n    login.login_GitHub()\n"
  },
  {
    "path": "其他实战/【Glidedsky】自动登陆/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-25  Python: 3.7\n\nimport requests\nimport re\nimport json\n\n\nclass Gli:\n    \"\"\"\n    自动登陆 Glidedsky\n    http://www.glidedsky.com/login\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.url = 'http://www.glidedsky.com/login'\n        self.session = requests.session()\n        self.headers = {\n            'Host': 'www.glidedsky.com',\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',\n        }\n\n    def get_token(self):\n        response = self.session.get(self.url, headers=self.headers)\n        _token = re.search(r'name=\"csrf-token\" content=\"(.*?)\">', response.text).group(1)\n        return _token\n\n    def login(self):\n        data = {'_token': self.get_token(), 'email': self.user, 'password': self.pwd}\n        self.session.post(self.url, data=data)\n        # print(self.session.cookies)\n        cookies = requests.utils.dict_from_cookiejar(self.session.cookies)  # cookies 输出\n        with open('toolkit/cookies.json', 'w', encoding='utf-8') as f:\n            f.write(json.dumps(cookies))\n        # print(cookies)\n\n\nif __name__ == '__main__':\n    username = input('请输入用户名')\n    password = input('请输入密码')\n    g = Gli(username, password)\n    g.login()\n"
  },
  {
    "path": "其他实战/【Python加密库】Demo/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-11  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【Python加密库】Demo/encryption.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-10  Python: 3.7\n\nimport base64\nimport rsa\nimport hashlib\nimport hmac\n\nfrom Crypto.Cipher import AES\nfrom pyDes import des, CBC, PAD_PKCS5\nfrom Crypto.Cipher import DES3\n\n\nclass UseAES:\n    \"\"\"\n    AES\n    除了MODE_SIV模式key长度为：32, 48, or 64,\n    其余key长度为16, 24 or 32\n    详细见AES内部文档\n    CBC模式传入iv参数\n    本例使用常用的ECB模式\n    \"\"\"\n\n    def __init__(self, key):\n        if len(key) > 32:\n            key = key[:32]\n        self.key = self.to_16(key)\n\n    @staticmethod\n    def to_16(key):\n        \"\"\"\n        转为16倍数的bytes数据\n        :param key:\n        :return:\n        \"\"\"\n        key = bytes(key, encoding=\"utf8\")\n        while len(key) % 16 != 0:\n            key += b'\\0'\n        return key  # 返回bytes\n\n    def aes(self):\n        return AES.new(self.key, AES.MODE_ECB)  # 初始化加密器\n\n    def encrypt(self, text):\n        aes = self.aes()\n        return str(base64.encodebytes(aes.encrypt(self.to_16(text))),\n                   encoding='utf8').replace('\\n', '')  # 加密\n\n    def decode_bytes(self, text):\n        aes = self.aes()\n        return str(aes.decrypt(base64.decodebytes(bytes(\n            text, encoding='utf8'))).rstrip(b'\\0').decode(\"utf8\"))  # 解密\n\n\nclass UseRSA:\n    \"\"\"\n    生成密钥可保存.pem格式文件\n    1024位的证书，加密时最大支持117个字节，解密时为128；\n    2048位的证书，加密时最大支持245个字节，解密时为256。\n    加密大文件时需要先用AES或者DES加密，再用RSA加密密钥，详细见文档\n    文档:https://stuvel.eu/files/python-rsa-doc/usage.html#generating-keys\n    \"\"\"\n\n    def __init__(self, number=1024):\n        \"\"\"\n        :param number: 公钥、私钥\n        \"\"\"\n        self.pubkey, self.private_key = rsa.newkeys(number)\n\n    def encrypt(self, _str):\n        \"\"\"\n        :param _str: str\n        :return: bytes\n        \"\"\"\n        content = _str.encode('utf-8')\n        crypto = rsa.encrypt(content, self.pubkey)\n        return crypto\n\n    def decrypt(self, text):\n        \"\"\"\n        :param text:bytes\n        :return: str\n        \"\"\"\n        content = rsa.decrypt(text, self.private_key)\n        con = content.decode('utf-8')\n        return con\n\n    @staticmethod\n    def save_pem(path_name, text):\n        \"\"\"\n        :param path_name: 保存路径\n        :param text: str\n        :return:bytes\n        \"\"\"\n        if \"PEM\" in path_name.upper():\n            path_name = path_name[:-4]\n        with open('{}.pem'.format(path_name), 'bw') as f:\n            f.write(text.save_pkcs1())\n\n    def read_pem(self, path_name, key_type):\n        \"\"\"\n        :param path_name: 密钥文件\n        :param key_type:类型\n        :return:\n        \"\"\"\n        if 'pubkey' in key_type:\n            self.pubkey = rsa.PublicKey.load_pkcs1(path_name)\n        else:\n            self.private_key = rsa.PublicKey.load_pkcs1(path_name)\n        return True\n\n    def sign(self, message, pr_key=None, hash_method='SHA-1'):\n        \"\"\"\n        生成明文的哈希签名以便还原后对照\n        :param message: str\n        :param pr_key:\n        :param hash_method: 哈希的模式\n        :return:\n        \"\"\"\n        if not pr_key:\n            pr_key = self.private_key\n        return rsa.sign(message.encode(), pr_key, hash_method)\n\n    def check_sign(self, mess, result, pubkey=None):\n        \"\"\"\n        验证签名：传入解密后明文、签名、公钥，验证成功返回哈希方法，失败则报错\n        :param mess: str\n        :param result: bytes\n        :param pubkey:\n        :return: str\n        \"\"\"\n        if None == pubkey:\n            pubkey = self.private_key\n        try:\n            result = rsa.verify(mess, result, pubkey)\n            return result\n        except:\n            return False\n\n\nclass UseDES:\n    \"\"\"\n    des(key,[mode], [IV], [pad], [pad mode])\n    key:必须正好8字节\n    mode（模式）：ECB、CBC\n    iv:CBC模式中必须提供长8字节\n    pad:填充字符\n    加密填充模式PAD_NORMAL or PAD_PKCS5\n    \"\"\"\n\n    def __init__(self, key, iv):\n        if not isinstance(key, bytes):\n            key = bytes(key, encoding=\"utf8\")\n        if not isinstance(iv, bytes):\n            iv = bytes(iv, encoding=\"utf8\")\n        self.key = key\n        self.iv = iv\n\n    def encrypt(self, text):\n        \"\"\"\n        DES 加密\n        :param text: 原始字符串\n        :return: 加密后字符串，bytes\n        \"\"\"\n        if not isinstance(text, bytes):\n            text = bytes(text, \"utf-8\")\n        secret_key = self.key\n        iv = self.iv\n        k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)\n        en = k.encrypt(text, padmode=PAD_PKCS5)\n        return en\n\n    def des_crypt(self, text):\n        \"\"\"\n        DES 解密\n        :param text: 加密后的字符串，bytes\n        :return:  解密后的字符串\n        \"\"\"\n        secret_key = self.key\n        iv = self.iv\n        k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)\n        de = k.decrypt(text, padmode=PAD_PKCS5)\n        return de.decode()\n\n\nclass UseDES3:\n    \"\"\"\n    new(key, mode, *args, **kwargs)\n    key:必须8bytes倍数介于16-24\n    mode：\n    iv:初始化向量适用于MODE_CBC、MODE_CFB、MODE_OFB、MODE_OPENPGP，4种模式\n        ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB``长度为8bytes\n        ```MODE_OPENPGP```加密时8bytes解密时10bytes\n        未提供默认随机生成\n    nonce：仅在 ``MODE_EAX`` and ``MODE_CTR``模式中使用\n            ``MODE_EAX``建议16bytes\n            ``MODE_CTR``建议[0, 7]长度\n            未提供则随机生成\n    segment_size：分段大小，仅在 ``MODE_CFB``模式中使用，长度为8倍数，未指定则默认为8\n    mac_len： 适用``MODE_EAX``模式，身份验证标记的长度（字节），它不能超过8（默认值）\n    initial_value：适用```MODE_CTR```，计数器的初始值计数器块。默认为**0**。\n    \"\"\"\n\n    def __init__(self, key):\n        self.key = key\n        self.mode = DES3.MODE_ECB\n\n    def encrypt(self, text):\n        \"\"\"\n        传入明文\n        :param text:bytes类型，长度是KEY的倍数\n        :return:\n        \"\"\"\n        if not isinstance(text, bytes):\n            text = bytes(text, 'utf-8')\n        x = len(text) % 8\n        text = text + b'\\0' * x\n        de = DES3.new(self.key, self.mode)\n        cipher_text = de.encrypt(text)\n        return cipher_text\n\n    def decrypt(self, text):\n        de = DES3.new(self.key, self.mode)\n        plain_text = de.decrypt(text)\n        st = str(plain_text.decode(\"utf-8\")).rstrip('\\0')\n        return st\n\n\ndef use_md5(test):\n    if not isinstance(test, bytes):\n        test = bytes(test, 'utf-8')\n    m = hashlib.md5()\n    m.update(test)\n    return m.hexdigest()\n\n\ndef use_hmac(key, text):\n    if not isinstance(key, bytes):\n        key = bytes(key, 'utf-8')\n    if not isinstance(text, bytes):\n        text = bytes(text, 'utf-8')\n    h = hmac.new(key, text, digestmod='MD5')\n    return h.hexdigest()\n\n\ndef use_sha(text):\n    if not isinstance(text, bytes):\n        text = bytes(text, 'utf-8')\n    sha = hashlib.sha1(text)\n    encrypts = sha.hexdigest()\n    return encrypts\n\n\nif __name__ == '__main__':\n    # AES\n    aes_test = UseAES(\"TestKey\")\n    a = aes_test.encrypt(\"AES加密\")\n    b = aes_test.decode_bytes(a)\n    print(b)\n\n    # RSA\n    rsa_test = UseRSA()\n    a = rsa_test.encrypt(\"RSA加密\")\n    b = rsa_test.decrypt(a)\n    print(b)\n\n    # DES\n    des_test = UseDES(b\"12345678\", b\"12345678\")\n    a = des_test.encrypt(\"DES加密\")\n    b = des_test.des_crypt(a)\n    print(b)\n\n    # DES3\n    des3_test = UseDES3(b\"123456789qazxswe\")\n    a = des3_test.encrypt(\"测试加密\")\n    b = des3_test.decrypt(a)\n    print(b)\n\n    # MD5\n    md5_test = use_md5(\"MD5\")\n    print(md5_test)\n\n    # HMAC\n    hmac_test = use_hmac(\"123456\", \"测试\")\n    print(hmac_test)\n\n    # SHA\n    sha_test = use_sha(\"SHA\")\n    print(sha_test)\n"
  },
  {
    "path": "其他实战/【TCL金融】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【TCL金融】自动登录/auto_login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-10  Python: 3.7\n\nimport requests\nimport execjs.runtime_names\n\n\nclass SpiderLogin:\n    \"\"\"\n    TCL 个人金融\n    https://weixin.tjinsuo.com/#login/mine\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.js = None\n        self.url = 'https://weixin.tjinsuo.com/service/user/login'\n        self.load_js()\n        print('引擎', execjs.get().name)\n\n    def load_js(self):\n        \"\"\"js 调用\n        \"\"\"\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def auto_login(self):\n        \"\"\"登陆\n        \"\"\"\n        ret = self.js.call('make', self.pwd)\n        rand_key, word = ret.split('||')\n        print(rand_key, word)\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',\n            'Host': 'weixin.tjinsuo.com',\n            'terminalType': 'BEST_WX',\n            'Accept': 'application/json'\n        }\n        data = 'mobile={user}&password={pwd}&cipherkey=&message=&randKey={rand_key}'.format(user=self.user,\n                                                                                            pwd=word,\n                                                                                            rand_key=rand_key)\n\n        response = requests.post(self.url, headers=headers, data=data)\n        print(response.text)\n        print(response)\n\n\nif __name__ == '__main__':\n    username = input('请输入账号')\n    password = input('密码')\n    wcb = SpiderLogin(username, password)\n    wcb.auto_login()\n"
  },
  {
    "path": "其他实战/【TCL金融】自动登录/encryp.js",
    "content": "t = {}\n\"use strict\";\nvar s = \"\";\nvar a = 1;\nt.generateKey = \"\";\nt.password = \"\";\nt.getUUID = function () {\n    var e = \"0123456789abcdef\".split(\"\");\n    var t = [],\n        s = Math.random,\n        a;\n    t[8] = t[13] = t[18] = t[23] = \"-\";\n    t[14] = \"4\";\n    for (var i = 0; i < 36; i++) {\n        if (!t[i]) {\n            a = 0 | s() * 16;\n            t[i] = e[i == 19 ? a & 3 | 8 : a & 15]\n        }\n    }\n    return t.join(\"\")\n};\nt.getRandomStringFromUUID = function (e) {\n    var s = t.getUUID();\n    while (s.length < e) {\n        s = s + \"--\" + t.getUUID()\n    }\n    return s.substring(0, e)\n};\nt.getRandomString = function (e) {\n    var t = \"\";\n    var s = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/-_=\";\n    for (var a = 0; a < e; a++) {\n        t += s.charAt(Math.floor(Math.random() * s.length))\n    }\n    return t\n};\nt.readFromFile = function (e) {\n    var t = \"\";\n    var s = new ActiveXObject(\"Scripting.FileSystemObject\");\n    var i = s.OpenTextFile(e, a, true);\n    while (!i.AtEndOfStream) {\n        var n = i.ReadLine();\n        if (t == \"\") {\n            t = n\n        } else {\n            t += \"\\n\" + n\n        }\n    }\n    i.Close();\n    return t\n};\nt.saveToFile = function (e, t) {\n    var s = new ActiveXObject(\"Scripting.FileSystemObject\");\n    var a = s.CreateTextFile(e, true, true);\n    var i = t.split(\"\\n\");\n    for (var n = 0; n < i.length; n++) {\n        a.WriteLine(i[n])\n    }\n    a.Close();\n    alert(e + \" saved!\")\n};\nt.do_generate = function () {\n    var e = t.getRandomString(24);\n    t.generateKey = encodeURI(encodeURI(e));\n    return t.generateKey\n};\nt.stringToHex = function (e) {\n    var t, s, a = [];\n    for (var i = 0; i < e.length; i++) {\n        t = e.charCodeAt(i);\n        s = [];\n        do {\n            s.push(t);\n            t = t >> 8\n        } while (t);\n        a = a.concat(s.reverse())\n    }\n    var n = \"\";\n    for (var i = 0; i < a.length; i++) {\n        n += a[i].toString(16)\n    }\n    return n\n};\nt.do_load_key = function () {\n    var e = showModalDialog(\"selectFile.htm\", \"Select \" + document.cpccrypto.algorithm.value + \" Key\",\n        \"width:400px;height:400px;resizeable:yes;\");\n    var s = t.readFromFile(e);\n    document.cpccrypto.cipherkey.value = s\n};\nt.do_save_key = function () {\n    if (s == \"\") {\n        alert(\"Currently no \" + document.cpccrypto.algorithm.value + \" Key to save!\\n\" + \"Please generate first!\");\n        return\n    }\n    var e = showModalDialog(\"selectFolder.htm\", \"Select \" + document.cpccrypto.algorithm.value + \" Key Save Folder\",\n        \"width:400px;height:400px;resizeable:yes;\");\n    var a = e + document.cpccrypto.algorithm.value + \".key\";\n    t.saveToFile(a, symetricKey)\n};\nt.do_load_plain = function () {\n    var e = showModalDialog(\"selectFile.htm\", \"\", \"width:400px;height:400px;resizeable:yes;\");\n    var s = t.readFromFile(e);\n    document.cpccrypto.plaintext.value = s\n};\nt.suffix_8Blank = function (e) {\n    for (var t = 0; t < 8; t++) {\n        e += \" \"\n    }\n    return e\n};\nt.checkCipherKey = function () {\n    return true\n};\nt.do_encrypt = function () {\n    if (t.checkCipherKey() == false) {\n        return\n    }\n    return t.stringToHexForDES(t.des(t.generateKey, t.suffix_8Blank(t.password), 1, 0))\n};\nt.do_load_cipher = function () {\n    var e = showModalDialog(\"selectFile.htm\", \"\", \"width:400px;height:400px;resizeable:yes;\");\n    var s = t.readFromFile(e);\n    document.cpccrypto.ciphertext.value = s\n};\nt.fix_des_result = function (e) {\n    var t;\n    for (t = e.length - 1; t >= 0; t--) {\n        if (e.charCodeAt(t) > 16 && e.charCodeAt(t) != 32) {\n            break\n        }\n    }\n    return e.substring(0, t + 1)\n};\nt.do_decrypt = function () {\n    if (t.checkCipherKey() == false) {\n        return\n    }\n    return t.fix_des_result(t.des(t.generateKey, t.hexToStringForDES(t.encodeKey), 0, 0))\n};\nt.des = function (e, s, a, i, n, r) {\n    var o = new Array(16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024,\n        16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540,\n        16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216,\n        1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220,\n        1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756);\n    var l = new Array(-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -\n            2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, -\n            2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072,\n        32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880,\n        32, -2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848,\n        -2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344);\n    var p = new Array(520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736,\n        131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592,\n        134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072,\n        134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072,\n        134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808,\n        131584);\n    var d = new Array(8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0,\n        8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928,\n        8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321,\n        8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608,\n        8192, 8396928);\n    var u = new Array(256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288,\n        33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0,\n        1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432,\n        1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688,\n        1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256,\n        1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976,\n        1073742080);\n    var c = new Array(536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704,\n        4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16,\n        541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232,\n        4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616,\n        4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312,\n        0, 541081600, 536870912, 4194320, 536887312);\n    var h = new Array(2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0,\n        67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064,\n        2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914,\n        67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050,\n        67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048,\n        2097154);\n    var f = new Array(268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600,\n        268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664,\n        268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64,\n        268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0,\n        268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208,\n        268435456, 268701696);\n    var m = t.des_createKeys(e);\n    var v = 0,\n        g, y, b, w, _, x, T, L, C;\n    var S, I, P, k;\n    var A, M;\n    var D = s.length;\n    var R = 0;\n    var N = m.length == 32 ? 3 : 9;\n    if (N == 3) {\n        C = a ? new Array(0, 32, 2) : new Array(30, -2, -2)\n    } else {\n        C = a ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(94, 62, -2, 32, 64, 2, 30, -2, -2)\n    }\n    if (r == 2)\n        s += \"        \";\n    else if (r == 1) {\n        b = 8 - D % 8;\n        s += String.fromCharCode(b, b, b, b, b, b, b, b);\n        if (b == 8)\n            D += 8\n    } else if (!r)\n        s += \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\";\n    var E = \"\";\n    var z = \"\";\n    if (i == 1) {\n        S = n.charCodeAt(v++) << 24 | n.charCodeAt(v++) << 16 | n.charCodeAt(v++) << 8 | n.charCodeAt(v++);\n        P = n.charCodeAt(v++) << 24 | n.charCodeAt(v++) << 16 | n.charCodeAt(v++) << 8 | n.charCodeAt(v++);\n        v = 0\n    }\n    while (v < D) {\n        T = s.charCodeAt(v++) << 24 | s.charCodeAt(v++) << 16 | s.charCodeAt(v++) << 8 | s.charCodeAt(v++);\n        L = s.charCodeAt(v++) << 24 | s.charCodeAt(v++) << 16 | s.charCodeAt(v++) << 8 | s.charCodeAt(v++);\n        if (i == 1) {\n            if (a) {\n                T ^= S;\n                L ^= P\n            } else {\n                I = S;\n                k = P;\n                S = T;\n                P = L\n            }\n        }\n        b = (T >>> 4 ^ L) & 252645135;\n        L ^= b;\n        T ^= b << 4;\n        b = (T >>> 16 ^ L) & 65535;\n        L ^= b;\n        T ^= b << 16;\n        b = (L >>> 2 ^ T) & 858993459;\n        T ^= b;\n        L ^= b << 2;\n        b = (L >>> 8 ^ T) & 16711935;\n        T ^= b;\n        L ^= b << 8;\n        b = (T >>> 1 ^ L) & 1431655765;\n        L ^= b;\n        T ^= b << 1;\n        T = T << 1 | T >>> 31;\n        L = L << 1 | L >>> 31;\n        for (y = 0; y < N; y += 3) {\n            A = C[y + 1];\n            M = C[y + 2];\n            for (g = C[y]; g != A; g += M) {\n                _ = L ^ m[g];\n                x = (L >>> 4 | L << 28) ^ m[g + 1];\n                b = T;\n                T = L;\n                L = b ^ (l[_ >>> 24 & 63] | d[_ >>> 16 & 63] | c[_ >>> 8 & 63] | f[_ & 63] | o[x >>> 24 & 63] | p[x >>> 16 & 63] |\n                    u[x >>> 8 & 63] | h[x & 63])\n            }\n            b = T;\n            T = L;\n            L = b\n        }\n        T = T >>> 1 | T << 31;\n        L = L >>> 1 | L << 31;\n        b = (T >>> 1 ^ L) & 1431655765;\n        L ^= b;\n        T ^= b << 1;\n        b = (L >>> 8 ^ T) & 16711935;\n        T ^= b;\n        L ^= b << 8;\n        b = (L >>> 2 ^ T) & 858993459;\n\n        T ^= b;\n        L ^= b << 2;\n        b = (T >>> 16 ^ L) & 65535;\n        L ^= b;\n        T ^= b << 16;\n        b = (T >>> 4 ^ L) & 252645135;\n        L ^= b;\n        T ^= b << 4;\n        if (i == 1) {\n            if (a) {\n                S = T;\n                P = L\n            } else {\n                T ^= I;\n                L ^= k\n            }\n        }\n        z += String.fromCharCode(T >>> 24, T >>> 16 & 255, T >>> 8 & 255, T & 255, L >>> 24, L >>> 16 & 255, L >>> 8 &\n            255, L & 255);\n        R += 8;\n        if (R == 512) {\n            E += z;\n            z = \"\";\n            R = 0\n        }\n    }\n    return E + z\n};\nt.des_createKeys = function (e) {\n    var t = new Array(0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516, 536871424, 536871428,\n        66048, 66052, 536936960, 536936964),\n        s = new Array(0, 1, 1048576, 1048577, 67108864, 67108865, 68157440, 68157441, 256, 257, 1048832, 1048833,\n            67109120, 67109121, 68157696, 68157697),\n        a = new Array(0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224,\n            16779264, 16779272),\n        i = new Array(0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072, 2228224, 134348800,\n            136445952, 139264, 2236416, 134356992, 136454144),\n        n = new Array(0, 262144, 16, 262160, 0, 262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112,\n            266256),\n        r = new Array(0, 1024, 32, 1056, 0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456,\n            33554464, 33555488),\n        o = new Array(0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744,\n            2, 268435458, 524290, 268959746),\n        l = new Array(0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496, 131072, 196608, 133120, 198656,\n            537001984, 537067520, 537004032, 537069568),\n        p = new Array(0, 262144, 0, 262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434,\n            33816578, 33554434, 33816578),\n        d = new Array(0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024,\n            268436480, 1032, 268436488),\n        u = new Array(0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192, 8224, 1056768, 1056800, 1056768,\n            1056800),\n        c = new Array(0, 16777216, 512, 16777728, 2097152, 18874368, 2097664, 18874880, 67108864, 83886080, 67109376,\n            83886592, 69206016, 85983232, 69206528, 85983744),\n        h = new Array(0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840,\n            524304, 528400, 134742032, 134746128),\n        f = new Array(0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261);\n    var m = e.length > 8 ? 3 : 1;\n    var v = new Array(32 * m);\n    var g = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);\n    var y, b, w = 0,\n        _ = 0,\n        x;\n    for (var T = 0; T < m; T++) {\n        var L = e.charCodeAt(w++) << 24 | e.charCodeAt(w++) << 16 | e.charCodeAt(w++) << 8 | e.charCodeAt(w++);\n        var C = e.charCodeAt(w++) << 24 | e.charCodeAt(w++) << 16 | e.charCodeAt(w++) << 8 | e.charCodeAt(w++);\n        x = (L >>> 4 ^ C) & 252645135;\n        C ^= x;\n        L ^= x << 4;\n        x = (C >>> -16 ^ L) & 65535;\n        L ^= x;\n        C ^= x << -16;\n        x = (L >>> 2 ^ C) & 858993459;\n        C ^= x;\n        L ^= x << 2;\n        x = (C >>> -16 ^ L) & 65535;\n        L ^= x;\n        C ^= x << -16;\n        x = (L >>> 1 ^ C) & 1431655765;\n        C ^= x;\n        L ^= x << 1;\n        x = (C >>> 8 ^ L) & 16711935;\n        L ^= x;\n        C ^= x << 8;\n        x = (L >>> 1 ^ C) & 1431655765;\n        C ^= x;\n        L ^= x << 1;\n        x = L << 8 | C >>> 20 & 240;\n        L = C << 24 | C << 8 & 16711680 | C >>> 8 & 65280 | C >>> 24 & 240;\n        C = x;\n        for (var S = 0; S < g.length; S++) {\n            if (g[S]) {\n                L = L << 2 | L >>> 26;\n                C = C << 2 | C >>> 26\n            } else {\n                L = L << 1 | L >>> 27;\n                C = C << 1 | C >>> 27\n            }\n            L &= -15;\n            C &= -15;\n            y = t[L >>> 28] | s[L >>> 24 & 15] | a[L >>> 20 & 15] | i[L >>> 16 & 15] | n[L >>> 12 & 15] | r[L >>> 8 & 15] |\n                o[L >>> 4 & 15];\n            b = l[C >>> 28] | p[C >>> 24 & 15] | d[C >>> 20 & 15] | u[C >>> 16 & 15] | c[C >>> 12 & 15] | h[C >>> 8 & 15] |\n                f[C >>> 4 & 15];\n            x = (b >>> 16 ^ y) & 65535;\n            v[_++] = y ^ x;\n            v[_++] = b ^ x << 16\n        }\n    }\n    return v\n};\nt.stringToHexForDES = function (e) {\n    var t = \"0x\";\n    var s = new Array(\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\");\n    for (var a = 0; a < e.length; a++) {\n        t += s[e.charCodeAt(a) >> 4] + s[e.charCodeAt(a) & 15]\n    }\n    return t\n};\nt.hexToStringForDES = function (e) {\n    var t = \"\";\n    for (var s = e.substr(0, 2) == \"0x\" ? 2 : 0; s < e.length; s += 2) {\n        t += String.fromCharCode(parseInt(e.substr(s, 2), 16))\n    }\n    return t\n};\nt.encodeDES = function (e) {\n    if (t.generateKey != \"\") {\n        t.password = e;\n        t.encodeKey = t.do_encrypt()\n    }\n    return t.encodeKey\n};\nt.decodeDES = function () {\n    if (t.generateKey != \"\" && t.password != \"\")\n        var e = t.do_decrypt();\n    return e\n}\n\n\nfunction make(pwd) {\n    randKey = t.do_generate();\n    password = t.encodeDES(pwd);\n    return randKey + '||' + password\n}"
  },
  {
    "path": "其他实战/【steam】自动登录/execute.js",
    "content": "var navigator = {};\r\n// Copyright (c) 2005  Tom Wu\r\n\t\t\t// All Rights Reserved.\r\n\t\t\t// See \"LICENSE\" for details.\r\n\r\n\t\t\t/*\r\n\t\t\t * Copyright (c) 2003-2005  Tom Wu\r\n\t\t\t * All Rights Reserved.\r\n\t\t\t *\r\n\t\t\t * Permission is hereby granted, free of charge, to any person obtaining\r\n\t\t\t * a copy of this software and associated documentation files (the\r\n\t\t\t * \"Software\"), to deal in the Software without restriction, including\r\n\t\t\t * without limitation the rights to use, copy, modify, merge, publish,\r\n\t\t\t * distribute, sublicense, and/or sell copies of the Software, and to\r\n\t\t\t * permit persons to whom the Software is furnished to do so, subject to\r\n\t\t\t * the following conditions:\r\n\t\t\t *\r\n\t\t\t * The above copyright notice and this permission notice shall be\r\n\t\t\t * included in all copies or substantial portions of the Software.\r\n\t\t\t *\r\n\t\t\t * THE SOFTWARE IS PROVIDED \"AS-IS\" AND WITHOUT WARRANTY OF ANY KIND,\r\n\t\t\t * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\r\n\t\t\t * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\r\n\t\t\t *\r\n\t\t\t * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\r\n\t\t\t * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\r\n\t\t\t * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\r\n\t\t\t * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\r\n\t\t\t * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n\t\t\t *\r\n\t\t\t * In addition, the following condition applies:\r\n\t\t\t *\r\n\t\t\t * All redistributions must retain an intact copy of this copyright notice\r\n\t\t\t * and disclaimer.\r\n\t\t\t */\r\n\r\n\t\t\t// Basic JavaScript BN library - subset useful for RSA encryption.\r\n\r\n\t\t\t// Bits per digit\r\n\t\t\tvar dbits;\r\n\r\n\t\t\t// JavaScript engine analysis\r\n\t\t\tvar canary = 0xdeadbeefcafe;\r\n\t\t\tvar j_lm = ((canary & 0xffffff) == 0xefcafe);\r\n\r\n\t\t\t// (public) Constructor\r\n\t\t\tfunction BigInteger(a, b, c) {\r\n\t\t\t\tif (a != null)\r\n\t\t\t\t\tif (\"number\" == typeof a) this.fromNumber(a, b, c);\r\n\t\t\t\t\telse if (b == null && \"string\" != typeof a) this.fromString(a, 256);\r\n\t\t\t\telse this.fromString(a, b);\r\n\t\t\t}\r\n\r\n\t\t\t// return new, unset BigInteger\r\n\t\t\tfunction nbi() {\r\n\t\t\t\treturn new BigInteger(null);\r\n\t\t\t}\r\n\r\n\t\t\t// am: Compute w_j += (x*this_i), propagate carries,\r\n\t\t\t// c is initial carry, returns final carry.\r\n\t\t\t// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\r\n\t\t\t// We need to select the fastest one that works in this environment.\r\n\r\n\t\t\t// am1: use a single mult and divide to get the high bits,\r\n\t\t\t// max digit bits should be 26 because\r\n\t\t\t// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\r\n\t\t\tfunction am1(i, x, w, j, c, n) {\r\n\t\t\t\twhile (--n >= 0) {\r\n\t\t\t\t\tvar v = x * this[i++] + w[j] + c;\r\n\t\t\t\t\tc = Math.floor(v / 0x4000000);\r\n\t\t\t\t\tw[j++] = v & 0x3ffffff;\r\n\t\t\t\t}\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t\t// am2 avoids a big mult-and-extract completely.\r\n\t\t\t// Max digit bits should be <= 30 because we do bitwise ops\r\n\t\t\t// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\r\n\t\t\tfunction am2(i, x, w, j, c, n) {\r\n\t\t\t\tvar xl = x & 0x7fff,\r\n\t\t\t\t\txh = x >> 15;\r\n\t\t\t\twhile (--n >= 0) {\r\n\t\t\t\t\tvar l = this[i] & 0x7fff;\r\n\t\t\t\t\tvar h = this[i++] >> 15;\r\n\t\t\t\t\tvar m = xh * l + h * xl;\r\n\t\t\t\t\tl = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);\r\n\t\t\t\t\tc = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);\r\n\t\t\t\t\tw[j++] = l & 0x3fffffff;\r\n\t\t\t\t}\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t\t// Alternately, set max digit bits to 28 since some\r\n\t\t\t// browsers slow down when dealing with 32-bit numbers.\r\n\t\t\tfunction am3(i, x, w, j, c, n) {\r\n\t\t\t\tvar xl = x & 0x3fff,\r\n\t\t\t\t\txh = x >> 14;\r\n\t\t\t\twhile (--n >= 0) {\r\n\t\t\t\t\tvar l = this[i] & 0x3fff;\r\n\t\t\t\t\tvar h = this[i++] >> 14;\r\n\t\t\t\t\tvar m = xh * l + h * xl;\r\n\t\t\t\t\tl = xl * l + ((m & 0x3fff) << 14) + w[j] + c;\r\n\t\t\t\t\tc = (l >> 28) + (m >> 14) + xh * h;\r\n\t\t\t\t\tw[j++] = l & 0xfffffff;\r\n\t\t\t\t}\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t\t\tif (j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\r\n\t\t\t\tBigInteger.prototype.am = am2;\r\n\t\t\t\tdbits = 30;\r\n\t\t\t} else if (j_lm && (navigator.appName != \"Netscape\")) {\r\n\t\t\t\tBigInteger.prototype.am = am1;\r\n\t\t\t\tdbits = 26;\r\n\t\t\t} else { // Mozilla/Netscape seems to prefer am3\r\n\t\t\t\tBigInteger.prototype.am = am3;\r\n\t\t\t\tdbits = 28;\r\n\t\t\t}\r\n\r\n\t\t\tBigInteger.prototype.DB = dbits;\r\n\t\t\tBigInteger.prototype.DM = ((1 << dbits) - 1);\r\n\t\t\tBigInteger.prototype.DV = (1 << dbits);\r\n\r\n\t\t\tvar BI_FP = 52;\r\n\t\t\tBigInteger.prototype.FV = Math.pow(2, BI_FP);\r\n\t\t\tBigInteger.prototype.F1 = BI_FP - dbits;\r\n\t\t\tBigInteger.prototype.F2 = 2 * dbits - BI_FP;\r\n\r\n\t\t\t// Digit conversions\r\n\t\t\tvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\r\n\t\t\tvar BI_RC = new Array();\r\n\t\t\tvar rr, vv;\r\n\t\t\trr = \"0\".charCodeAt(0);\r\n\t\t\tfor (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\r\n\t\t\trr = \"a\".charCodeAt(0);\r\n\t\t\tfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\r\n\t\t\trr = \"A\".charCodeAt(0);\r\n\t\t\tfor (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\r\n\r\n\t\t\tfunction int2char(n) {\r\n\t\t\t\treturn BI_RM.charAt(n);\r\n\t\t\t}\r\n\r\n\t\t\tfunction intAt(s, i) {\r\n\t\t\t\tvar c = BI_RC[s.charCodeAt(i)];\r\n\t\t\t\treturn (c == null) ? -1 : c;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) copy this to r\r\n\t\t\tfunction bnpCopyTo(r) {\r\n\t\t\t\tfor (var i = this.t - 1; i >= 0; --i) r[i] = this[i];\r\n\t\t\t\tr.t = this.t;\r\n\t\t\t\tr.s = this.s;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) set from integer value x, -DV <= x < DV\r\n\t\t\tfunction bnpFromInt(x) {\r\n\t\t\t\tthis.t = 1;\r\n\t\t\t\tthis.s = (x < 0) ? -1 : 0;\r\n\t\t\t\tif (x > 0) this[0] = x;\r\n\t\t\t\telse if (x < -1) this[0] = x + DV;\r\n\t\t\t\telse this.t = 0;\r\n\t\t\t}\r\n\r\n\t\t\t// return bigint initialized to value\r\n\t\t\tfunction nbv(i) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tr.fromInt(i);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) set from string and radix\r\n\t\t\tfunction bnpFromString(s, b) {\r\n\t\t\t\tvar k;\r\n\t\t\t\tif (b == 16) k = 4;\r\n\t\t\t\telse if (b == 8) k = 3;\r\n\t\t\t\telse if (b == 256) k = 8; // byte array\r\n\t\t\t\telse if (b == 2) k = 1;\r\n\t\t\t\telse if (b == 32) k = 5;\r\n\t\t\t\telse if (b == 4) k = 2;\r\n\t\t\t\telse {\r\n\t\t\t\t\tthis.fromRadix(s, b);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.t = 0;\r\n\t\t\t\tthis.s = 0;\r\n\t\t\t\tvar i = s.length,\r\n\t\t\t\t\tmi = false,\r\n\t\t\t\t\tsh = 0;\r\n\t\t\t\twhile (--i >= 0) {\r\n\t\t\t\t\tvar x = (k == 8) ? s[i] & 0xff : intAt(s, i);\r\n\t\t\t\t\tif (x < 0) {\r\n\t\t\t\t\t\tif (s.charAt(i) == \"-\") mi = true;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmi = false;\r\n\t\t\t\t\tif (sh == 0)\r\n\t\t\t\t\t\tthis[this.t++] = x;\r\n\t\t\t\t\telse if (sh + k > this.DB) {\r\n\t\t\t\t\t\tthis[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;\r\n\t\t\t\t\t\tthis[this.t++] = (x >> (this.DB - sh));\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\tthis[this.t - 1] |= x << sh;\r\n\t\t\t\t\tsh += k;\r\n\t\t\t\t\tif (sh >= this.DB) sh -= this.DB;\r\n\t\t\t\t}\r\n\t\t\t\tif (k == 8 && (s[0] & 0x80) != 0) {\r\n\t\t\t\t\tthis.s = -1;\r\n\t\t\t\t\tif (sh > 0) this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;\r\n\t\t\t\t}\r\n\t\t\t\tthis.clamp();\r\n\t\t\t\tif (mi) BigInteger.ZERO.subTo(this, this);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) clamp off excess high words\r\n\t\t\tfunction bnpClamp() {\r\n\t\t\t\tvar c = this.s & this.DM;\r\n\t\t\t\twhile (this.t > 0 && this[this.t - 1] == c) --this.t;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return string representation in given radix\r\n\t\t\tfunction bnToString(b) {\r\n\t\t\t\tif (this.s < 0) return \"-\" + this.negate().toString(b);\r\n\t\t\t\tvar k;\r\n\t\t\t\tif (b == 16) k = 4;\r\n\t\t\t\telse if (b == 8) k = 3;\r\n\t\t\t\telse if (b == 2) k = 1;\r\n\t\t\t\telse if (b == 32) k = 5;\r\n\t\t\t\telse if (b == 4) k = 2;\r\n\t\t\t\telse return this.toRadix(b);\r\n\t\t\t\tvar km = (1 << k) - 1,\r\n\t\t\t\t\td, m = false,\r\n\t\t\t\t\tr = \"\",\r\n\t\t\t\t\ti = this.t;\r\n\t\t\t\tvar p = this.DB - (i * this.DB) % k;\r\n\t\t\t\tif (i-- > 0) {\r\n\t\t\t\t\tif (p < this.DB && (d = this[i] >> p) > 0) {\r\n\t\t\t\t\t\tm = true;\r\n\t\t\t\t\t\tr = int2char(d);\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile (i >= 0) {\r\n\t\t\t\t\t\tif (p < k) {\r\n\t\t\t\t\t\t\td = (this[i] & ((1 << p) - 1)) << (k - p);\r\n\t\t\t\t\t\t\td |= this[--i] >> (p += this.DB - k);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\td = (this[i] >> (p -= k)) & km;\r\n\t\t\t\t\t\t\tif (p <= 0) {\r\n\t\t\t\t\t\t\t\tp += this.DB;\r\n\t\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (d > 0) m = true;\r\n\t\t\t\t\t\tif (m) r += int2char(d);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn m ? r : \"0\";\r\n\t\t\t}\r\n\r\n\t\t\t// (public) -this\r\n\t\t\tfunction bnNegate() {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tBigInteger.ZERO.subTo(this, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) |this|\r\n\t\t\tfunction bnAbs() {\r\n\t\t\t\treturn (this.s < 0) ? this.negate() : this;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return + if this > a, - if this < a, 0 if equal\r\n\t\t\tfunction bnCompareTo(a) {\r\n\t\t\t\tvar r = this.s - a.s;\r\n\t\t\t\tif (r != 0) return r;\r\n\t\t\t\tvar i = this.t;\r\n\t\t\t\tr = i - a.t;\r\n\t\t\t\tif (r != 0) return r;\r\n\t\t\t\twhile (--i >= 0)\r\n\t\t\t\t\tif ((r = this[i] - a[i]) != 0) return r;\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\t// returns bit length of the integer x\r\n\t\t\tfunction nbits(x) {\r\n\t\t\t\tvar r = 1,\r\n\t\t\t\t\tt;\r\n\t\t\t\tif ((t = x >>> 16) != 0) {\r\n\t\t\t\t\tx = t;\r\n\t\t\t\t\tr += 16;\r\n\t\t\t\t}\r\n\t\t\t\tif ((t = x >> 8) != 0) {\r\n\t\t\t\t\tx = t;\r\n\t\t\t\t\tr += 8;\r\n\t\t\t\t}\r\n\t\t\t\tif ((t = x >> 4) != 0) {\r\n\t\t\t\t\tx = t;\r\n\t\t\t\t\tr += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((t = x >> 2) != 0) {\r\n\t\t\t\t\tx = t;\r\n\t\t\t\t\tr += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif ((t = x >> 1) != 0) {\r\n\t\t\t\t\tx = t;\r\n\t\t\t\t\tr += 1;\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return the number of bits in \"this\"\r\n\t\t\tfunction bnBitLength() {\r\n\t\t\t\tif (this.t <= 0) return 0;\r\n\t\t\t\treturn this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this << n*DB\r\n\t\t\tfunction bnpDLShiftTo(n, r) {\r\n\t\t\t\tvar i;\r\n\t\t\t\tfor (i = this.t - 1; i >= 0; --i) r[i + n] = this[i];\r\n\t\t\t\tfor (i = n - 1; i >= 0; --i) r[i] = 0;\r\n\t\t\t\tr.t = this.t + n;\r\n\t\t\t\tr.s = this.s;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this >> n*DB\r\n\t\t\tfunction bnpDRShiftTo(n, r) {\r\n\t\t\t\tfor (var i = n; i < this.t; ++i) r[i - n] = this[i];\r\n\t\t\t\tr.t = Math.max(this.t - n, 0);\r\n\t\t\t\tr.s = this.s;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this << n\r\n\t\t\tfunction bnpLShiftTo(n, r) {\r\n\t\t\t\tvar bs = n % this.DB;\r\n\t\t\t\tvar cbs = this.DB - bs;\r\n\t\t\t\tvar bm = (1 << cbs) - 1;\r\n\t\t\t\tvar ds = Math.floor(n / this.DB),\r\n\t\t\t\t\tc = (this.s << bs) & this.DM,\r\n\t\t\t\t\ti;\r\n\t\t\t\tfor (i = this.t - 1; i >= 0; --i) {\r\n\t\t\t\t\tr[i + ds + 1] = (this[i] >> cbs) | c;\r\n\t\t\t\t\tc = (this[i] & bm) << bs;\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = ds - 1; i >= 0; --i) r[i] = 0;\r\n\t\t\t\tr[ds] = c;\r\n\t\t\t\tr.t = this.t + ds + 1;\r\n\t\t\t\tr.s = this.s;\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this >> n\r\n\t\t\tfunction bnpRShiftTo(n, r) {\r\n\t\t\t\tr.s = this.s;\r\n\t\t\t\tvar ds = Math.floor(n / this.DB);\r\n\t\t\t\tif (ds >= this.t) {\r\n\t\t\t\t\tr.t = 0;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar bs = n % this.DB;\r\n\t\t\t\tvar cbs = this.DB - bs;\r\n\t\t\t\tvar bm = (1 << bs) - 1;\r\n\t\t\t\tr[0] = this[ds] >> bs;\r\n\t\t\t\tfor (var i = ds + 1; i < this.t; ++i) {\r\n\t\t\t\t\tr[i - ds - 1] |= (this[i] & bm) << cbs;\r\n\t\t\t\t\tr[i - ds] = this[i] >> bs;\r\n\t\t\t\t}\r\n\t\t\t\tif (bs > 0) r[this.t - ds - 1] |= (this.s & bm) << cbs;\r\n\t\t\t\tr.t = this.t - ds;\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this - a\r\n\t\t\tfunction bnpSubTo(a, r) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t\tc = 0,\r\n\t\t\t\t\tm = Math.min(a.t, this.t);\r\n\t\t\t\twhile (i < m) {\r\n\t\t\t\t\tc += this[i] - a[i];\r\n\t\t\t\t\tr[i++] = c & this.DM;\r\n\t\t\t\t\tc >>= this.DB;\r\n\t\t\t\t}\r\n\t\t\t\tif (a.t < this.t) {\r\n\t\t\t\t\tc -= a.s;\r\n\t\t\t\t\twhile (i < this.t) {\r\n\t\t\t\t\t\tc += this[i];\r\n\t\t\t\t\t\tr[i++] = c & this.DM;\r\n\t\t\t\t\t\tc >>= this.DB;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc += this.s;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tc += this.s;\r\n\t\t\t\t\twhile (i < a.t) {\r\n\t\t\t\t\t\tc -= a[i];\r\n\t\t\t\t\t\tr[i++] = c & this.DM;\r\n\t\t\t\t\t\tc >>= this.DB;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc -= a.s;\r\n\t\t\t\t}\r\n\t\t\t\tr.s = (c < 0) ? -1 : 0;\r\n\t\t\t\tif (c < -1) r[i++] = this.DV + c;\r\n\t\t\t\telse if (c > 0) r[i++] = c;\r\n\t\t\t\tr.t = i;\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this * a, r != this,a (HAC 14.12)\r\n\t\t\t// \"this\" should be the larger one if appropriate.\r\n\t\t\tfunction bnpMultiplyTo(a, r) {\r\n\t\t\t\tvar x = this.abs(),\r\n\t\t\t\t\ty = a.abs();\r\n\t\t\t\tvar i = x.t;\r\n\t\t\t\tr.t = i + y.t;\r\n\t\t\t\twhile (--i >= 0) r[i] = 0;\r\n\t\t\t\tfor (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);\r\n\t\t\t\tr.s = 0;\r\n\t\t\t\tr.clamp();\r\n\t\t\t\tif (this.s != a.s) BigInteger.ZERO.subTo(r, r);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this^2, r != this (HAC 14.16)\r\n\t\t\tfunction bnpSquareTo(r) {\r\n\t\t\t\tvar x = this.abs();\r\n\t\t\t\tvar i = r.t = 2 * x.t;\r\n\t\t\t\twhile (--i >= 0) r[i] = 0;\r\n\t\t\t\tfor (i = 0; i < x.t - 1; ++i) {\r\n\t\t\t\t\tvar c = x.am(i, x[i], r, 2 * i, 0, 1);\r\n\t\t\t\t\tif ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {\r\n\t\t\t\t\t\tr[i + x.t] -= x.DV;\r\n\t\t\t\t\t\tr[i + x.t + 1] = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);\r\n\t\t\t\tr.s = 0;\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\r\n\t\t\t// r != q, this != m.  q or r may be null.\r\n\t\t\tfunction bnpDivRemTo(m, q, r) {\r\n\t\t\t\tvar pm = m.abs();\r\n\t\t\t\tif (pm.t <= 0) return;\r\n\t\t\t\tvar pt = this.abs();\r\n\t\t\t\tif (pt.t < pm.t) {\r\n\t\t\t\t\tif (q != null) q.fromInt(0);\r\n\t\t\t\t\tif (r != null) this.copyTo(r);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (r == null) r = nbi();\r\n\t\t\t\tvar y = nbi(),\r\n\t\t\t\t\tts = this.s,\r\n\t\t\t\t\tms = m.s;\r\n\t\t\t\tvar nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus\r\n\t\t\t\tif (nsh > 0) {\r\n\t\t\t\t\tpm.lShiftTo(nsh, y);\r\n\t\t\t\t\tpt.lShiftTo(nsh, r);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpm.copyTo(y);\r\n\t\t\t\t\tpt.copyTo(r);\r\n\t\t\t\t}\r\n\t\t\t\tvar ys = y.t;\r\n\t\t\t\tvar y0 = y[ys - 1];\r\n\t\t\t\tif (y0 == 0) return;\r\n\t\t\t\tvar yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);\r\n\t\t\t\tvar d1 = this.FV / yt,\r\n\t\t\t\t\td2 = (1 << this.F1) / yt,\r\n\t\t\t\t\te = 1 << this.F2;\r\n\t\t\t\tvar i = r.t,\r\n\t\t\t\t\tj = i - ys,\r\n\t\t\t\t\tt = (q == null) ? nbi() : q;\r\n\t\t\t\ty.dlShiftTo(j, t);\r\n\t\t\t\tif (r.compareTo(t) >= 0) {\r\n\t\t\t\t\tr[r.t++] = 1;\r\n\t\t\t\t\tr.subTo(t, r);\r\n\t\t\t\t}\r\n\t\t\t\tBigInteger.ONE.dlShiftTo(ys, t);\r\n\t\t\t\tt.subTo(y, y); // \"negative\" y so we can replace sub with am later\r\n\t\t\t\twhile (y.t < ys) y[y.t++] = 0;\r\n\t\t\t\twhile (--j >= 0) {\r\n\t\t\t\t\t// Estimate quotient digit\r\n\t\t\t\t\tvar qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);\r\n\t\t\t\t\tif ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out\r\n\t\t\t\t\t\ty.dlShiftTo(j, t);\r\n\t\t\t\t\t\tr.subTo(t, r);\r\n\t\t\t\t\t\twhile (r[i] < --qd) r.subTo(t, r);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (q != null) {\r\n\t\t\t\t\tr.drShiftTo(ys, q);\r\n\t\t\t\t\tif (ts != ms) BigInteger.ZERO.subTo(q, q);\r\n\t\t\t\t}\r\n\t\t\t\tr.t = ys;\r\n\t\t\t\tr.clamp();\r\n\t\t\t\tif (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder\r\n\t\t\t\tif (ts < 0) BigInteger.ZERO.subTo(r, r);\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this mod a\r\n\t\t\tfunction bnMod(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.abs().divRemTo(a, null, r);\r\n\t\t\t\tif (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// Modular reduction using \"classic\" algorithm\r\n\t\t\tfunction Classic(m) {\r\n\t\t\t\tthis.m = m;\r\n\t\t\t}\r\n\r\n\t\t\tfunction cConvert(x) {\r\n\t\t\t\tif (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\r\n\t\t\t\telse return x;\r\n\t\t\t}\r\n\r\n\t\t\tfunction cRevert(x) {\r\n\t\t\t\treturn x;\r\n\t\t\t}\r\n\r\n\t\t\tfunction cReduce(x) {\r\n\t\t\t\tx.divRemTo(this.m, null, x);\r\n\t\t\t}\r\n\r\n\t\t\tfunction cMulTo(x, y, r) {\r\n\t\t\t\tx.multiplyTo(y, r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t}\r\n\r\n\t\t\tfunction cSqrTo(x, r) {\r\n\t\t\t\tx.squareTo(r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t}\r\n\r\n\t\t\tClassic.prototype.convert = cConvert;\r\n\t\t\tClassic.prototype.revert = cRevert;\r\n\t\t\tClassic.prototype.reduce = cReduce;\r\n\t\t\tClassic.prototype.mulTo = cMulTo;\r\n\t\t\tClassic.prototype.sqrTo = cSqrTo;\r\n\r\n\t\t\t// (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\r\n\t\t\t// justification:\r\n\t\t\t//         xy == 1 (mod m)\r\n\t\t\t//         xy =  1+km\r\n\t\t\t//   xy(2-xy) = (1+km)(1-km)\r\n\t\t\t// x[y(2-xy)] = 1-k^2m^2\r\n\t\t\t// x[y(2-xy)] == 1 (mod m^2)\r\n\t\t\t// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\r\n\t\t\t// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\r\n\t\t\t// JS multiply \"overflows\" differently from C/C++, so care is needed here.\r\n\t\t\tfunction bnpInvDigit() {\r\n\t\t\t\tif (this.t < 1) return 0;\r\n\t\t\t\tvar x = this[0];\r\n\t\t\t\tif ((x & 1) == 0) return 0;\r\n\t\t\t\tvar y = x & 3; // y == 1/x mod 2^2\r\n\t\t\t\ty = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4\r\n\t\t\t\ty = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8\r\n\t\t\t\ty = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16\r\n\t\t\t\t// last step - calculate inverse mod DV directly;\r\n\t\t\t\t// assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\r\n\t\t\t\ty = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits\r\n\t\t\t\t// we really want the negative inverse, and -DV < y < DV\r\n\t\t\t\treturn (y > 0) ? this.DV - y : -y;\r\n\t\t\t}\r\n\r\n\t\t\t// Montgomery reduction\r\n\t\t\tfunction Montgomery(m) {\r\n\t\t\t\tthis.m = m;\r\n\t\t\t\tthis.mp = m.invDigit();\r\n\t\t\t\tthis.mpl = this.mp & 0x7fff;\r\n\t\t\t\tthis.mph = this.mp >> 15;\r\n\t\t\t\tthis.um = (1 << (m.DB - 15)) - 1;\r\n\t\t\t\tthis.mt2 = 2 * m.t;\r\n\t\t\t}\r\n\r\n\t\t\t// xR mod m\r\n\t\t\tfunction montConvert(x) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tx.abs().dlShiftTo(this.m.t, r);\r\n\t\t\t\tr.divRemTo(this.m, null, r);\r\n\t\t\t\tif (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// x/R mod m\r\n\t\t\tfunction montRevert(x) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tx.copyTo(r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// x = x/R mod m (HAC 14.32)\r\n\t\t\tfunction montReduce(x) {\r\n\t\t\t\twhile (x.t <= this.mt2) // pad x so am has enough room later\r\n\t\t\t\t\tx[x.t++] = 0;\r\n\t\t\t\tfor (var i = 0; i < this.m.t; ++i) {\r\n\t\t\t\t\t// faster way of calculating u0 = x[i]*mp mod DV\r\n\t\t\t\t\tvar j = x[i] & 0x7fff;\r\n\t\t\t\t\tvar u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;\r\n\t\t\t\t\t// use am to combine the multiply-shift-add into one call\r\n\t\t\t\t\tj = i + this.m.t;\r\n\t\t\t\t\tx[j] += this.m.am(0, u0, x, i, 0, this.m.t);\r\n\t\t\t\t\t// propagate carry\r\n\t\t\t\t\twhile (x[j] >= x.DV) {\r\n\t\t\t\t\t\tx[j] -= x.DV;\r\n\t\t\t\t\t\tx[++j]++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tx.clamp();\r\n\t\t\t\tx.drShiftTo(this.m.t, x);\r\n\t\t\t\tif (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\r\n\t\t\t}\r\n\r\n\t\t\t// r = \"x^2/R mod m\"; x != r\r\n\t\t\tfunction montSqrTo(x, r) {\r\n\t\t\t\tx.squareTo(r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t}\r\n\r\n\t\t\t// r = \"xy/R mod m\"; x,y != r\r\n\t\t\tfunction montMulTo(x, y, r) {\r\n\t\t\t\tx.multiplyTo(y, r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t}\r\n\r\n\t\t\tMontgomery.prototype.convert = montConvert;\r\n\t\t\tMontgomery.prototype.revert = montRevert;\r\n\t\t\tMontgomery.prototype.reduce = montReduce;\r\n\t\t\tMontgomery.prototype.mulTo = montMulTo;\r\n\t\t\tMontgomery.prototype.sqrTo = montSqrTo;\r\n\r\n\t\t\t// (protected) true iff this is even\r\n\t\t\tfunction bnpIsEven() {\r\n\t\t\t\treturn ((this.t > 0) ? (this[0] & 1) : this.s) == 0;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\r\n\t\t\tfunction bnpExp(e, z) {\r\n\t\t\t\tif (e > 0xffffffff || e < 1) return BigInteger.ONE;\r\n\t\t\t\tvar r = nbi(),\r\n\t\t\t\t\tr2 = nbi(),\r\n\t\t\t\t\tg = z.convert(this),\r\n\t\t\t\t\ti = nbits(e) - 1;\r\n\t\t\t\tg.copyTo(r);\r\n\t\t\t\twhile (--i >= 0) {\r\n\t\t\t\t\tz.sqrTo(r, r2);\r\n\t\t\t\t\tif ((e & (1 << i)) > 0) z.mulTo(r2, g, r);\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar t = r;\r\n\t\t\t\t\t\tr = r2;\r\n\t\t\t\t\t\tr2 = t;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn z.revert(r);\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this^e % m, 0 <= e < 2^32\r\n\t\t\tfunction bnModPowInt(e, m) {\r\n\t\t\t\tvar z;\r\n\t\t\t\tif (e < 256 || m.isEven()) z = new Classic(m);\r\n\t\t\t\telse z = new Montgomery(m);\r\n\t\t\t\treturn this.exp(e, z);\r\n\t\t\t}\r\n\r\n\t\t\t// protected\r\n\t\t\tBigInteger.prototype.copyTo = bnpCopyTo;\r\n\t\t\tBigInteger.prototype.fromInt = bnpFromInt;\r\n\t\t\tBigInteger.prototype.fromString = bnpFromString;\r\n\t\t\tBigInteger.prototype.clamp = bnpClamp;\r\n\t\t\tBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\r\n\t\t\tBigInteger.prototype.drShiftTo = bnpDRShiftTo;\r\n\t\t\tBigInteger.prototype.lShiftTo = bnpLShiftTo;\r\n\t\t\tBigInteger.prototype.rShiftTo = bnpRShiftTo;\r\n\t\t\tBigInteger.prototype.subTo = bnpSubTo;\r\n\t\t\tBigInteger.prototype.multiplyTo = bnpMultiplyTo;\r\n\t\t\tBigInteger.prototype.squareTo = bnpSquareTo;\r\n\t\t\tBigInteger.prototype.divRemTo = bnpDivRemTo;\r\n\t\t\tBigInteger.prototype.invDigit = bnpInvDigit;\r\n\t\t\tBigInteger.prototype.isEven = bnpIsEven;\r\n\t\t\tBigInteger.prototype.exp = bnpExp;\r\n\r\n\t\t\t// public\r\n\t\t\tBigInteger.prototype.toString = bnToString;\r\n\t\t\tBigInteger.prototype.negate = bnNegate;\r\n\t\t\tBigInteger.prototype.abs = bnAbs;\r\n\t\t\tBigInteger.prototype.compareTo = bnCompareTo;\r\n\t\t\tBigInteger.prototype.bitLength = bnBitLength;\r\n\t\t\tBigInteger.prototype.mod = bnMod;\r\n\t\t\tBigInteger.prototype.modPowInt = bnModPowInt;\r\n\r\n\t\t\t// \"constants\"\r\n\t\t\tBigInteger.ZERO = nbv(0);\r\n\t\t\tBigInteger.ONE = nbv(1);\r\n\r\n\r\n\t\t\t// Copyright (c) 2005  Tom Wu\r\n\t\t\t// All Rights Reserved.\r\n\t\t\t// See \"LICENSE\" for details.\r\n\r\n\t\t\t// Extended JavaScript BN functions, required for RSA private ops.\r\n\r\n\t\t\t// (public)\r\n\t\t\tfunction bnClone() {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.copyTo(r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return value as integer\r\n\t\t\tfunction bnIntValue() {\r\n\t\t\t\tif (this.s < 0) {\r\n\t\t\t\t\tif (this.t == 1) return this[0] - this.DV;\r\n\t\t\t\t\telse if (this.t == 0) return -1;\r\n\t\t\t\t} else if (this.t == 1) return this[0];\r\n\t\t\t\telse if (this.t == 0) return 0;\r\n\t\t\t\t// assumes 16 < DB < 32\r\n\t\t\t\treturn ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return value as byte\r\n\t\t\tfunction bnByteValue() {\r\n\t\t\t\treturn (this.t == 0) ? this.s : (this[0] << 24) >> 24;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return value as short (assumes DB>=16)\r\n\t\t\tfunction bnShortValue() {\r\n\t\t\t\treturn (this.t == 0) ? this.s : (this[0] << 16) >> 16;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) return x s.t. r^x < DV\r\n\t\t\tfunction bnpChunkSize(r) {\r\n\t\t\t\treturn Math.floor(Math.LN2 * this.DB / Math.log(r));\r\n\t\t\t}\r\n\r\n\t\t\t// (public) 0 if this == 0, 1 if this > 0\r\n\t\t\tfunction bnSigNum() {\r\n\t\t\t\tif (this.s < 0) return -1;\r\n\t\t\t\telse if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\r\n\t\t\t\telse return 1;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) convert to radix string\r\n\t\t\tfunction bnpToRadix(b) {\r\n\t\t\t\tif (b == null) b = 10;\r\n\t\t\t\tif (this.signum() == 0 || b < 2 || b > 36) return \"0\";\r\n\t\t\t\tvar cs = this.chunkSize(b);\r\n\t\t\t\tvar a = Math.pow(b, cs);\r\n\t\t\t\tvar d = nbv(a),\r\n\t\t\t\t\ty = nbi(),\r\n\t\t\t\t\tz = nbi(),\r\n\t\t\t\t\tr = \"\";\r\n\t\t\t\tthis.divRemTo(d, y, z);\r\n\t\t\t\twhile (y.signum() > 0) {\r\n\t\t\t\t\tr = (a + z.intValue()).toString(b).substr(1) + r;\r\n\t\t\t\t\ty.divRemTo(d, y, z);\r\n\t\t\t\t}\r\n\t\t\t\treturn z.intValue().toString(b) + r;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) convert from radix string\r\n\t\t\tfunction bnpFromRadix(s, b) {\r\n\t\t\t\tthis.fromInt(0);\r\n\t\t\t\tif (b == null) b = 10;\r\n\t\t\t\tvar cs = this.chunkSize(b);\r\n\t\t\t\tvar d = Math.pow(b, cs),\r\n\t\t\t\t\tmi = false,\r\n\t\t\t\t\tj = 0,\r\n\t\t\t\t\tw = 0;\r\n\t\t\t\tfor (var i = 0; i < s.length; ++i) {\r\n\t\t\t\t\tvar x = intAt(s, i);\r\n\t\t\t\t\tif (x < 0) {\r\n\t\t\t\t\t\tif (s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tw = b * w + x;\r\n\t\t\t\t\tif (++j >= cs) {\r\n\t\t\t\t\t\tthis.dMultiply(d);\r\n\t\t\t\t\t\tthis.dAddOffset(w, 0);\r\n\t\t\t\t\t\tj = 0;\r\n\t\t\t\t\t\tw = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (j > 0) {\r\n\t\t\t\t\tthis.dMultiply(Math.pow(b, j));\r\n\t\t\t\t\tthis.dAddOffset(w, 0);\r\n\t\t\t\t}\r\n\t\t\t\tif (mi) BigInteger.ZERO.subTo(this, this);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) alternate constructor\r\n\t\t\tfunction bnpFromNumber(a, b, c) {\r\n\t\t\t\tif (\"number\" == typeof b) {\r\n\t\t\t\t\t// new BigInteger(int,int,RNG)\r\n\t\t\t\t\tif (a < 2) this.fromInt(1);\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.fromNumber(a, c);\r\n\t\t\t\t\t\tif (!this.testBit(a - 1)) // force MSB set\r\n\t\t\t\t\t\t\tthis.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);\r\n\t\t\t\t\t\tif (this.isEven()) this.dAddOffset(1, 0); // force odd\r\n\t\t\t\t\t\twhile (!this.isProbablePrime(b)) {\r\n\t\t\t\t\t\t\tthis.dAddOffset(2, 0);\r\n\t\t\t\t\t\t\tif (this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// new BigInteger(int,RNG)\r\n\t\t\t\t\tvar x = new Array(),\r\n\t\t\t\t\t\tt = a & 7;\r\n\t\t\t\t\tx.length = (a >> 3) + 1;\r\n\t\t\t\t\tb.nextBytes(x);\r\n\t\t\t\t\tif (t > 0) x[0] &= ((1 << t) - 1);\r\n\t\t\t\t\telse x[0] = 0;\r\n\t\t\t\t\tthis.fromString(x, 256);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// (public) convert to bigendian byte array\r\n\t\t\tfunction bnToByteArray() {\r\n\t\t\t\tvar i = this.t,\r\n\t\t\t\t\tr = new Array();\r\n\t\t\t\tr[0] = this.s;\r\n\t\t\t\tvar p = this.DB - (i * this.DB) % 8,\r\n\t\t\t\t\td, k = 0;\r\n\t\t\t\tif (i-- > 0) {\r\n\t\t\t\t\tif (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p)\r\n\t\t\t\t\t\tr[k++] = d | (this.s << (this.DB - p));\r\n\t\t\t\t\twhile (i >= 0) {\r\n\t\t\t\t\t\tif (p < 8) {\r\n\t\t\t\t\t\t\td = (this[i] & ((1 << p) - 1)) << (8 - p);\r\n\t\t\t\t\t\t\td |= this[--i] >> (p += this.DB - 8);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\td = (this[i] >> (p -= 8)) & 0xff;\r\n\t\t\t\t\t\t\tif (p <= 0) {\r\n\t\t\t\t\t\t\t\tp += this.DB;\r\n\t\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ((d & 0x80) != 0) d |= -256;\r\n\t\t\t\t\t\tif (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k;\r\n\t\t\t\t\t\tif (k > 0 || d != this.s) r[k++] = d;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnEquals(a) {\r\n\t\t\t\treturn (this.compareTo(a) == 0);\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnMin(a) {\r\n\t\t\t\treturn (this.compareTo(a) < 0) ? this : a;\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnMax(a) {\r\n\t\t\t\treturn (this.compareTo(a) > 0) ? this : a;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this op a (bitwise)\r\n\t\t\tfunction bnpBitwiseTo(a, op, r) {\r\n\t\t\t\tvar i, f, m = Math.min(a.t, this.t);\r\n\t\t\t\tfor (i = 0; i < m; ++i) r[i] = op(this[i], a[i]);\r\n\t\t\t\tif (a.t < this.t) {\r\n\t\t\t\t\tf = a.s & this.DM;\r\n\t\t\t\t\tfor (i = m; i < this.t; ++i) r[i] = op(this[i], f);\r\n\t\t\t\t\tr.t = this.t;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tf = this.s & this.DM;\r\n\t\t\t\t\tfor (i = m; i < a.t; ++i) r[i] = op(f, a[i]);\r\n\t\t\t\t\tr.t = a.t;\r\n\t\t\t\t}\r\n\t\t\t\tr.s = op(this.s, a.s);\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this & a\r\n\t\t\tfunction op_and(x, y) {\r\n\t\t\t\treturn x & y;\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnAnd(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.bitwiseTo(a, op_and, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this | a\r\n\t\t\tfunction op_or(x, y) {\r\n\t\t\t\treturn x | y;\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnOr(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.bitwiseTo(a, op_or, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this ^ a\r\n\t\t\tfunction op_xor(x, y) {\r\n\t\t\t\treturn x ^ y;\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnXor(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.bitwiseTo(a, op_xor, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this & ~a\r\n\t\t\tfunction op_andnot(x, y) {\r\n\t\t\t\treturn x & ~y;\r\n\t\t\t}\r\n\r\n\t\t\tfunction bnAndNot(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.bitwiseTo(a, op_andnot, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) ~this\r\n\t\t\tfunction bnNot() {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tfor (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i];\r\n\t\t\t\tr.t = this.t;\r\n\t\t\t\tr.s = ~this.s;\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this << n\r\n\t\t\tfunction bnShiftLeft(n) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tif (n < 0) this.rShiftTo(-n, r);\r\n\t\t\t\telse this.lShiftTo(n, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this >> n\r\n\t\t\tfunction bnShiftRight(n) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tif (n < 0) this.lShiftTo(-n, r);\r\n\t\t\t\telse this.rShiftTo(n, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// return index of lowest 1-bit in x, x < 2^31\r\n\t\t\tfunction lbit(x) {\r\n\t\t\t\tif (x == 0) return -1;\r\n\t\t\t\tvar r = 0;\r\n\t\t\t\tif ((x & 0xffff) == 0) {\r\n\t\t\t\t\tx >>= 16;\r\n\t\t\t\t\tr += 16;\r\n\t\t\t\t}\r\n\t\t\t\tif ((x & 0xff) == 0) {\r\n\t\t\t\t\tx >>= 8;\r\n\t\t\t\t\tr += 8;\r\n\t\t\t\t}\r\n\t\t\t\tif ((x & 0xf) == 0) {\r\n\t\t\t\t\tx >>= 4;\r\n\t\t\t\t\tr += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((x & 3) == 0) {\r\n\t\t\t\t\tx >>= 2;\r\n\t\t\t\t\tr += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif ((x & 1) == 0) ++r;\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) returns index of lowest 1-bit (or -1 if none)\r\n\t\t\tfunction bnGetLowestSetBit() {\r\n\t\t\t\tfor (var i = 0; i < this.t; ++i)\r\n\t\t\t\t\tif (this[i] != 0) return i * this.DB + lbit(this[i]);\r\n\t\t\t\tif (this.s < 0) return this.t * this.DB;\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\r\n\t\t\t// return number of 1 bits in x\r\n\t\t\tfunction cbit(x) {\r\n\t\t\t\tvar r = 0;\r\n\t\t\t\twhile (x != 0) {\r\n\t\t\t\t\tx &= x - 1;\r\n\t\t\t\t\t++r;\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) return number of set bits\r\n\t\t\tfunction bnBitCount() {\r\n\t\t\t\tvar r = 0,\r\n\t\t\t\t\tx = this.s & this.DM;\r\n\t\t\t\tfor (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) true iff nth bit is set\r\n\t\t\tfunction bnTestBit(n) {\r\n\t\t\t\tvar j = Math.floor(n / this.DB);\r\n\t\t\t\tif (j >= this.t) return (this.s != 0);\r\n\t\t\t\treturn ((this[j] & (1 << (n % this.DB))) != 0);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) this op (1<<n)\r\n\t\t\tfunction bnpChangeBit(n, op) {\r\n\t\t\t\tvar r = BigInteger.ONE.shiftLeft(n);\r\n\t\t\t\tthis.bitwiseTo(r, op, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this | (1<<n)\r\n\t\t\tfunction bnSetBit(n) {\r\n\t\t\t\treturn this.changeBit(n, op_or);\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this & ~(1<<n)\r\n\t\t\tfunction bnClearBit(n) {\r\n\t\t\t\treturn this.changeBit(n, op_andnot);\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this ^ (1<<n)\r\n\t\t\tfunction bnFlipBit(n) {\r\n\t\t\t\treturn this.changeBit(n, op_xor);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = this + a\r\n\t\t\tfunction bnpAddTo(a, r) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t\tc = 0,\r\n\t\t\t\t\tm = Math.min(a.t, this.t);\r\n\t\t\t\twhile (i < m) {\r\n\t\t\t\t\tc += this[i] + a[i];\r\n\t\t\t\t\tr[i++] = c & this.DM;\r\n\t\t\t\t\tc >>= this.DB;\r\n\t\t\t\t}\r\n\t\t\t\tif (a.t < this.t) {\r\n\t\t\t\t\tc += a.s;\r\n\t\t\t\t\twhile (i < this.t) {\r\n\t\t\t\t\t\tc += this[i];\r\n\t\t\t\t\t\tr[i++] = c & this.DM;\r\n\t\t\t\t\t\tc >>= this.DB;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc += this.s;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tc += this.s;\r\n\t\t\t\t\twhile (i < a.t) {\r\n\t\t\t\t\t\tc += a[i];\r\n\t\t\t\t\t\tr[i++] = c & this.DM;\r\n\t\t\t\t\t\tc >>= this.DB;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc += a.s;\r\n\t\t\t\t}\r\n\t\t\t\tr.s = (c < 0) ? -1 : 0;\r\n\t\t\t\tif (c > 0) r[i++] = c;\r\n\t\t\t\telse if (c < -1) r[i++] = this.DV + c;\r\n\t\t\t\tr.t = i;\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this + a\r\n\t\t\tfunction bnAdd(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.addTo(a, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this - a\r\n\t\t\tfunction bnSubtract(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.subTo(a, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this * a\r\n\t\t\tfunction bnMultiply(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.multiplyTo(a, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this / a\r\n\t\t\tfunction bnDivide(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.divRemTo(a, r, null);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) this % a\r\n\t\t\tfunction bnRemainder(a) {\r\n\t\t\t\tvar r = nbi();\r\n\t\t\t\tthis.divRemTo(a, null, r);\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) [this/a,this%a]\r\n\t\t\tfunction bnDivideAndRemainder(a) {\r\n\t\t\t\tvar q = nbi(),\r\n\t\t\t\t\tr = nbi();\r\n\t\t\t\tthis.divRemTo(a, q, r);\r\n\t\t\t\treturn new Array(q, r);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) this *= n, this >= 0, 1 < n < DV\r\n\t\t\tfunction bnpDMultiply(n) {\r\n\t\t\t\tthis[this.t] = this.am(0, n - 1, this, 0, 0, this.t);\r\n\t\t\t\t++this.t;\r\n\t\t\t\tthis.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) this += n << w words, this >= 0\r\n\t\t\tfunction bnpDAddOffset(n, w) {\r\n\t\t\t\twhile (this.t <= w) this[this.t++] = 0;\r\n\t\t\t\tthis[w] += n;\r\n\t\t\t\twhile (this[w] >= this.DV) {\r\n\t\t\t\t\tthis[w] -= this.DV;\r\n\t\t\t\t\tif (++w >= this.t) this[this.t++] = 0;\r\n\t\t\t\t\t++this[w];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// A \"null\" reducer\r\n\t\t\tfunction NullExp() {}\r\n\r\n\t\t\tfunction nNop(x) {\r\n\t\t\t\treturn x;\r\n\t\t\t}\r\n\r\n\t\t\tfunction nMulTo(x, y, r) {\r\n\t\t\t\tx.multiplyTo(y, r);\r\n\t\t\t}\r\n\r\n\t\t\tfunction nSqrTo(x, r) {\r\n\t\t\t\tx.squareTo(r);\r\n\t\t\t}\r\n\r\n\t\t\tNullExp.prototype.convert = nNop;\r\n\t\t\tNullExp.prototype.revert = nNop;\r\n\t\t\tNullExp.prototype.mulTo = nMulTo;\r\n\t\t\tNullExp.prototype.sqrTo = nSqrTo;\r\n\r\n\t\t\t// (public) this^e\r\n\t\t\tfunction bnPow(e) {\r\n\t\t\t\treturn this.exp(e, new NullExp());\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = lower n words of \"this * a\", a.t <= n\r\n\t\t\t// \"this\" should be the larger one if appropriate.\r\n\t\t\tfunction bnpMultiplyLowerTo(a, n, r) {\r\n\t\t\t\tvar i = Math.min(this.t + a.t, n);\r\n\t\t\t\tr.s = 0; // assumes a,this >= 0\r\n\t\t\t\tr.t = i;\r\n\t\t\t\twhile (i > 0) r[--i] = 0;\r\n\t\t\t\tvar j;\r\n\t\t\t\tfor (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);\r\n\t\t\t\tfor (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i);\r\n\t\t\t\tr.clamp();\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) r = \"this * a\" without lower n words, n > 0\r\n\t\t\t// \"this\" should be the larger one if appropriate.\r\n\t\t\tfunction bnpMultiplyUpperTo(a, n, r) {\r\n\t\t\t\t--n;\r\n\t\t\t\tvar i = r.t = this.t + a.t - n;\r\n\t\t\t\tr.s = 0; // assumes a,this >= 0\r\n\t\t\t\twhile (--i >= 0) r[i] = 0;\r\n\t\t\t\tfor (i = Math.max(n - this.t, 0); i < a.t; ++i)\r\n\t\t\t\t\tr[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);\r\n\t\t\t\tr.clamp();\r\n\t\t\t\tr.drShiftTo(1, r);\r\n\t\t\t}\r\n\r\n\t\t\t// Barrett modular reduction\r\n\t\t\tfunction Barrett(m) {\r\n\t\t\t\t// setup Barrett\r\n\t\t\t\tthis.r2 = nbi();\r\n\t\t\t\tthis.q3 = nbi();\r\n\t\t\t\tBigInteger.ONE.dlShiftTo(2 * m.t, this.r2);\r\n\t\t\t\tthis.mu = this.r2.divide(m);\r\n\t\t\t\tthis.m = m;\r\n\t\t\t}\r\n\r\n\t\t\tfunction barrettConvert(x) {\r\n\t\t\t\tif (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m);\r\n\t\t\t\telse if (x.compareTo(this.m) < 0) return x;\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar r = nbi();\r\n\t\t\t\t\tx.copyTo(r);\r\n\t\t\t\t\tthis.reduce(r);\r\n\t\t\t\t\treturn r;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfunction barrettRevert(x) {\r\n\t\t\t\treturn x;\r\n\t\t\t}\r\n\r\n\t\t\t// x = x mod m (HAC 14.42)\r\n\t\t\tfunction barrettReduce(x) {\r\n\t\t\t\tx.drShiftTo(this.m.t - 1, this.r2);\r\n\t\t\t\tif (x.t > this.m.t + 1) {\r\n\t\t\t\t\tx.t = this.m.t + 1;\r\n\t\t\t\t\tx.clamp();\r\n\t\t\t\t}\r\n\t\t\t\tthis.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);\r\n\t\t\t\tthis.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);\r\n\t\t\t\twhile (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1);\r\n\t\t\t\tx.subTo(this.r2, x);\r\n\t\t\t\twhile (x.compareTo(this.m) >= 0) x.subTo(this.m, x);\r\n\t\t\t}\r\n\r\n\t\t\t// r = x^2 mod m; x != r\r\n\t\t\tfunction barrettSqrTo(x, r) {\r\n\t\t\t\tx.squareTo(r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t}\r\n\r\n\t\t\t// r = x*y mod m; x,y != r\r\n\t\t\tfunction barrettMulTo(x, y, r) {\r\n\t\t\t\tx.multiplyTo(y, r);\r\n\t\t\t\tthis.reduce(r);\r\n\t\t\t}\r\n\r\n\t\t\tBarrett.prototype.convert = barrettConvert;\r\n\t\t\tBarrett.prototype.revert = barrettRevert;\r\n\t\t\tBarrett.prototype.reduce = barrettReduce;\r\n\t\t\tBarrett.prototype.mulTo = barrettMulTo;\r\n\t\t\tBarrett.prototype.sqrTo = barrettSqrTo;\r\n\r\n\t\t\t// (public) this^e % m (HAC 14.85)\r\n\t\t\tfunction bnModPow(e, m) {\r\n\t\t\t\tvar i = e.bitLength(),\r\n\t\t\t\t\tk, r = nbv(1),\r\n\t\t\t\t\tz;\r\n\t\t\t\tif (i <= 0) return r;\r\n\t\t\t\telse if (i < 18) k = 1;\r\n\t\t\t\telse if (i < 48) k = 3;\r\n\t\t\t\telse if (i < 144) k = 4;\r\n\t\t\t\telse if (i < 768) k = 5;\r\n\t\t\t\telse k = 6;\r\n\t\t\t\tif (i < 8)\r\n\t\t\t\t\tz = new Classic(m);\r\n\t\t\t\telse if (m.isEven())\r\n\t\t\t\t\tz = new Barrett(m);\r\n\t\t\t\telse\r\n\t\t\t\t\tz = new Montgomery(m);\r\n\r\n\t\t\t\t// precomputation\r\n\t\t\t\tvar g = new Array(),\r\n\t\t\t\t\tn = 3,\r\n\t\t\t\t\tk1 = k - 1,\r\n\t\t\t\t\tkm = (1 << k) - 1;\r\n\t\t\t\tg[1] = z.convert(this);\r\n\t\t\t\tif (k > 1) {\r\n\t\t\t\t\tvar g2 = nbi();\r\n\t\t\t\t\tz.sqrTo(g[1], g2);\r\n\t\t\t\t\twhile (n <= km) {\r\n\t\t\t\t\t\tg[n] = nbi();\r\n\t\t\t\t\t\tz.mulTo(g2, g[n - 2], g[n]);\r\n\t\t\t\t\t\tn += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar j = e.t - 1,\r\n\t\t\t\t\tw, is1 = true,\r\n\t\t\t\t\tr2 = nbi(),\r\n\t\t\t\t\tt;\r\n\t\t\t\ti = nbits(e[j]) - 1;\r\n\t\t\t\twhile (j >= 0) {\r\n\t\t\t\t\tif (i >= k1) w = (e[j] >> (i - k1)) & km;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tw = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);\r\n\t\t\t\t\t\tif (j > 0) w |= e[j - 1] >> (this.DB + i - k1);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tn = k;\r\n\t\t\t\t\twhile ((w & 1) == 0) {\r\n\t\t\t\t\t\tw >>= 1;\r\n\t\t\t\t\t\t--n;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((i -= n) < 0) {\r\n\t\t\t\t\t\ti += this.DB;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (is1) { // ret == 1, don't bother squaring or multiplying it\r\n\t\t\t\t\t\tg[w].copyTo(r);\r\n\t\t\t\t\t\tis1 = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twhile (n > 1) {\r\n\t\t\t\t\t\t\tz.sqrTo(r, r2);\r\n\t\t\t\t\t\t\tz.sqrTo(r2, r);\r\n\t\t\t\t\t\t\tn -= 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n > 0) z.sqrTo(r, r2);\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tt = r;\r\n\t\t\t\t\t\t\tr = r2;\r\n\t\t\t\t\t\t\tr2 = t;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tz.mulTo(r2, g[w], r);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\twhile (j >= 0 && (e[j] & (1 << i)) == 0) {\r\n\t\t\t\t\t\tz.sqrTo(r, r2);\r\n\t\t\t\t\t\tt = r;\r\n\t\t\t\t\t\tr = r2;\r\n\t\t\t\t\t\tr2 = t;\r\n\t\t\t\t\t\tif (--i < 0) {\r\n\t\t\t\t\t\t\ti = this.DB - 1;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn z.revert(r);\r\n\t\t\t}\r\n\r\n\t\t\t// (public) gcd(this,a) (HAC 14.54)\r\n\t\t\tfunction bnGCD(a) {\r\n\t\t\t\tvar x = (this.s < 0) ? this.negate() : this.clone();\r\n\t\t\t\tvar y = (a.s < 0) ? a.negate() : a.clone();\r\n\t\t\t\tif (x.compareTo(y) < 0) {\r\n\t\t\t\t\tvar t = x;\r\n\t\t\t\t\tx = y;\r\n\t\t\t\t\ty = t;\r\n\t\t\t\t}\r\n\t\t\t\tvar i = x.getLowestSetBit(),\r\n\t\t\t\t\tg = y.getLowestSetBit();\r\n\t\t\t\tif (g < 0) return x;\r\n\t\t\t\tif (i < g) g = i;\r\n\t\t\t\tif (g > 0) {\r\n\t\t\t\t\tx.rShiftTo(g, x);\r\n\t\t\t\t\ty.rShiftTo(g, y);\r\n\t\t\t\t}\r\n\t\t\t\twhile (x.signum() > 0) {\r\n\t\t\t\t\tif ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x);\r\n\t\t\t\t\tif ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y);\r\n\t\t\t\t\tif (x.compareTo(y) >= 0) {\r\n\t\t\t\t\t\tx.subTo(y, x);\r\n\t\t\t\t\t\tx.rShiftTo(1, x);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ty.subTo(x, y);\r\n\t\t\t\t\t\ty.rShiftTo(1, y);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (g > 0) y.lShiftTo(g, y);\r\n\t\t\t\treturn y;\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) this % n, n < 2^26\r\n\t\t\tfunction bnpModInt(n) {\r\n\t\t\t\tif (n <= 0) return 0;\r\n\t\t\t\tvar d = this.DV % n,\r\n\t\t\t\t\tr = (this.s < 0) ? n - 1 : 0;\r\n\t\t\t\tif (this.t > 0)\r\n\t\t\t\t\tif (d == 0) r = this[0] % n;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tfor (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n;\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\t// (public) 1/this % m (HAC 14.61)\r\n\t\t\tfunction bnModInverse(m) {\r\n\t\t\t\tvar ac = m.isEven();\r\n\t\t\t\tif ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\r\n\t\t\t\tvar u = m.clone(),\r\n\t\t\t\t\tv = this.clone();\r\n\t\t\t\tvar a = nbv(1),\r\n\t\t\t\t\tb = nbv(0),\r\n\t\t\t\t\tc = nbv(0),\r\n\t\t\t\t\td = nbv(1);\r\n\t\t\t\twhile (u.signum() != 0) {\r\n\t\t\t\t\twhile (u.isEven()) {\r\n\t\t\t\t\t\tu.rShiftTo(1, u);\r\n\t\t\t\t\t\tif (ac) {\r\n\t\t\t\t\t\t\tif (!a.isEven() || !b.isEven()) {\r\n\t\t\t\t\t\t\t\ta.addTo(this, a);\r\n\t\t\t\t\t\t\t\tb.subTo(m, b);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ta.rShiftTo(1, a);\r\n\t\t\t\t\t\t} else if (!b.isEven()) b.subTo(m, b);\r\n\t\t\t\t\t\tb.rShiftTo(1, b);\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile (v.isEven()) {\r\n\t\t\t\t\t\tv.rShiftTo(1, v);\r\n\t\t\t\t\t\tif (ac) {\r\n\t\t\t\t\t\t\tif (!c.isEven() || !d.isEven()) {\r\n\t\t\t\t\t\t\t\tc.addTo(this, c);\r\n\t\t\t\t\t\t\t\td.subTo(m, d);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tc.rShiftTo(1, c);\r\n\t\t\t\t\t\t} else if (!d.isEven()) d.subTo(m, d);\r\n\t\t\t\t\t\td.rShiftTo(1, d);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (u.compareTo(v) >= 0) {\r\n\t\t\t\t\t\tu.subTo(v, u);\r\n\t\t\t\t\t\tif (ac) a.subTo(c, a);\r\n\t\t\t\t\t\tb.subTo(d, b);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tv.subTo(u, v);\r\n\t\t\t\t\t\tif (ac) c.subTo(a, c);\r\n\t\t\t\t\t\td.subTo(b, d);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\r\n\t\t\t\tif (d.compareTo(m) >= 0) return d.subtract(m);\r\n\t\t\t\tif (d.signum() < 0) d.addTo(m, d);\r\n\t\t\t\telse return d;\r\n\t\t\t\tif (d.signum() < 0) return d.add(m);\r\n\t\t\t\telse return d;\r\n\t\t\t}\r\n\r\n\t\t\tvar lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,\r\n\t\t\t\t103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227,\r\n\t\t\t\t229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,\r\n\t\t\t\t367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,\r\n\t\t\t\t503, 509\r\n\t\t\t];\r\n\t\t\tvar lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\r\n\r\n\t\t\t// (public) test primality with certainty >= 1-.5^t\r\n\t\t\tfunction bnIsProbablePrime(t) {\r\n\t\t\t\tvar i, x = this.abs();\r\n\t\t\t\tif (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {\r\n\t\t\t\t\tfor (i = 0; i < lowprimes.length; ++i)\r\n\t\t\t\t\t\tif (x[0] == lowprimes[i]) return true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif (x.isEven()) return false;\r\n\t\t\t\ti = 1;\r\n\t\t\t\twhile (i < lowprimes.length) {\r\n\t\t\t\t\tvar m = lowprimes[i],\r\n\t\t\t\t\t\tj = i + 1;\r\n\t\t\t\t\twhile (j < lowprimes.length && m < lplim) m *= lowprimes[j++];\r\n\t\t\t\t\tm = x.modInt(m);\r\n\t\t\t\t\twhile (i < j)\r\n\t\t\t\t\t\tif (m % lowprimes[i++] == 0) return false;\r\n\t\t\t\t}\r\n\t\t\t\treturn x.millerRabin(t);\r\n\t\t\t}\r\n\r\n\t\t\t// (protected) true if probably prime (HAC 4.24, Miller-Rabin)\r\n\t\t\tfunction bnpMillerRabin(t) {\r\n\t\t\t\tvar n1 = this.subtract(BigInteger.ONE);\r\n\t\t\t\tvar k = n1.getLowestSetBit();\r\n\t\t\t\tif (k <= 0) return false;\r\n\t\t\t\tvar r = n1.shiftRight(k);\r\n\t\t\t\tt = (t + 1) >> 1;\r\n\t\t\t\tif (t > lowprimes.length) t = lowprimes.length;\r\n\t\t\t\tvar a = nbi();\r\n\t\t\t\tfor (var i = 0; i < t; ++i) {\r\n\t\t\t\t\ta.fromInt(lowprimes[i]);\r\n\t\t\t\t\tvar y = a.modPow(r, this);\r\n\t\t\t\t\tif (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\r\n\t\t\t\t\t\tvar j = 1;\r\n\t\t\t\t\t\twhile (j++ < k && y.compareTo(n1) != 0) {\r\n\t\t\t\t\t\t\ty = y.modPowInt(2, this);\r\n\t\t\t\t\t\t\tif (y.compareTo(BigInteger.ONE) == 0) return false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (y.compareTo(n1) != 0) return false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\t// protected\r\n\t\t\tBigInteger.prototype.chunkSize = bnpChunkSize;\r\n\t\t\tBigInteger.prototype.toRadix = bnpToRadix;\r\n\t\t\tBigInteger.prototype.fromRadix = bnpFromRadix;\r\n\t\t\tBigInteger.prototype.fromNumber = bnpFromNumber;\r\n\t\t\tBigInteger.prototype.bitwiseTo = bnpBitwiseTo;\r\n\t\t\tBigInteger.prototype.changeBit = bnpChangeBit;\r\n\t\t\tBigInteger.prototype.addTo = bnpAddTo;\r\n\t\t\tBigInteger.prototype.dMultiply = bnpDMultiply;\r\n\t\t\tBigInteger.prototype.dAddOffset = bnpDAddOffset;\r\n\t\t\tBigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\r\n\t\t\tBigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\r\n\t\t\tBigInteger.prototype.modInt = bnpModInt;\r\n\t\t\tBigInteger.prototype.millerRabin = bnpMillerRabin;\r\n\r\n\t\t\t// public\r\n\t\t\tBigInteger.prototype.clone = bnClone;\r\n\t\t\tBigInteger.prototype.intValue = bnIntValue;\r\n\t\t\tBigInteger.prototype.byteValue = bnByteValue;\r\n\t\t\tBigInteger.prototype.shortValue = bnShortValue;\r\n\t\t\tBigInteger.prototype.signum = bnSigNum;\r\n\t\t\tBigInteger.prototype.toByteArray = bnToByteArray;\r\n\t\t\tBigInteger.prototype.equals = bnEquals;\r\n\t\t\tBigInteger.prototype.min = bnMin;\r\n\t\t\tBigInteger.prototype.max = bnMax;\r\n\t\t\tBigInteger.prototype.and = bnAnd;\r\n\t\t\tBigInteger.prototype.or = bnOr;\r\n\t\t\tBigInteger.prototype.xor = bnXor;\r\n\t\t\tBigInteger.prototype.andNot = bnAndNot;\r\n\t\t\tBigInteger.prototype.not = bnNot;\r\n\t\t\tBigInteger.prototype.shiftLeft = bnShiftLeft;\r\n\t\t\tBigInteger.prototype.shiftRight = bnShiftRight;\r\n\t\t\tBigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\r\n\t\t\tBigInteger.prototype.bitCount = bnBitCount;\r\n\t\t\tBigInteger.prototype.testBit = bnTestBit;\r\n\t\t\tBigInteger.prototype.setBit = bnSetBit;\r\n\t\t\tBigInteger.prototype.clearBit = bnClearBit;\r\n\t\t\tBigInteger.prototype.flipBit = bnFlipBit;\r\n\t\t\tBigInteger.prototype.add = bnAdd;\r\n\t\t\tBigInteger.prototype.subtract = bnSubtract;\r\n\t\t\tBigInteger.prototype.multiply = bnMultiply;\r\n\t\t\tBigInteger.prototype.divide = bnDivide;\r\n\t\t\tBigInteger.prototype.remainder = bnRemainder;\r\n\t\t\tBigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\r\n\t\t\tBigInteger.prototype.modPow = bnModPow;\r\n\t\t\tBigInteger.prototype.modInverse = bnModInverse;\r\n\t\t\tBigInteger.prototype.pow = bnPow;\r\n\t\t\tBigInteger.prototype.gcd = bnGCD;\r\n\t\t\tBigInteger.prototype.isProbablePrime = bnIsProbablePrime;\r\n\r\n\t\t\t// BigInteger interfaces not implemented in jsbn:\r\n\r\n\t\t\t// BigInteger(int signum, byte[] magnitude)\r\n\t\t\t// double doubleValue()\r\n\t\t\t// float floatValue()\r\n\t\t\t// int hashCode()\r\n\t\t\t// long longValue()\r\n\t\t\t// static BigInteger valueOf(long val)\r\n\r\n\r\n\r\n\t\t\tvar RSAPublicKey = function($modulus_hex, $encryptionExponent_hex) {\r\n\t\t\t\tthis.modulus = new BigInteger($modulus_hex, 16);\r\n\t\t\t\tthis.encryptionExponent = new BigInteger($encryptionExponent_hex, 16);\r\n\t\t\t};\r\n\r\n\t\t\tvar Base64 = {\r\n\t\t\t\tbase64: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\r\n\t\t\t\tencode: function($input) {\r\n\t\t\t\t\tif (!$input) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar $output = \"\";\r\n\t\t\t\t\tvar $chr1, $chr2, $chr3;\r\n\t\t\t\t\tvar $enc1, $enc2, $enc3, $enc4;\r\n\t\t\t\t\tvar $i = 0;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t$chr1 = $input.charCodeAt($i++);\r\n\t\t\t\t\t\t$chr2 = $input.charCodeAt($i++);\r\n\t\t\t\t\t\t$chr3 = $input.charCodeAt($i++);\r\n\t\t\t\t\t\t$enc1 = $chr1 >> 2;\r\n\t\t\t\t\t\t$enc2 = (($chr1 & 3) << 4) | ($chr2 >> 4);\r\n\t\t\t\t\t\t$enc3 = (($chr2 & 15) << 2) | ($chr3 >> 6);\r\n\t\t\t\t\t\t$enc4 = $chr3 & 63;\r\n\t\t\t\t\t\tif (isNaN($chr2)) $enc3 = $enc4 = 64;\r\n\t\t\t\t\t\telse if (isNaN($chr3)) $enc4 = 64;\r\n\t\t\t\t\t\t$output += this.base64.charAt($enc1) + this.base64.charAt($enc2) + this.base64.charAt($enc3) + this.base64.charAt(\r\n\t\t\t\t\t\t\t$enc4);\r\n\t\t\t\t\t} while ($i < $input.length);\r\n\t\t\t\t\treturn $output;\r\n\t\t\t\t},\r\n\t\t\t\tdecode: function($input) {\r\n\t\t\t\t\tif (!$input) return false;\r\n\t\t\t\t\t$input = $input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\r\n\t\t\t\t\tvar $output = \"\";\r\n\t\t\t\t\tvar $enc1, $enc2, $enc3, $enc4;\r\n\t\t\t\t\tvar $i = 0;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t$enc1 = this.base64.indexOf($input.charAt($i++));\r\n\t\t\t\t\t\t$enc2 = this.base64.indexOf($input.charAt($i++));\r\n\t\t\t\t\t\t$enc3 = this.base64.indexOf($input.charAt($i++));\r\n\t\t\t\t\t\t$enc4 = this.base64.indexOf($input.charAt($i++));\r\n\t\t\t\t\t\t$output += String.fromCharCode(($enc1 << 2) | ($enc2 >> 4));\r\n\t\t\t\t\t\tif ($enc3 != 64) $output += String.fromCharCode((($enc2 & 15) << 4) | ($enc3 >> 2));\r\n\t\t\t\t\t\tif ($enc4 != 64) $output += String.fromCharCode((($enc3 & 3) << 6) | $enc4);\r\n\t\t\t\t\t} while ($i < $input.length);\r\n\t\t\t\t\treturn $output;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar Hex = {\r\n\t\t\t\thex: \"0123456789abcdef\",\r\n\t\t\t\tencode: function($input) {\r\n\t\t\t\t\tif (!$input) return false;\r\n\t\t\t\t\tvar $output = \"\";\r\n\t\t\t\t\tvar $k;\r\n\t\t\t\t\tvar $i = 0;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t$k = $input.charCodeAt($i++);\r\n\t\t\t\t\t\t$output += this.hex.charAt(($k >> 4) & 0xf) + this.hex.charAt($k & 0xf);\r\n\t\t\t\t\t} while ($i < $input.length);\r\n\t\t\t\t\treturn $output;\r\n\t\t\t\t},\r\n\t\t\t\tdecode: function($input) {\r\n\t\t\t\t\tif (!$input) return false;\r\n\t\t\t\t\t$input = $input.replace(/[^0-9abcdef]/g, \"\");\r\n\t\t\t\t\tvar $output = \"\";\r\n\t\t\t\t\tvar $i = 0;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t$output += String.fromCharCode(((this.hex.indexOf($input.charAt($i++)) << 4) & 0xf0) | (this.hex.indexOf($input\r\n\t\t\t\t\t\t\t.charAt($i++)) & 0xf));\r\n\t\t\t\t\t} while ($i < $input.length);\r\n\t\t\t\t\treturn $output;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar RSA = {\r\n\r\n\t\t\t\tgetPublicKey: function($modulus_hex, $exponent_hex) {\r\n\t\t\t\t\treturn new RSAPublicKey($modulus_hex, $exponent_hex);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tencrypt: function($data, $pubkey) {\r\n\t\t\t\t\tif (!$pubkey) return false;\r\n\t\t\t\t\t$data = this.pkcs1pad2($data, ($pubkey.modulus.bitLength() + 7) >> 3);\r\n\t\t\t\t\tif (!$data) return false;\r\n\t\t\t\t\t$data = $data.modPowInt($pubkey.encryptionExponent, $pubkey.modulus);\r\n\t\t\t\t\tif (!$data) return false;\r\n\t\t\t\t\t$data = $data.toString(16);\r\n\t\t\t\t\tif (($data.length & 1) == 1)\r\n\t\t\t\t\t\t$data = \"0\" + $data;\r\n\t\t\t\t\treturn Base64.encode(Hex.decode($data));\r\n\t\t\t\t},\r\n\r\n\t\t\t\tpkcs1pad2: function($data, $keysize) {\r\n\t\t\t\t\tif ($keysize < $data.length + 11)\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\tvar $buffer = [];\r\n\t\t\t\t\tvar $i = $data.length - 1;\r\n\t\t\t\t\twhile ($i >= 0 && $keysize > 0)\r\n\t\t\t\t\t\t$buffer[--$keysize] = $data.charCodeAt($i--);\r\n\t\t\t\t\t$buffer[--$keysize] = 0;\r\n\t\t\t\t\twhile ($keysize > 2)\r\n\t\t\t\t\t\t$buffer[--$keysize] = Math.floor(Math.random() * 254) + 1;\r\n\t\t\t\t\t$buffer[--$keysize] = 2;\r\n\t\t\t\t\t$buffer[--$keysize] = 0;\r\n\t\t\t\t\treturn new BigInteger($buffer);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\r\n\r\n\t\t\tfunction get_pwd(pwd,publickey_mod,publickey_exp) {\r\n                var pubKey = RSA.getPublicKey(publickey_mod, publickey_exp);\r\n                return RSA.encrypt(pwd, pubKey);\r\n            }"
  },
  {
    "path": "其他实战/【steam】自动登录/login.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-12-11  Python: 3.7\r\n\r\nimport execjs\r\nimport requests, json, re\r\n\r\n\r\ndef Get_parameters(username):\r\n    \"\"\"steam 登录   只处理了密码加密。其他请自行拓展\r\n    :return 公钥和一个参数；\r\n    \"\"\"\r\n    import time\r\n    try:\r\n        url = \"https://store.steampowered.com/login/getrsakey/\"\r\n\r\n        headers = {\r\n            'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',\r\n            'Host': 'store.steampowered.com',\r\n            'Referer': 'https://store.steampowered.com/login/?redir=&redir_ssl=1',\r\n            'Origin': 'https://store.steampowered.com'\r\n        }\r\n        data = {\r\n            'donotcache': int(round(time.time() * 1000)),\r\n            'username': username,\r\n        }\r\n        res = requests.post(url=url, headers=headers, data=data)\r\n        publickey_mod = json.loads(res.text).get('publickey_mod')\r\n        publickey_exp = json.loads(res.text).get('publickey_exp')\r\n        return publickey_mod, publickey_exp\r\n\r\n    except Exception as err:\r\n        print('访问失败', err)\r\n\r\n\r\ndef main(pwd, publickey_mod, publickey_exp):\r\n    \"\"\"\r\n    :param pwd:\r\n    :param publickey_mod:\r\n    :param publickey_exp:\r\n    :return sign:\r\n    \"\"\"\r\n    with open('execute.js', 'r', encoding='utf-8') as f:\r\n        js = execjs.compile(f.read())\r\n        print('引擎', execjs.get().name)\r\n        sign = js.call('get_pwd', pwd, publickey_mod, publickey_exp)\r\n        return sign\r\n\r\n\r\nif __name__ == '__main__':\r\n    username = input('请输入账户:')\r\n    pwd = input('请输入密码：')\r\n    publickey_mod, publickey_exp = Get_parameters(username)\r\n    sign = main(pwd, publickey_mod, publickey_exp)\r\n    print(sign)\r\n"
  },
  {
    "path": "其他实战/【万创帮】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【万创帮】自动登录/encryp.js",
    "content": "function c(x, c) {\n    x[c >> 5] |= 128 << c % 32,\n        x[(c + 64 >>> 9 << 4) + 14] = c;\n    for (var a = 1732584193, _ = -271733879, y = -1732584194, d = 271733878, i = 0; i < x.length; i += 16) {\n        var b = a,\n            B = _,\n            D = y,\n            E = d;\n        a = h(a, _, y, d, x[i + 0], 7, -680876936),\n            d = h(d, a, _, y, x[i + 1], 12, -389564586),\n            y = h(y, d, a, _, x[i + 2], 17, 606105819),\n            _ = h(_, y, d, a, x[i + 3], 22, -1044525330),\n            a = h(a, _, y, d, x[i + 4], 7, -176418897),\n            d = h(d, a, _, y, x[i + 5], 12, 1200080426),\n            y = h(y, d, a, _, x[i + 6], 17, -1473231341),\n            _ = h(_, y, d, a, x[i + 7], 22, -45705983),\n            a = h(a, _, y, d, x[i + 8], 7, 1770035416),\n            d = h(d, a, _, y, x[i + 9], 12, -1958414417),\n            y = h(y, d, a, _, x[i + 10], 17, -42063),\n            _ = h(_, y, d, a, x[i + 11], 22, -1990404162),\n            a = h(a, _, y, d, x[i + 12], 7, 1804603682),\n            d = h(d, a, _, y, x[i + 13], 12, -40341101),\n            y = h(y, d, a, _, x[i + 14], 17, -1502002290),\n            _ = h(_, y, d, a, x[i + 15], 22, 1236535329),\n            a = g(a, _, y, d, x[i + 1], 5, -165796510),\n            d = g(d, a, _, y, x[i + 6], 9, -1069501632),\n            y = g(y, d, a, _, x[i + 11], 14, 643717713),\n            _ = g(_, y, d, a, x[i + 0], 20, -373897302),\n            a = g(a, _, y, d, x[i + 5], 5, -701558691),\n            d = g(d, a, _, y, x[i + 10], 9, 38016083),\n            y = g(y, d, a, _, x[i + 15], 14, -660478335),\n            _ = g(_, y, d, a, x[i + 4], 20, -405537848),\n            a = g(a, _, y, d, x[i + 9], 5, 568446438),\n            d = g(d, a, _, y, x[i + 14], 9, -1019803690),\n            y = g(y, d, a, _, x[i + 3], 14, -187363961),\n            _ = g(_, y, d, a, x[i + 8], 20, 1163531501),\n            a = g(a, _, y, d, x[i + 13], 5, -1444681467),\n            d = g(d, a, _, y, x[i + 2], 9, -51403784),\n            y = g(y, d, a, _, x[i + 7], 14, 1735328473),\n            _ = g(_, y, d, a, x[i + 12], 20, -1926607734),\n            a = v(a, _, y, d, x[i + 5], 4, -378558),\n            d = v(d, a, _, y, x[i + 8], 11, -2022574463),\n            y = v(y, d, a, _, x[i + 11], 16, 1839030562),\n            _ = v(_, y, d, a, x[i + 14], 23, -35309556),\n            a = v(a, _, y, d, x[i + 1], 4, -1530992060),\n            d = v(d, a, _, y, x[i + 4], 11, 1272893353),\n            y = v(y, d, a, _, x[i + 7], 16, -155497632),\n            _ = v(_, y, d, a, x[i + 10], 23, -1094730640),\n            a = v(a, _, y, d, x[i + 13], 4, 681279174),\n            d = v(d, a, _, y, x[i + 0], 11, -358537222),\n            y = v(y, d, a, _, x[i + 3], 16, -722521979),\n            _ = v(_, y, d, a, x[i + 6], 23, 76029189),\n            a = v(a, _, y, d, x[i + 9], 4, -640364487),\n            d = v(d, a, _, y, x[i + 12], 11, -421815835),\n            y = v(y, d, a, _, x[i + 15], 16, 530742520),\n            _ = v(_, y, d, a, x[i + 2], 23, -995338651),\n            a = A(a, _, y, d, x[i + 0], 6, -198630844),\n            d = A(d, a, _, y, x[i + 7], 10, 1126891415),\n            y = A(y, d, a, _, x[i + 14], 15, -1416354905),\n            _ = A(_, y, d, a, x[i + 5], 21, -57434055),\n            a = A(a, _, y, d, x[i + 12], 6, 1700485571),\n            d = A(d, a, _, y, x[i + 3], 10, -1894986606),\n            y = A(y, d, a, _, x[i + 10], 15, -1051523),\n            _ = A(_, y, d, a, x[i + 1], 21, -2054922799),\n            a = A(a, _, y, d, x[i + 8], 6, 1873313359),\n            d = A(d, a, _, y, x[i + 15], 10, -30611744),\n            y = A(y, d, a, _, x[i + 6], 15, -1560198380),\n            _ = A(_, y, d, a, x[i + 13], 21, 1309151649),\n            a = A(a, _, y, d, x[i + 4], 6, -145523070),\n            d = A(d, a, _, y, x[i + 11], 10, -1120210379),\n            y = A(y, d, a, _, x[i + 2], 15, 718787259),\n            _ = A(_, y, d, a, x[i + 9], 21, -343485551),\n            a = C(a, b),\n            _ = C(_, B),\n            y = C(y, D),\n            d = C(d, E)\n    }\n    return Array(a, _, y, d)\n}\n\nfunction a(q, c, a, x, s, t) {\n    return C(y(C(C(c, q), C(x, t)), s), a)\n}\n\nfunction h(c, h, g, d, x, s, t) {\n    return a(h & g | ~h & d, c, h, x, s, t)\n}\n\nfunction g(c, h, g, d, x, s, t) {\n    return a(h & d | g & ~d, c, h, x, s, t)\n}\n\nfunction v(c, h, g, d, x, s, t) {\n    return a(h ^ g ^ d, c, h, x, s, t)\n}\n\nfunction A(c, h, g, d, x, s, t) {\n    return a(g ^ (h | ~d), c, h, x, s, t)\n}\n\nfunction _(a, h) {\n    var g = b(a);\n    g.length > 16 && (g = c(g, a.length * U));\n    for (var v = Array(16), A = Array(16), i = 0; 16 > i; i++)\n        v[i] = 909522486 ^ g[i],\n            A[i] = 1549556828 ^ g[i];\n    var _ = c(v.concat(b(h)), 512 + h.length * U);\n    return c(A.concat(_), 640)\n}\n\nfunction C(x, c) {\n    var a = (65535 & x) + (65535 & c),\n        h = (x >> 16) + (c >> 16) + (a >> 16);\n    return h << 16 | 65535 & a\n}\n\nfunction y(c, a) {\n    return c << a | c >>> 32 - a\n}\n\nfunction b(c) {\n    for (var a = Array(), h = (1 << U) - 1, i = 0; i < c.length * U; i += U)\n        a[i >> 5] |= (c.charCodeAt(i / U) & h) << i % 32;\n    return a\n}\n\nfunction B(c) {\n    for (var a = \"\", h = (1 << U) - 1, i = 0; i < 32 * c.length; i += U)\n        a += String.fromCharCode(c[i >> 5] >>> i % 32 & h);\n    return a\n}\n\nfunction D(c) {\n    for (var a = F ? \"0123456789ABCDEF\" : \"0123456789abcdef\", h = \"\", i = 0; i < 4 * c.length; i++)\n        h += a.charAt(c[i >> 2] >> i % 4 * 8 + 4 & 15) + a.charAt(c[i >> 2] >> i % 4 * 8 & 15);\n    return h\n}\n\nfunction E(c) {\n    for (var a = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\", h = \"\", i = 0; i < 4 * c.length; i +=\n        3)\n        for (var g = (c[i >> 2] >> 8 * (i % 4) & 255) << 16 | (c[i + 1 >> 2] >> 8 * ((i + 1) % 4) & 255) << 8 | c[i + 2 >>\n        2] >> 8 * ((i + 2) % 4) & 255, v = 0; 4 > v; v++)\n            h += 8 * i + 6 * v > 32 * c.length ? S : a.charAt(g >> 6 * (3 - v) & 63);\n    return h\n}\n\nvar F = 0,\n    S = \"\",\n    U = 8,\n    j = {\n        hex_md5: function (s) {\n            return D(c(b(s), s.length * U)).toUpperCase()\n        },\n        b64_md5: function (s) {\n            return E(c(b(s), s.length * U))\n        },\n        str_md5: function (s) {\n            return B(c(b(s), s.length * U))\n        },\n        hex_hmac_md5: function (c, a) {\n            return D(_(c, a))\n        },\n        b64_hmac_md5: function (c, a) {\n            return E(_(c, a))\n        },\n        str_hmac_md5: function (c, a) {\n            return B(_(c, a))\n        }\n    };\n\n\nfunction make_sigin() {\n    now = (new Date).getTime();\n    return [j.hex_md5(\"\" + now).toUpperCase(), now]\n}\n\nfunction make_pwd(pwd) {\n    return j.hex_md5(pwd)\n}"
  },
  {
    "path": "其他实战/【万创帮】自动登录/spider_login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-03  Python: 3.7\n\nimport json\nimport requests\nimport execjs.runtime_names\n\n\nclass SpiderLogin:\n    \"\"\"\n    万创帮爬虫登陆\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.url = 'https://m.wcbchina.com/login/other-login.html'\n        print('引擎', execjs.get().name)\n\n    def use_js(self):\n        \"\"\"js 调用\n        \"\"\"\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            js = execjs.compile(f.read())\n\n        try:\n            sign, t = js.call(\"make_sigin\")\n            pwd = js.call(\"make_pwd\",  self.pwd)\n            return sign, t, pwd\n        except Exception:\n            print('异常数据')\n\n    def auto_login(self):\n        \"\"\"登陆\n        \"\"\"\n        sign, t, pwd = self.use_js()\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',\n            'Referer': 'https://m.wcbchina.com/login/other-login.html'\n        }\n        pay_load = {\n            'auth': {'sign': sign, 'timestamp': t},\n            'password': self.user,\n            'username': pwd\n        }\n\n        response = requests.post(self.url, headers=headers, data=json.dumps(pay_load))\n        print(response.cookies)\n        print(response)\n\n\nif __name__ == '__main__':\n    username = input('请输入账号')\n    password = input('密码')\n    wcb = SpiderLogin(username, password)\n    wcb.auto_login()\n"
  },
  {
    "path": "其他实战/【中关村】自动登录/README.md",
    "content": "# 解密过程博客说明\n\nhttps://www.zhangkunzhi.com/?p=135"
  },
  {
    "path": "其他实战/【中关村】自动登录/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-29  Python: 3.7\n\n\nimport requests\nimport hashlib\nimport time\nimport json\n\nfrom urllib import parse\n\n\nclass ZGC:\n    \"\"\"\n    解析过程说明 https://www.zhangkunzhi.com/?p=135\n\n    1. 用的 CryptoJS md5 加密\n    2. 需要带入 cookies\n    \"\"\"\n\n    def __init__(self, username, password):\n        self.username = username\n        self.password = password\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',\n        }\n\n    def get_cookies(self):\n        \"\"\"取cookies\n        \"\"\"\n        _now = time.time()\n        t = str(_now)[:7]\n        _jsonp = int(round(_now * 1000))\n        pick = 'http://js.zol.com.cn/pvn/pv.ht?&t={t}&c=&callback=_jsonp{_jsonp}'.format(t=t, _jsonp=_jsonp)\n        try:\n            content = requests.get(pick, headers=self.headers).text\n            ipck = json.loads(content[content.find('(')+1:-1]).get('ipck')\n            return parse.quote(ipck)\n        except:\n            print('cookies 获取失败')\n\n    def login(self, ipck):\n        \"\"\"登陆\n        \"\"\"\n        _str_now = str(int(time.time()))\n        login_url = 'http://service.zol.com.cn/user/ajax/login2014/login.php'\n        data = {\n            'userid': self.username,\n            'pwd': self.make_md5(self.password),\n            'is_auto': '1',\n            'backUrl': 'http://www.zol.com.cn/'\n        }\n        cookies = {\n            'Hm_lpvt_ae5edc2bc4fc71370807f6187f0a2dd0': _str_now,\n            'Hm_lvt_ae5edc2bc4fc71370807f6187f0a2dd0': _str_now,\n            'ip_ck': ipck,\n            'vn': '1',\n            'lv': _str_now,\n            'z_pro_city': 's_provice%3Dzhongqing%26s_city%3Dzhongqing',\n            'z_day': 'ixgo20%3D1'\n        }\n\n        response = requests.post(login_url, headers=self.headers, data=data, cookies=cookies)\n        msg = json.loads(response.content)\n        return msg\n\n    @staticmethod\n    def make_md5(_str):\n        \"\"\"md5 生成\n        \"\"\"\n        # 待加密信息\n        text = _str + 'zol'\n        # 创建md5对象\n        m = hashlib.md5()\n        m.update(text.encode(encoding='utf-8'))\n        str_md5 = m.hexdigest()\n        return str_md5\n\n    def main(self):\n        ipck = self.get_cookies()\n        msg = self.login(ipck)\n        print(msg)\n\n\nif __name__ == '__main__':\n    user = input('请输入中关村账号')\n    pwd = input('请输入中关村密码')\n    zgc = ZGC(user, pwd)\n    zgc.main()\n"
  },
  {
    "path": "其他实战/【京东】商品数据爬取/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-12-10  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【京东】商品数据爬取/selenium抓取.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-04-11  Python: 3.7\r\n\r\nfrom selenium import webdriver\r\nfrom selenium.webdriver.common.keys import Keys  # 键盘按键操作\r\nimport time\r\n\r\n\r\ndef get_goods(driver):\r\n    try:\r\n        goods = driver.find_elements_by_class_name('gl-item')\r\n\r\n        for good in goods:\r\n            detail_url = good.find_element_by_tag_name('a').get_attribute('href')\r\n\r\n            p_name = good.find_element_by_css_selector('.p-name em').text.replace('\\n', '')\r\n            price = good.find_element_by_css_selector('.p-price i').text\r\n            p_commit = good.find_element_by_css_selector('.p-commit a').text\r\n\r\n            msg = '''\r\n            商品 : %s\r\n            链接 : %s\r\n            价钱 ：%s\r\n            评论 ：%s\r\n            ''' % (p_name, detail_url, price, p_commit)\r\n\r\n            print(msg, end='\\n\\n')\r\n\r\n        button = driver.find_element_by_partial_link_text('下一页')\r\n        button.click()\r\n        time.sleep(1)\r\n        get_goods(driver)\r\n    except Exception:\r\n        pass\r\n\r\n\r\ndef spider(url, keyword):\r\n    driver = webdriver.Firefox()\r\n    driver.get(url)\r\n    driver.implicitly_wait(3)  # 使用隐式等待\r\n    try:\r\n        input_tag = driver.find_element_by_id('key')\r\n        input_tag.send_keys(keyword)\r\n        input_tag.send_keys(Keys.ENTER)\r\n        get_goods(driver)\r\n    finally:\r\n        driver.close()\r\n\r\n\r\nif __name__ == '__main__':\r\n    spider('https://www.jd.com/', keyword='手机')\r\n"
  },
  {
    "path": "其他实战/【人人网】自动登录/enc.js",
    "content": "function t(e, i, t) {\r\n    this.e = m(e),\r\n        this.d = m(i),\r\n        this.m = m(t),\r\n        this.chunkSize = 2 * N(this.m),\r\n        this.radix = 16,\r\n        this.barrett = new o(this.m)\r\n}\r\n\r\nfunction n(e, i) {\r\n    for (var t = new Array, n = i.length, o = 0; n > o;)\r\n        t[o] = i.charCodeAt(o),\r\n            o++;\r\n    for (; t.length % e.chunkSize != 0;)\r\n        t[o++] = 0;\r\n    var s, r, a, l = t.length,\r\n        c = \"\";\r\n    for (o = 0; l > o; o += e.chunkSize) {\r\n        for (a = new d,\r\n                 s = 0,\r\n                 r = o; r < o + e.chunkSize; ++s)\r\n            a.digits[s] = t[r++],\r\n                a.digits[s] += t[r++] << 8;\r\n        var u = e.barrett.powMod(a, e.e),\r\n            g = 16 == e.radix ? h(u) : f(u, e.radix);\r\n        c += g + \" \"\r\n    }\r\n    return c.substring(0, c.length - 1)\r\n}\r\n\r\nfunction o(e) {\r\n    this.modulus = c(e),\r\n        this.k = N(this.modulus) + 1;\r\n    var i = new d;\r\n    i.digits[2 * this.k] = 1,\r\n        this.mu = _(i, this.modulus),\r\n        this.bkplus1 = new d,\r\n        this.bkplus1.digits[this.k + 1] = 1,\r\n        this.modulo = s,\r\n        this.multiplyMod = r,\r\n        this.powMod = a\r\n}\r\n\r\nfunction s(e) {\r\n    var i = X(e, this.k - 1),\r\n        t = C(i, this.mu),\r\n        n = X(t, this.k + 1),\r\n        o = L(e, this.k + 1),\r\n        s = C(n, this.modulus),\r\n        r = L(s, this.k + 1),\r\n        a = b(o, r);\r\n    a.isNeg && (a = w(a, this.bkplus1));\r\n    for (var l = D(a, this.modulus) >= 0; l;)\r\n        a = b(a, this.modulus),\r\n            l = D(a, this.modulus) >= 0;\r\n    return a\r\n}\r\n\r\nfunction r(e, i) {\r\n    var t = C(e, i);\r\n    return this.modulo(t)\r\n}\r\n\r\nfunction a(e, i) {\r\n    var t = new d;\r\n    t.digits[0] = 1;\r\n    for (var n = e, o = i; ;) {\r\n        if (0 != (1 & o.digits[0]) && (t = this.multiplyMod(t, n)),\r\n            o = M(o, 1),\r\n        0 == o.digits[0] && 0 == N(o))\r\n            break;\r\n        n = this.multiplyMod(n, n)\r\n    }\r\n    return t\r\n}\r\n\r\nfunction l(e) {\r\n    B = e,\r\n        z = new Array(B);\r\n    for (var i = 0; i < z.length; i++)\r\n        z[i] = 0;\r\n    O = new d,\r\n        I = new d,\r\n        I.digits[0] = 1\r\n}\r\n\r\nfunction d(e) {\r\n    \"boolean\" == typeof e && 1 == e ? this.digits = null : this.digits = z.slice(0),\r\n        this.isNeg = !1\r\n}\r\n\r\nfunction c(e) {\r\n    var i = new d(!0);\r\n    return i.digits = e.digits.slice(0),\r\n        i.isNeg = e.isNeg,\r\n        i\r\n}\r\n\r\nfunction u(e) {\r\n    var i = new d;\r\n    i.isNeg = 0 > e,\r\n        e = Math.abs(e);\r\n    for (var t = 0; e > 0;)\r\n        i.digits[t++] = e & H,\r\n            e >>= P;\r\n    return i\r\n}\r\n\r\nfunction g(e) {\r\n    for (var i = \"\", t = e.length - 1; t > -1; --t)\r\n        i += e.charAt(t);\r\n    return i\r\n}\r\n\r\nfunction f(e, i) {\r\n    var t = new d;\r\n    t.digits[0] = i;\r\n    for (var n = A(e, t), o = Q[n[1].digits[0]]; 1 == D(n[0], O);)\r\n        n = A(n[0], t),\r\n            digit = n[1].digits[0],\r\n            o += Q[n[1].digits[0]];\r\n    return (e.isNeg ? \"-\" : \"\") + g(o)\r\n}\r\n\r\nfunction p(e) {\r\n    var t = 15,\r\n        n = \"\";\r\n    for (i = 0; i < 4; ++i)\r\n        n += Z[e & t],\r\n            e >>>= 4;\r\n    return g(n)\r\n}\r\n\r\nfunction h(e) {\r\n    for (var i = \"\", t = (N(e),\r\n        N(e)); t > -1; --t)\r\n        i += p(e.digits[t]);\r\n    return i\r\n}\r\n\r\nfunction v(e) {\r\n    var i, t = 48,\r\n        n = t + 9,\r\n        o = 97,\r\n        s = o + 25,\r\n        r = 65,\r\n        a = 90;\r\n    return i = e >= t && n >= e ? e - t : e >= r && a >= e ? 10 + e - r : e >= o && s >= e ? 10 + e - o : 0\r\n}\r\n\r\nfunction y(e) {\r\n    for (var i = 0, t = Math.min(e.length, 4), n = 0; t > n; ++n)\r\n        i <<= 4,\r\n            i |= v(e.charCodeAt(n));\r\n    return i\r\n}\r\n\r\nfunction m(e) {\r\n    for (var i = new d, t = e.length, n = t, o = 0; n > 0; n -= 4,\r\n        ++o)\r\n        i.digits[o] = y(e.substr(Math.max(n - 4, 0), Math.min(n, 4)));\r\n    return i\r\n}\r\n\r\nfunction w(e, i) {\r\n    var t;\r\n    if (e.isNeg != i.isNeg)\r\n        i.isNeg = !i.isNeg,\r\n            t = b(e, i),\r\n            i.isNeg = !i.isNeg;\r\n    else {\r\n        t = new d;\r\n        for (var n, o = 0, s = 0; s < e.digits.length; ++s)\r\n            n = e.digits[s] + i.digits[s] + o,\r\n                t.digits[s] = 65535 & n,\r\n                o = Number(n >= R);\r\n        t.isNeg = e.isNeg\r\n    }\r\n    return t\r\n}\r\n\r\nfunction b(e, i) {\r\n    var t;\r\n    if (e.isNeg != i.isNeg)\r\n        i.isNeg = !i.isNeg,\r\n            t = w(e, i),\r\n            i.isNeg = !i.isNeg;\r\n    else {\r\n        t = new d;\r\n        var n, o;\r\n        o = 0;\r\n        for (var s = 0; s < e.digits.length; ++s)\r\n            n = e.digits[s] - i.digits[s] + o,\r\n                t.digits[s] = 65535 & n,\r\n            t.digits[s] < 0 && (t.digits[s] += R),\r\n                o = 0 - Number(0 > n);\r\n        if (-1 == o) {\r\n            o = 0;\r\n            for (var s = 0; s < e.digits.length; ++s)\r\n                n = 0 - t.digits[s] + o,\r\n                    t.digits[s] = 65535 & n,\r\n                t.digits[s] < 0 && (t.digits[s] += R),\r\n                    o = 0 - Number(0 > n);\r\n            t.isNeg = !e.isNeg\r\n        } else\r\n            t.isNeg = e.isNeg\r\n    }\r\n    return t\r\n}\r\n\r\nfunction N(e) {\r\n    for (var i = e.digits.length - 1; i > 0 && 0 == e.digits[i];)\r\n        --i;\r\n    return i\r\n}\r\n\r\nfunction k(e) {\r\n    var i, t = N(e),\r\n        n = e.digits[t],\r\n        o = (t + 1) * q;\r\n    for (i = o; i > o - q && 0 == (32768 & n); --i)\r\n        n <<= 1;\r\n    return i\r\n}\r\n\r\nfunction C(e, i) {\r\n    for (var t, n, o, s = new d, r = N(e), a = N(i), l = 0; a >= l; ++l) {\r\n        for (t = 0,\r\n                 o = l,\r\n                 j = 0; j <= r; ++j,\r\n                 ++o)\r\n            n = s.digits[o] + e.digits[j] * i.digits[l] + t,\r\n                s.digits[o] = n & H,\r\n                t = n >>> P;\r\n        s.digits[l + r + 1] = t\r\n    }\r\n    return s.isNeg = e.isNeg != i.isNeg,\r\n        s\r\n}\r\n\r\nfunction x(e, i) {\r\n    var t, n, o;\r\n    result = new d,\r\n        t = N(e),\r\n        n = 0;\r\n    for (var s = 0; t >= s; ++s)\r\n        o = result.digits[s] + e.digits[s] * i + n,\r\n            result.digits[s] = o & H,\r\n            n = o >>> P;\r\n    return result.digits[1 + t] = n,\r\n        result\r\n}\r\n\r\nfunction $(e, i, t, n, o) {\r\n    for (var s = Math.min(i + o, e.length), r = i, a = n; s > r; ++r,\r\n        ++a)\r\n        t[a] = e[r]\r\n}\r\n\r\nfunction F(e, i) {\r\n    var t = Math.floor(i / q),\r\n        n = new d;\r\n    $(e.digits, 0, n.digits, t, n.digits.length - t);\r\n    for (var o = i % q, s = q - o, r = n.digits.length - 1, a = r - 1; r > 0; --r,\r\n        --a)\r\n        n.digits[r] = n.digits[r] << o & H | (n.digits[a] & J[o]) >>> s;\r\n    return n.digits[0] = n.digits[r] << o & H,\r\n        n.isNeg = e.isNeg,\r\n        n\r\n}\r\n\r\nfunction M(e, i) {\r\n    var t = Math.floor(i / q),\r\n        n = new d;\r\n    $(e.digits, t, n.digits, 0, e.digits.length - t);\r\n    for (var o = i % q, s = q - o, r = 0, a = r + 1; r < n.digits.length - 1; ++r,\r\n        ++a)\r\n        n.digits[r] = n.digits[r] >>> o | (n.digits[a] & W[o]) << s;\r\n    return n.digits[n.digits.length - 1] >>>= o,\r\n        n.isNeg = e.isNeg,\r\n        n\r\n}\r\n\r\nfunction E(e, i) {\r\n    var t = new d;\r\n    return $(e.digits, 0, t.digits, i, t.digits.length - i),\r\n        t\r\n}\r\n\r\nfunction X(e, i) {\r\n    var t = new d;\r\n    return $(e.digits, i, t.digits, 0, t.digits.length - i),\r\n        t\r\n}\r\n\r\nfunction L(e, i) {\r\n    var t = new d;\r\n    return $(e.digits, 0, t.digits, 0, i),\r\n        t\r\n}\r\n\r\nfunction D(e, i) {\r\n    if (e.isNeg != i.isNeg)\r\n        return 1 - 2 * Number(e.isNeg);\r\n    for (var t = e.digits.length - 1; t >= 0; --t)\r\n        if (e.digits[t] != i.digits[t])\r\n            return e.isNeg ? 1 - 2 * Number(e.digits[t] > i.digits[t]) : 1 - 2 * Number(e.digits[t] < i.digits[t]);\r\n    return 0\r\n}\r\n\r\nfunction A(e, i) {\r\n    var t, n, o = k(e),\r\n        s = k(i),\r\n        r = i.isNeg;\r\n    if (s > o)\r\n        return e.isNeg ? (t = c(I),\r\n            t.isNeg = !i.isNeg,\r\n            e.isNeg = !1,\r\n            i.isNeg = !1,\r\n            n = b(i, e),\r\n            e.isNeg = !0,\r\n            i.isNeg = r) : (t = new d,\r\n            n = c(e)),\r\n            new Array(t, n);\r\n    t = new d,\r\n        n = e;\r\n    for (var a = Math.ceil(s / q) - 1, l = 0; i.digits[a] < U;)\r\n        i = F(i, 1),\r\n            ++l,\r\n            ++s,\r\n            a = Math.ceil(s / q) - 1;\r\n    n = F(n, l),\r\n        o += l;\r\n    for (var u = Math.ceil(o / q) - 1, g = E(i, u - a); -1 != D(n, g);)\r\n        ++t.digits[u - a],\r\n            n = b(n, g);\r\n    for (var f = u; f > a; --f) {\r\n        var p = f >= n.digits.length ? 0 : n.digits[f],\r\n            h = f - 1 >= n.digits.length ? 0 : n.digits[f - 1],\r\n            v = f - 2 >= n.digits.length ? 0 : n.digits[f - 2],\r\n            y = a >= i.digits.length ? 0 : i.digits[a],\r\n            m = a - 1 >= i.digits.length ? 0 : i.digits[a - 1];\r\n        p == y ? t.digits[f - a - 1] = H : t.digits[f - a - 1] = Math.floor((p * R + h) / y);\r\n        for (var C = t.digits[f - a - 1] * (y * R + m), $ = p * K + (h * R + v); C > $;)\r\n            --t.digits[f - a - 1],\r\n                C = t.digits[f - a - 1] * (y * R | m),\r\n                $ = p * R * R + (h * R + v);\r\n        g = E(i, f - a - 1),\r\n            n = b(n, x(g, t.digits[f - a - 1])),\r\n        n.isNeg && (n = w(n, g),\r\n            --t.digits[f - a - 1])\r\n    }\r\n    return n = M(n, l),\r\n        t.isNeg = e.isNeg != r,\r\n    e.isNeg && (t = r ? w(t, I) : b(t, I),\r\n        i = M(i, l),\r\n        n = b(i, n)),\r\n    0 == n.digits[0] && 0 == N(n) && (n.isNeg = !1),\r\n        new Array(t, n)\r\n}\r\n\r\nfunction _(e, i) {\r\n    return A(e, i)[0]\r\n}\r\n\r\ngetKeys = function (jsonData) {\r\n    var n = this;\r\n    var n = JSON.parse(jsonData);\r\n    1 == n.isEncrypt && (l(2 * n.maxdigits),\r\n        T = new t(n.e, \"null\", n.n),\r\n    true && undefined)\r\n};\r\n\r\n\r\nvar B, z, O, I, P = 16,\r\n    q = P,\r\n    R = 65536,\r\n    U = R >>> 1,\r\n    K = R * R,\r\n    H = R - 1;\r\nl(20);\r\nvar Q = (u(1e15),\r\n        new Array(\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\",\r\n            \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\")),\r\n    Z = new Array(\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"),\r\n    J = new Array(0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532,\r\n        65534, 65535),\r\n    W = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535)\r\n\r\n\r\nfunction getTime() {\r\n    let time = new Date;\r\n    return \"&uniqueTimestamp=\" + time.getFullYear() + time.getMonth() + time.getDay() + time.getHours() + time.getSeconds() +\r\n        time.getUTCMilliseconds()\r\n}\r\n\r\nfunction enc(jsonkey, pwd) {\r\n    getKeys(jsonkey);\r\n    return n(T, pwd);\r\n}"
  },
  {
    "path": "其他实战/【人人网】自动登录/login.py",
    "content": "import requests\r\nimport json\r\nimport re\r\nimport execjs.runtime_names\r\n\r\n\r\nclass People:\r\n    def __init__(self, user, pwd):\r\n        \"\"\"\r\n        初始化\r\n        :param user: 用户名\r\n        :param pwd: 密码\r\n        \"\"\"\r\n        self.username = user\r\n        self.pwd = pwd\r\n        self.ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'\r\n        self.headers = {\r\n            'User-Agent': self.ua,\r\n            'Host': 'www.renren.com',\r\n        }\r\n        self.session = requests.session()\r\n        self.json_data = ''\r\n\r\n        print('【JS引擎】', execjs.get().name)\r\n        with open(\"enc.js\", \"r\", encoding=\"utf-8\") as f:\r\n            self.js = execjs.compile(f.read())\r\n\r\n    def to_index(self):\r\n        \"\"\"\r\n        第一步 - 访问首页\r\n        获取 Cookies\r\n        :return:\r\n        \"\"\"\r\n        response = self.session.get('http://www.renren.com/', headers=self.headers)\r\n        print('【主页】', response)\r\n\r\n    def get_key(self):\r\n        \"\"\"\r\n        第二步 - 获取加密参数\r\n        获取 rkey 以及 密码加密所需参数\r\n        :return:\r\n        \"\"\"\r\n        headers = {\r\n            'Referer': 'http://login.renren.com/ajaxproxy.htm',\r\n            'User-Agent': self.ua,\r\n        }\r\n        response = self.session.get('http://login.renren.com/ajax/getEncryptKey', headers=headers)\r\n        print('【获取key】', response.text)\r\n        return response.text\r\n\r\n    def login(self, key_info):\r\n        \"\"\"\r\n        第三步 - 登录账号\r\n        :param key_info: 第二步获取的参数\r\n        :return:\r\n        \"\"\"\r\n        url = 'http://www.renren.com/ajaxLogin/login?1=1' + self.js.call('getTime')\r\n        data = {\r\n            'email': self.username,\r\n            'icode': \"\",\r\n            'origURL': 'http://www.renren.com/home',\r\n            'domain': 'renren.com',\r\n            'key_id': '1',\r\n            'captcha_type': 'web_login',\r\n            'password': self.get_password(key_info),\r\n            'rkey': json.loads(key_info).get('rkey'),\r\n            'f': ''\r\n        }\r\n        print('【登录data】', data)\r\n        print('【登录URL】', url)\r\n        print('【Cookies】', self.session.cookies)\r\n        response = self.session.post(url, data=data, headers=self.headers)\r\n        print('【返回信息】', response.text)\r\n        response = self.session.get('http://www.renren.com/home', headers=self.headers)\r\n        print('【登录信息】', re.findall(\"<title>(.*?)</title>\", response.text))\r\n\r\n    def get_password(self, key_info):\r\n        \"\"\"\r\n        调用 js 代码生成参数\r\n        :param key_info:\r\n        :return:\r\n        \"\"\"\r\n        return self.js.call('enc', key_info, self.pwd)\r\n\r\n    def start(self):\r\n        \"\"\"\r\n        启动\r\n        :return:\r\n        \"\"\"\r\n        self.to_index()\r\n        self.login(self.get_key())\r\n\r\n\r\nif __name__ == '__main__':\r\n    \"\"\"\r\n    启动区域\r\n    \"\"\"\r\n    username = input('用户名>>> ')\r\n    password = input('密码>>> ')\r\n    pp = People(username, password)\r\n    pp.start()\r\n"
  },
  {
    "path": "其他实战/【企业名片】企业查询/encryp.js",
    "content": "function deco(e) {\r\n    u = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\r\n    d = /[\\t\\n\\f\\r ]/g\r\n    var t = (e = String(e).replace(d, \"\")).length;\r\n    t % 4 == 0 && (t = (e = e.replace(/==?$/, \"\")).length),\r\n        (t % 4 == 1 || /[^+a-zA-Z0-9/] /.test(e)) && c(\r\n            \"Invalid character: the string to be decoded is not correctly encoded.\");\r\n    for (var n, i, r = 0,\r\n            o = \"\",\r\n            a = -1; ++a < t;) i = u.indexOf(e.charAt(a)),\r\n        n = r % 4 ? 64 * n + i : i,\r\n        r++ % 4 && (o += String.fromCharCode(255 & n >> (-2 * r & 6)));\r\n    return o\r\n}\r\n\r\nfunction s(t, e, i, n, a, s) {\r\n    var o, r, c, l, u, d, h, p, f, v, m, g, b, y, C = new Array(16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536,\r\n            1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752,\r\n            16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752,\r\n            16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540,\r\n            16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756),\r\n        _ = new Array(-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -\r\n            2146402272, -2146402304, -2147483648, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, -\r\n            2147483648, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800,\r\n            0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -\r\n            2146402272, 1081376, 32, 32768, -2147483648, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -\r\n            2147483616, 1048608, 1081344, 0, -2147450880, 32800, -2147483648, -2146435040, -2146402272, 1081344),\r\n        w = new Array(520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072,\r\n            134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248,\r\n            131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312,\r\n            134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728,\r\n            134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584),\r\n        x = new Array(8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0,\r\n            8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928,\r\n            8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321,\r\n            8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608,\r\n            8192, 8396928),\r\n        k = new Array(256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688,\r\n            1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080,\r\n            1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544,\r\n            524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544,\r\n            34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0,\r\n            1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080),\r\n        A = new Array(536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704,\r\n            4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16,\r\n            541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232,\r\n            4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616,\r\n            4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0,\r\n            541081600, 536870912, 4194320, 536887312),\r\n        T = new Array(2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2,\r\n            67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016,\r\n            2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018,\r\n            69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066,\r\n            69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154),\r\n        L = new Array(268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600,\r\n            268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664,\r\n            268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64,\r\n            268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0,\r\n            268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208,\r\n            268435456, 268701696),\r\n        S = function(t) {\r\n            for (var e, i, n, a = new Array(0, 4, 536870912, 536870916, 65536, 65540, 536936448, 536936452, 512, 516,\r\n                        536871424, 536871428, 66048, 66052, 536936960, 536936964), s = new Array(0, 1, 1048576, 1048577, 67108864,\r\n                        67108865, 68157440, 68157441, 256, 257, 1048832, 1048833, 67109120, 67109121, 68157696, 68157697), o = new Array(\r\n                        0, 8, 2048, 2056, 16777216, 16777224, 16779264, 16779272, 0, 8, 2048, 2056, 16777216, 16777224, 16779264,\r\n                        16779272), r = new Array(0, 2097152, 134217728, 136314880, 8192, 2105344, 134225920, 136323072, 131072,\r\n                        2228224, 134348800, 136445952, 139264, 2236416, 134356992, 136454144), c = new Array(0, 262144, 16, 262160, 0,\r\n                        262144, 16, 262160, 4096, 266240, 4112, 266256, 4096, 266240, 4112, 266256), l = new Array(0, 1024, 32, 1056,\r\n                        0, 1024, 32, 1056, 33554432, 33555456, 33554464, 33555488, 33554432, 33555456, 33554464, 33555488), u = new Array(\r\n                        0, 268435456, 524288, 268959744, 2, 268435458, 524290, 268959746, 0, 268435456, 524288, 268959744, 2,\r\n                        268435458, 524290, 268959746), d = new Array(0, 65536, 2048, 67584, 536870912, 536936448, 536872960, 536938496,\r\n                        131072, 196608, 133120, 198656, 537001984, 537067520, 537004032, 537069568), h = new Array(0, 262144, 0,\r\n                        262144, 2, 262146, 2, 262146, 33554432, 33816576, 33554432, 33816576, 33554434, 33816578, 33554434, 33816578),\r\n                    p = new Array(0, 268435456, 8, 268435464, 0, 268435456, 8, 268435464, 1024, 268436480, 1032, 268436488, 1024,\r\n                        268436480, 1032, 268436488), f = new Array(0, 32, 0, 32, 1048576, 1048608, 1048576, 1048608, 8192, 8224, 8192,\r\n                        8224, 1056768, 1056800, 1056768, 1056800), v = new Array(0, 16777216, 512, 16777728, 2097152, 18874368,\r\n                        2097664, 18874880, 67108864, 83886080, 67109376, 83886592, 69206016, 85983232, 69206528, 85983744), m = new Array(\r\n                        0, 4096, 134217728, 134221824, 524288, 528384, 134742016, 134746112, 16, 4112, 134217744, 134221840, 524304,\r\n                        528400, 134742032, 134746128), g = new Array(0, 4, 256, 260, 0, 4, 256, 260, 1, 5, 257, 261, 1, 5, 257, 261),\r\n                    b = t.length > 8 ? 3 : 1, y = new Array(32 * b), C = new Array(0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0),\r\n                    _ = 0, w = 0, x = 0; x < b; x++) {\r\n                var k = t.charCodeAt(_++) << 24 | t.charCodeAt(_++) << 16 | t.charCodeAt(_++) << 8 | t.charCodeAt(_++),\r\n                    A = t.charCodeAt(_++) << 24 | t.charCodeAt(_++) << 16 | t.charCodeAt(_++) << 8 | t.charCodeAt(_++);\r\n                k ^= (n = 252645135 & (k >>> 4 ^ A)) << 4,\r\n                    k ^= n = 65535 & ((A ^= n) >>> -16 ^ k),\r\n                    k ^= (n = 858993459 & (k >>> 2 ^ (A ^= n << -16))) << 2,\r\n                    k ^= n = 65535 & ((A ^= n) >>> -16 ^ k),\r\n                    k ^= (n = 1431655765 & (k >>> 1 ^ (A ^= n << -16))) << 1,\r\n                    k ^= n = 16711935 & ((A ^= n) >>> 8 ^ k),\r\n                    n = (k ^= (n = 1431655765 & (k >>> 1 ^ (A ^= n << 8))) << 1) << 8 | (A ^= n) >>> 20 & 240,\r\n                    k = A << 24 | A << 8 & 16711680 | A >>> 8 & 65280 | A >>> 24 & 240,\r\n                    A = n;\r\n                for (var T = 0; T < C.length; T++)\r\n                    C[T] ? (k = k << 2 | k >>> 26,\r\n                        A = A << 2 | A >>> 26) : (k = k << 1 | k >>> 27,\r\n                        A = A << 1 | A >>> 27),\r\n                    A &= -15,\r\n                    e = a[(k &= -15) >>> 28] | s[k >>> 24 & 15] | o[k >>> 20 & 15] | r[k >>> 16 & 15] | c[k >>> 12 & 15] | l[k >>>\r\n                        8 & 15] | u[k >>> 4 & 15],\r\n                    i = d[A >>> 28] | h[A >>> 24 & 15] | p[A >>> 20 & 15] | f[A >>> 16 & 15] | v[A >>> 12 & 15] | m[A >>> 8 & 15] |\r\n                    g[A >>> 4 & 15],\r\n                    n = 65535 & (i >>> 16 ^ e),\r\n                    y[w++] = e ^ n,\r\n                    y[w++] = i ^ n << 16\r\n            }\r\n            return y\r\n        }(t),\r\n        z = 0,\r\n        B = e.length,\r\n        j = 0,\r\n        I = 32 == S.length ? 3 : 9;\r\n    p = 3 == I ? i ? new Array(0, 32, 2) : new Array(30, -2, -2) : i ? new Array(0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array(\r\n            94, 62, -2, 32, 64, 2, 30, -2, -2),\r\n        2 == s ? e += \"        \" : 1 == s ? i && (c = 8 - B % 8,\r\n            e += String.fromCharCode(c, c, c, c, c, c, c, c),\r\n            8 === c && (B += 8)) : s || (e += \"\\0\\0\\0\\0\\0\\0\\0\\0\");\r\n    var N = \"\",\r\n        F = \"\";\r\n    for (1 == n && (f = a.charCodeAt(z++) << 24 | a.charCodeAt(z++) << 16 | a.charCodeAt(z++) << 8 | a.charCodeAt(z++),\r\n            m = a.charCodeAt(z++) << 24 | a.charCodeAt(z++) << 16 | a.charCodeAt(z++) << 8 | a.charCodeAt(z++),\r\n            z = 0); z < B;) {\r\n        for (d = e.charCodeAt(z++) << 24 | e.charCodeAt(z++) << 16 | e.charCodeAt(z++) << 8 | e.charCodeAt(z++),\r\n            h = e.charCodeAt(z++) << 24 | e.charCodeAt(z++) << 16 | e.charCodeAt(z++) << 8 | e.charCodeAt(z++),\r\n            1 == n && (i ? (d ^= f,\r\n                h ^= m) : (v = f,\r\n                g = m,\r\n                f = d,\r\n                m = h)),\r\n            d ^= (c = 252645135 & (d >>> 4 ^ h)) << 4,\r\n            d ^= (c = 65535 & (d >>> 16 ^ (h ^= c))) << 16,\r\n            d ^= c = 858993459 & ((h ^= c) >>> 2 ^ d),\r\n            d ^= c = 16711935 & ((h ^= c << 2) >>> 8 ^ d),\r\n            d = (d ^= (c = 1431655765 & (d >>> 1 ^ (h ^= c << 8))) << 1) << 1 | d >>> 31,\r\n            h = (h ^= c) << 1 | h >>> 31,\r\n            r = 0; r < I; r += 3) {\r\n            for (b = p[r + 1],\r\n                y = p[r + 2],\r\n                o = p[r]; o != b; o += y)\r\n                l = h ^ S[o],\r\n                u = (h >>> 4 | h << 28) ^ S[o + 1],\r\n                c = d,\r\n                d = h,\r\n                h = c ^ (_[l >>> 24 & 63] | x[l >>> 16 & 63] | A[l >>> 8 & 63] | L[63 & l] | C[u >>> 24 & 63] | w[u >>> 16 & 63] |\r\n                    k[u >>> 8 & 63] | T[63 & u]);\r\n            c = d,\r\n                d = h,\r\n                h = c\r\n        }\r\n        h = h >>> 1 | h << 31,\r\n            h ^= c = 1431655765 & ((d = d >>> 1 | d << 31) >>> 1 ^ h),\r\n            h ^= (c = 16711935 & (h >>> 8 ^ (d ^= c << 1))) << 8,\r\n            h ^= (c = 858993459 & (h >>> 2 ^ (d ^= c))) << 2,\r\n            h ^= c = 65535 & ((d ^= c) >>> 16 ^ h),\r\n            h ^= c = 252645135 & ((d ^= c << 16) >>> 4 ^ h),\r\n            d ^= c << 4,\r\n            1 == n && (i ? (f = d,\r\n                m = h) : (d ^= v,\r\n                h ^= g)),\r\n            F += String.fromCharCode(d >>> 24, d >>> 16 & 255, d >>> 8 & 255, 255 & d, h >>> 24, h >>> 16 & 255, h >>> 8 &\r\n                255, 255 & h),\r\n            512 == (j += 8) && (N += F,\r\n                F = \"\",\r\n                j = 0)\r\n    }\r\n    if (N = (N += F).replace(/\\0*$/g, \"\"),\r\n        !i) {\r\n        if (1 === s) {\r\n            var O = 0;\r\n            (B = N.length) && (O = N.charCodeAt(B - 1)),\r\n            O <= 8 && (N = N.substring(0, B - O))\r\n        }\r\n        N = decodeURIComponent(escape(N))\r\n    }\r\n    return N\r\n}\r\n\r\nkey =\r\n    'bOnqtWHqs4uLG9v0bT4uO6isvbiT8aIuVXK3Cf4FZEan27IeZt0dPhZFP3MHYAqL3RhRkdtYisAILDIRZo5nRjal8gCdjTfckNWSKqax7UJIx/xuZpX2ESwmDsQtt4VbSRHrXxX7w9M6uJpGQ4pmkhgAOrzMd7krZGWjts+QvDiSZV3ogU9g18dO+kPNgCGAXpbBZe850GQL/ZtXe/MyymSMX0UCdnWyxvW+pylu4NRLgD4QKDDbCbfXhe75ZCPwwQzy7IFgFJAfCZqMFDuHwxVOrX7TFg/8IdMotUhC0bZQul6JtLUt3wONKjFiOWlQcHhESLLL8BASHkfbRWOrZzJD/7NwnCGGBExFM1EaUsqYnhIZCt9iCxC3YUxQcc/YyBynN4yeMy54mZGw1YdnfjBLfZsZcQGJHD5plYuZtZzGtT5axTGEc+wFJIOBM9KqAVDP9EjXQbLx0CzDP4mU22ZXuJ8VI2WFomyKq0c1TmXoRIx/YMaDDW732YTvJ5ip9OWZPtfoIxgUj8Kt+Ma83GHnvhyz1UqqK0WUl33PSRH0Kyy6u01bOnrw9nXApOM+O58xlv84NhqXV5UNXBv2QanbKYFtrLycLqFEG/54JGLQiKg4BywDEK0i+acB5KkLrsZQ0Y5AS0QBQSinyVVeBtXdizI108ZxApOmTsSbrDYDN5kozMF4U9MBgz4MwHjdAJi71d0qFkKLJl0XlLNMweSvL7LqKb2j+hUk1f2TPyT+DLZf6JbS1MpfE6RAhSw9oeb+AeCIN9FjJiBrwFpprshKV5+pQysjVpEaati5KHADN5kozMF4U9MBgz4MwHjdRy1BxsWNdmvecguBop/mUsASDNo08L9AUyNj+lIrbHxAm/LDuLil5IUltqyd6E1dWOJiDCqxQDULkQZHjCnATjkj8jkrQSizXzuvdEZ/bg0cuopNbiBd2ARL4Vwhjkm6PZc5LxdtfRGhangqgGjWOPAveNWmhByFpwVpj8F2dbNqPjYwSvbTkmIVsyAKwooyt+4gsiaCWI9UbR2/tS/pM4Mc+K8UMBnkPkI/hx8dI7WD9lutMTcSmdNi8fsi3W23CviXLZ78f00Z51Qhgunhsn6hLB2OFGq9O2db8T06srefB7vqtIgAoZ9mcDczH/3PHDep62KxbIk='\r\n\r\n\r\nfunction get_info(send_info) {\r\n    return s(\"5e5062e82f15fe4ca9d24bc5\", deco(send_info), 0, 0, \"012345677890123\", 1)\r\n}"
  },
  {
    "path": "其他实战/【企业名片】企业查询/qi_ming.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-11-08  Python: 3.7\r\n\r\nimport requests\r\nimport json\r\nimport execjs.runtime_names\r\n\r\n\r\nwith open('encryp.js', 'r', encoding='utf-8') as f:\r\n    js = execjs.compile(f.read())\r\n\r\nprint('引擎', execjs.get().name)\r\n\r\ndata = {\r\n    'time_interval': '',\r\n    'tag': '',\r\n    'tag_type': '',\r\n    'province': '',\r\n    'lunci': '',\r\n    'page': '1',\r\n    'num': '20',\r\n    'unionid': '',\r\n}\r\n\r\nheaders = {\r\n    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'\r\n}\r\n\r\nresponse = requests.post('https://vipapi.qimingpian.com/DataList/productListVip', data=data, headers=headers)\r\n\r\nre_data = json.loads(response.text)\r\n\r\ndata = js.call('get_info', re_data.get('encrypt_data'))\r\nprint(data.encode('utf-8').decode('unicode_escape'))\r\n\r\n"
  },
  {
    "path": "其他实战/【国鑫所】自动登录/Login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-10  Python: 3.7\nimport execjs.runtime_names\nimport requests\n\n\nclass GuoXin:\n    \"\"\"\n    国鑫所\n    https://wechat.gclfax.com/html/register/login.html\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.url = 'https://wechat.gclfax.com/client/index.php'\n        self.js = None\n        self.init_js()\n\n    def init_js(self):\n        print('引擎', execjs.get().name)\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def login(self):\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',\n            'Host': 'wechat.gclfax.com',\n            'Origin': 'https://wechat.gclfax.com',\n            'Referer': 'https://wechat.gclfax.com/html/register/login.html'\n        }\n        data = {\n            'OPT': '1',\n            'name': self.user,\n            'pwd': self.js.call('test', self.pwd),\n            'randomId': '',\n            'code': '',\n            'openid': '',\n        }\n        response = requests.post(self.url, headers=headers, data=data)\n        print(response.text)\n        print(response)\n\n\nif __name__ == '__main__':\n    username = input('用户名')\n    password = input('密码')\n    gxs = GuoXin(username, password)\n    gxs.login()\n"
  },
  {
    "path": "其他实战/【国鑫所】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【国鑫所】自动登录/encryp.js",
    "content": "var CryptoJS = CryptoJS || function(s, p) {\n    var m = {}\n      , l = m.lib = {}\n      , n = function() {}\n      , r = l.Base = {\n        extend: function(b) {\n            n.prototype = this;\n            var h = new n;\n            b && h.mixIn(b);\n            h.hasOwnProperty(\"init\") || (h.init = function() {\n                h.$super.init.apply(this, arguments)\n            }\n            );\n            h.init.prototype = h;\n            h.$super = this;\n            return h\n        },\n        create: function() {\n            var b = this.extend();\n            b.init.apply(b, arguments);\n            return b\n        },\n        init: function() {},\n        mixIn: function(b) {\n            for (var h in b)\n                b.hasOwnProperty(h) && (this[h] = b[h]);\n            b.hasOwnProperty(\"toString\") && (this.toString = b.toString)\n        },\n        clone: function() {\n            return this.init.prototype.extend(this)\n        }\n    }\n      , q = l.WordArray = r.extend({\n        init: function(b, h) {\n            b = this.words = b || [];\n            this.sigBytes = h != p ? h : 4 * b.length\n        },\n        toString: function(b) {\n            return (b || t).stringify(this)\n        },\n        concat: function(b) {\n            var h = this.words\n              , a = b.words\n              , j = this.sigBytes;\n            b = b.sigBytes;\n            this.clamp();\n            if (j % 4)\n                for (var g = 0; g < b; g++)\n                    h[j + g >>> 2] |= (a[g >>> 2] >>> 24 - 8 * (g % 4) & 255) << 24 - 8 * ((j + g) % 4);\n            else if (65535 < a.length)\n                for (g = 0; g < b; g += 4)\n                    h[j + g >>> 2] = a[g >>> 2];\n            else\n                h.push.apply(h, a);\n            this.sigBytes += b;\n            return this\n        },\n        clamp: function() {\n            var b = this.words\n              , h = this.sigBytes;\n            b[h >>> 2] &= 4294967295 << 32 - 8 * (h % 4);\n            b.length = s.ceil(h / 4)\n        },\n        clone: function() {\n            var b = r.clone.call(this);\n            b.words = this.words.slice(0);\n            return b\n        },\n        random: function(b) {\n            for (var h = [], a = 0; a < b; a += 4)\n                h.push(4294967296 * s.random() | 0);\n            return new q.init(h,b)\n        }\n    })\n      , v = m.enc = {}\n      , t = v.Hex = {\n        stringify: function(b) {\n            var a = b.words;\n            b = b.sigBytes;\n            for (var g = [], j = 0; j < b; j++) {\n                var k = a[j >>> 2] >>> 24 - 8 * (j % 4) & 255;\n                g.push((k >>> 4).toString(16));\n                g.push((k & 15).toString(16))\n            }\n            return g.join(\"\")\n        },\n        parse: function(b) {\n            for (var a = b.length, g = [], j = 0; j < a; j += 2)\n                g[j >>> 3] |= parseInt(b.substr(j, 2), 16) << 24 - 4 * (j % 8);\n            return new q.init(g,a / 2)\n        }\n    }\n      , a = v.Latin1 = {\n        stringify: function(b) {\n            var a = b.words;\n            b = b.sigBytes;\n            for (var g = [], j = 0; j < b; j++)\n                g.push(String.fromCharCode(a[j >>> 2] >>> 24 - 8 * (j % 4) & 255));\n            return g.join(\"\")\n        },\n        parse: function(b) {\n            for (var a = b.length, g = [], j = 0; j < a; j++)\n                g[j >>> 2] |= (b.charCodeAt(j) & 255) << 24 - 8 * (j % 4);\n            return new q.init(g,a)\n        }\n    }\n      , u = v.Utf8 = {\n        stringify: function(b) {\n            try {\n                return decodeURIComponent(escape(a.stringify(b)))\n            } catch (g) {\n                throw Error(\"Malformed UTF-8 data\");\n            }\n        },\n        parse: function(b) {\n            return a.parse(unescape(encodeURIComponent(b)))\n        }\n    }\n      , g = l.BufferedBlockAlgorithm = r.extend({\n        reset: function() {\n            this._data = new q.init;\n            this._nDataBytes = 0\n        },\n        _append: function(b) {\n            \"string\" == typeof b && (b = u.parse(b));\n            this._data.concat(b);\n            this._nDataBytes += b.sigBytes\n        },\n        _process: function(b) {\n            var a = this._data\n              , g = a.words\n              , j = a.sigBytes\n              , k = this.blockSize\n              , m = j / (4 * k)\n              , m = b ? s.ceil(m) : s.max((m | 0) - this._minBufferSize, 0);\n            b = m * k;\n            j = s.min(4 * b, j);\n            if (b) {\n                for (var l = 0; l < b; l += k)\n                    this._doProcessBlock(g, l);\n                l = g.splice(0, b);\n                a.sigBytes -= j\n            }\n            return new q.init(l,j)\n        },\n        clone: function() {\n            var b = r.clone.call(this);\n            b._data = this._data.clone();\n            return b\n        },\n        _minBufferSize: 0\n    });\n    l.Hasher = g.extend({\n        cfg: r.extend(),\n        init: function(b) {\n            this.cfg = this.cfg.extend(b);\n            this.reset()\n        },\n        reset: function() {\n            g.reset.call(this);\n            this._doReset()\n        },\n        update: function(b) {\n            this._append(b);\n            this._process();\n            return this\n        },\n        finalize: function(b) {\n            b && this._append(b);\n            return this._doFinalize()\n        },\n        blockSize: 16,\n        _createHelper: function(b) {\n            return function(a, g) {\n                return (new b.init(g)).finalize(a)\n            }\n        },\n        _createHmacHelper: function(b) {\n            return function(a, g) {\n                return (new k.HMAC.init(b,g)).finalize(a)\n            }\n        }\n    });\n    var k = m.algo = {};\n    return m\n}(Math);\n\nvar CryptoJS=CryptoJS||function(u,l){var d={},n=d.lib={},p=function(){},s=n.Base={extend:function(a){p.prototype=this;var c=new p;a&&c.mixIn(a);c.hasOwnProperty(\"init\")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty(\"toString\")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},\nq=n.WordArray=s.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,m=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var t=0;t<a;t++)c[f+t>>>2]|=(m[t>>>2]>>>24-8*(t%4)&255)<<24-8*((f+t)%4);else if(65535<m.length)for(t=0;t<a;t+=4)c[f+t>>>2]=m[t>>>2];else c.push.apply(c,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<\n32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],m=0;m<a;m+=4)c.push(4294967296*u.random()|0);return new q.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f<a;f++){var t=c[f>>>2]>>>24-8*(f%4)&255;m.push((t>>>4).toString(16));m.push((t&15).toString(16))}return m.join(\"\")},parse:function(a){for(var c=a.length,m=[],f=0;f<c;f+=2)m[f>>>3]|=parseInt(a.substr(f,\n2),16)<<24-4*(f%8);return new q.init(m,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f<a;f++)m.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return m.join(\"\")},parse:function(a){for(var c=a.length,m=[],f=0;f<c;f++)m[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(m,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error(\"Malformed UTF-8 data\");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},\nr=n.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){\"string\"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,m=c.words,f=c.sigBytes,t=this.blockSize,b=f/(4*t),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*t;f=u.min(4*a,f);if(a){for(var e=0;e<a;e+=t)this._doProcessBlock(m,e);e=m.splice(0,a);c.sigBytes-=f}return new q.init(e,f)},clone:function(){var a=s.clone.call(this);\na._data=this._data.clone();return a},_minBufferSize:0});n.Hasher=r.extend({cfg:s.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,m){return(new a.init(m)).finalize(c)}},_createHmacHelper:function(a){return function(c,m){return(new e.HMAC.init(a,\nm)).finalize(c)}}});var e=d.algo={};return d}(Math);\n(function(){var u=CryptoJS,l=u.lib.WordArray;u.enc.Base64={stringify:function(d){var n=d.words,l=d.sigBytes,s=this._map;d.clamp();d=[];for(var q=0;q<l;q+=3)for(var w=(n[q>>>2]>>>24-8*(q%4)&255)<<16|(n[q+1>>>2]>>>24-8*((q+1)%4)&255)<<8|n[q+2>>>2]>>>24-8*((q+2)%4)&255,v=0;4>v&&q+0.75*v<l;v++)d.push(s.charAt(w>>>6*(3-v)&63));if(n=s.charAt(64))for(;d.length%4;)d.push(n);return d.join(\"\")},parse:function(d){var n=d.length,p=this._map,s=p.charAt(64);s&&(s=d.indexOf(s),-1!=s&&(n=s));for(var s=[],q=0,w=0;w<\nn;w++)if(w%4){var v=p.indexOf(d.charAt(w-1))<<2*(w%4),b=p.indexOf(d.charAt(w))>>>6-2*(w%4);s[q>>>2]|=(v|b)<<24-8*(q%4);q++}return l.create(s,q)},_map:\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"}})();\n(function(u){function l(b,e,a,c,m,f,t){b=b+(e&a|~e&c)+m+t;return(b<<f|b>>>32-f)+e}function d(b,e,a,c,m,f,t){b=b+(e&c|a&~c)+m+t;return(b<<f|b>>>32-f)+e}function n(b,e,a,c,m,f,t){b=b+(e^a^c)+m+t;return(b<<f|b>>>32-f)+e}function p(b,e,a,c,m,f,t){b=b+(a^(e|~c))+m+t;return(b<<f|b>>>32-f)+e}for(var s=CryptoJS,q=s.lib,w=q.WordArray,v=q.Hasher,q=s.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;q=q.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},\n_doProcessBlock:function(r,e){for(var a=0;16>a;a++){var c=e+a,m=r[c];r[c]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var a=this._hash.words,c=r[e+0],m=r[e+1],f=r[e+2],t=r[e+3],y=r[e+4],q=r[e+5],s=r[e+6],w=r[e+7],v=r[e+8],u=r[e+9],x=r[e+10],z=r[e+11],A=r[e+12],B=r[e+13],C=r[e+14],D=r[e+15],g=a[0],h=a[1],j=a[2],k=a[3],g=l(g,h,j,k,c,7,b[0]),k=l(k,g,h,j,m,12,b[1]),j=l(j,k,g,h,f,17,b[2]),h=l(h,j,k,g,t,22,b[3]),g=l(g,h,j,k,y,7,b[4]),k=l(k,g,h,j,q,12,b[5]),j=l(j,k,g,h,s,17,b[6]),h=l(h,j,k,g,w,22,b[7]),\ng=l(g,h,j,k,v,7,b[8]),k=l(k,g,h,j,u,12,b[9]),j=l(j,k,g,h,x,17,b[10]),h=l(h,j,k,g,z,22,b[11]),g=l(g,h,j,k,A,7,b[12]),k=l(k,g,h,j,B,12,b[13]),j=l(j,k,g,h,C,17,b[14]),h=l(h,j,k,g,D,22,b[15]),g=d(g,h,j,k,m,5,b[16]),k=d(k,g,h,j,s,9,b[17]),j=d(j,k,g,h,z,14,b[18]),h=d(h,j,k,g,c,20,b[19]),g=d(g,h,j,k,q,5,b[20]),k=d(k,g,h,j,x,9,b[21]),j=d(j,k,g,h,D,14,b[22]),h=d(h,j,k,g,y,20,b[23]),g=d(g,h,j,k,u,5,b[24]),k=d(k,g,h,j,C,9,b[25]),j=d(j,k,g,h,t,14,b[26]),h=d(h,j,k,g,v,20,b[27]),g=d(g,h,j,k,B,5,b[28]),k=d(k,g,\nh,j,f,9,b[29]),j=d(j,k,g,h,w,14,b[30]),h=d(h,j,k,g,A,20,b[31]),g=n(g,h,j,k,q,4,b[32]),k=n(k,g,h,j,v,11,b[33]),j=n(j,k,g,h,z,16,b[34]),h=n(h,j,k,g,C,23,b[35]),g=n(g,h,j,k,m,4,b[36]),k=n(k,g,h,j,y,11,b[37]),j=n(j,k,g,h,w,16,b[38]),h=n(h,j,k,g,x,23,b[39]),g=n(g,h,j,k,B,4,b[40]),k=n(k,g,h,j,c,11,b[41]),j=n(j,k,g,h,t,16,b[42]),h=n(h,j,k,g,s,23,b[43]),g=n(g,h,j,k,u,4,b[44]),k=n(k,g,h,j,A,11,b[45]),j=n(j,k,g,h,D,16,b[46]),h=n(h,j,k,g,f,23,b[47]),g=p(g,h,j,k,c,6,b[48]),k=p(k,g,h,j,w,10,b[49]),j=p(j,k,g,h,\nC,15,b[50]),h=p(h,j,k,g,q,21,b[51]),g=p(g,h,j,k,A,6,b[52]),k=p(k,g,h,j,t,10,b[53]),j=p(j,k,g,h,x,15,b[54]),h=p(h,j,k,g,m,21,b[55]),g=p(g,h,j,k,v,6,b[56]),k=p(k,g,h,j,D,10,b[57]),j=p(j,k,g,h,s,15,b[58]),h=p(h,j,k,g,B,21,b[59]),g=p(g,h,j,k,y,6,b[60]),k=p(k,g,h,j,z,10,b[61]),j=p(j,k,g,h,f,15,b[62]),h=p(h,j,k,g,u,21,b[63]);a[0]=a[0]+g|0;a[1]=a[1]+h|0;a[2]=a[2]+j|0;a[3]=a[3]+k|0},_doFinalize:function(){var b=this._data,e=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;e[c>>>5]|=128<<24-c%32;var m=u.floor(a/\n4294967296);e[(c+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;e[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(e.length+1);this._process();b=this._hash;e=b.words;for(a=0;4>a;a++)c=e[a],e[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});s.MD5=v._createHelper(q);s.HmacMD5=v._createHmacHelper(q)})(Math);\n(function(){var u=CryptoJS,l=u.lib,d=l.Base,n=l.WordArray,l=u.algo,p=l.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,l){for(var p=this.cfg,v=p.hasher.create(),b=n.create(),u=b.words,r=p.keySize,p=p.iterations;u.length<r;){e&&v.update(e);var e=v.update(d).finalize(l);v.reset();for(var a=1;a<p;a++)e=v.finalize(e),v.reset();b.concat(e)}b.sigBytes=4*r;return b}});u.EvpKDF=function(d,l,n){return p.create(n).compute(d,\nl)}})();\nCryptoJS.lib.Cipher||function(u){var l=CryptoJS,d=l.lib,n=d.Base,p=d.WordArray,s=d.BufferedBlockAlgorithm,q=l.enc.Base64,w=l.algo.EvpKDF,v=d.Cipher=s.extend({cfg:n.extend(),createEncryptor:function(m,a){return this.create(this._ENC_XFORM_MODE,m,a)},createDecryptor:function(m,a){return this.create(this._DEC_XFORM_MODE,m,a)},init:function(m,a,b){this.cfg=this.cfg.extend(b);this._xformMode=m;this._key=a;this.reset()},reset:function(){s.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},\nfinalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(m){return{encrypt:function(f,b,e){return(\"string\"==typeof b?c:a).encrypt(m,f,b,e)},decrypt:function(f,b,e){return(\"string\"==typeof b?c:a).decrypt(m,f,b,e)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=l.mode={},x=function(a,f,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var e=0;e<b;e++)a[f+e]^=\nc[e]},r=(d.BlockCipherMode=n.extend({createEncryptor:function(a,f){return this.Encryptor.create(a,f)},createDecryptor:function(a,f){return this.Decryptor.create(a,f)},init:function(a,f){this._cipher=a;this._iv=f}})).extend();r.Encryptor=r.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize;x.call(this,a,f,c);b.encryptBlock(a,f);this._prevBlock=a.slice(f,f+c)}});r.Decryptor=r.extend({processBlock:function(a,b){var c=this._cipher,e=c.blockSize,d=a.slice(b,b+e);c.decryptBlock(a,b);x.call(this,\na,b,e);this._prevBlock=d}});b=b.CBC=r;r=(l.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,e=c<<24|c<<16|c<<8|c,d=[],l=0;l<c;l+=4)d.push(e);c=p.create(d,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:r}),reset:function(){v.reset.call(this);var a=this.cfg,c=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var b=a.createEncryptor;else b=a.createDecryptor,this._minBufferSize=1;this._mode=b.call(a,\nthis,c&&c.words)},_doProcessBlock:function(a,c){this._mode.processBlock(a,c)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var c=this._process(!0)}else c=this._process(!0),a.unpad(c);return c},blockSize:4});var e=d.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(l.format={}).OpenSSL={stringify:function(a){var c=a.ciphertext;a=a.salt;return(a?p.create([1398893684,\n1701076831]).concat(a).concat(c):c).toString(q)},parse:function(a){a=q.parse(a);var c=a.words;if(1398893684==c[0]&&1701076831==c[1]){var b=p.create(c.slice(2,4));c.splice(0,4);a.sigBytes-=16}return e.create({ciphertext:a,salt:b})}},a=d.SerializableCipher=n.extend({cfg:n.extend({format:b}),encrypt:function(a,c,b,d){d=this.cfg.extend(d);var l=a.createEncryptor(b,d);c=l.finalize(c);l=l.cfg;return e.create({ciphertext:c,key:b,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},\ndecrypt:function(a,c,b,e){e=this.cfg.extend(e);c=this._parse(c,e.format);return a.createDecryptor(b,e).finalize(c.ciphertext)},_parse:function(a,c){return\"string\"==typeof a?c.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,c,b,d){d||(d=p.random(8));a=w.create({keySize:c+b}).compute(a,d);b=p.create(a.words.slice(c),4*b);a.sigBytes=4*c;return e.create({key:a,iv:b,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:l}),encrypt:function(c,b,e,d){d=this.cfg.extend(d);e=d.kdf.execute(e,\nc.keySize,c.ivSize);d.iv=e.iv;c=a.encrypt.call(this,c,b,e.key,d);c.mixIn(e);return c},decrypt:function(c,b,e,d){d=this.cfg.extend(d);b=this._parse(b,d.format);e=d.kdf.execute(e,c.keySize,c.ivSize,b.salt);d.iv=e.iv;return a.decrypt.call(this,c,b,e.key,d)}})}();\n(function(){function u(b,a){var c=(this._lBlock>>>b^this._rBlock)&a;this._rBlock^=c;this._lBlock^=c<<b}function l(b,a){var c=(this._rBlock>>>b^this._lBlock)&a;this._lBlock^=c;this._rBlock^=c<<b}var d=CryptoJS,n=d.lib,p=n.WordArray,n=n.BlockCipher,s=d.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],w=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,\n55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],v=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],b=[{\"0\":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,\n2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,\n1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{\"0\":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,\n75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,\n276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{\"0\":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,\n14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,\n17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{\"0\":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,\n98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,\n1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{\"0\":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,\n10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,\n83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{\"0\":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,\n2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{\"0\":1048576,\n16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,\n496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{\"0\":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,\n2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,\n2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],x=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],r=s.DES=n.extend({_doReset:function(){for(var b=this._key.words,a=[],c=0;56>c;c++){var d=q[c]-1;a[c]=b[d>>>5]>>>31-d%32&1}b=this._subKeys=[];for(d=0;16>d;d++){for(var f=b[d]=[],l=v[d],c=0;24>c;c++)f[c/6|0]|=a[(w[c]-1+l)%28]<<31-c%6,f[4+(c/6|0)]|=a[28+(w[c+24]-1+l)%28]<<31-c%6;f[0]=f[0]<<1|f[0]>>>31;for(c=1;7>c;c++)f[c]>>>=\n4*(c-1)+3;f[7]=f[7]<<5|f[7]>>>27}a=this._invSubKeys=[];for(c=0;16>c;c++)a[c]=b[15-c]},encryptBlock:function(b,a){this._doCryptBlock(b,a,this._subKeys)},decryptBlock:function(b,a){this._doCryptBlock(b,a,this._invSubKeys)},_doCryptBlock:function(e,a,c){this._lBlock=e[a];this._rBlock=e[a+1];u.call(this,4,252645135);u.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);u.call(this,1,1431655765);for(var d=0;16>d;d++){for(var f=c[d],n=this._lBlock,p=this._rBlock,q=0,r=0;8>r;r++)q|=b[r][((p^\nf[r])&x[r])>>>0];this._lBlock=p;this._rBlock=n^q}c=this._lBlock;this._lBlock=this._rBlock;this._rBlock=c;u.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);u.call(this,16,65535);u.call(this,4,252645135);e[a]=this._lBlock;e[a+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});d.DES=n._createHelper(r);s=s.TripleDES=n.extend({_doReset:function(){var b=this._key.words;this._des1=r.createEncryptor(p.create(b.slice(0,2)));this._des2=r.createEncryptor(p.create(b.slice(2,4)));this._des3=\nr.createEncryptor(p.create(b.slice(4,6)))},encryptBlock:function(b,a){this._des1.encryptBlock(b,a);this._des2.decryptBlock(b,a);this._des3.encryptBlock(b,a)},decryptBlock:function(b,a){this._des3.decryptBlock(b,a);this._des2.encryptBlock(b,a);this._des1.decryptBlock(b,a)},keySize:6,ivSize:2,blockSize:2});d.TripleDES=n._createHelper(s)})();\n\nCryptoJS.mode.ECB=function(){var a=CryptoJS.lib.BlockCipherMode.extend();a.Encryptor=a.extend({processBlock:function(a,b){this._cipher.encryptBlock(a,b)}});a.Decryptor=a.extend({processBlock:function(a,b){this._cipher.decryptBlock(a,b)}});return a}();\n\nfunction test(pwd) {\n    var key = 'Pog4iu6OqIkKRpDT';\n    var keyHex = CryptoJS.enc.Utf8.parse(key);\n    var encrypted = CryptoJS.DES.encrypt(pwd, keyHex, {\n        mode: CryptoJS.mode.ECB,\n        padding: CryptoJS.pad.Pkcs7\n    });\n    var enstr = CryptoJS.enc.Base64.parse(encrypted.toString());\n    return enstr.toString().toUpperCase();\n}"
  },
  {
    "path": "其他实战/【天眼查】模拟登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【天眼查】模拟登录/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-13  Python: 3.7\nimport time\n\nfrom lxml import etree\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n\nclass TYC_Spider:\n\n    def __init__(self, username, password):\n        \"\"\"初始化参数\"\"\"\n        url = 'https://www.tianyancha.com/login'\n        page_url = 'https://www.tianyancha.com/search/ohp1/p{page}?base=cq'\n        self.page_url = page_url\n        self.page = 1  # 当前页数\n        self.url = url\n\n        options = webdriver.ChromeOptions()\n        # 不加载图片,加快访问速度\n        # options.add_experimental_option(\"prefs\", {\"profile.managed_default_content_settings.images\": 2})\n        # 设置为开发者模式，避免被识别\n        options.add_experimental_option('excludeSwitches',\n                                        ['enable-automation'])\n        self.browser = webdriver.Chrome(executable_path='./chromedriver', options=options)\n        self.wait = WebDriverWait(self.browser, 40)\n        # 初始化用户名\n        self.username = username\n        # 初始化密码\n        self.password = password\n\n    def run(self):\n        \"\"\"登陆接口\"\"\"\n        self.browser.get(self.url)\n        try:\n            use_pass = self.wait.until(\n                EC.presence_of_element_located((By.XPATH, '//*[@id=\"web-content\"]/div/div[2]/div/div[2]/div/div[3]/div[1]/div[2]')))\n            time.sleep(2)\n            use_pass.click()\n            username = self.wait.until(\n                EC.presence_of_element_located((By.XPATH, '//*[@id=\"web-content\"]/div/div[2]/div/div[2]/div/div[3]/div[2]/div[2]/input')))\n            password = self.wait.until(\n                EC.presence_of_element_located(\n                    (By.XPATH, '//*[@id=\"web-content\"]/div/div[2]/div/div[2]/div/div[3]/div[2]/div[3]/input')))\n            input_to = self.wait.until(\n                EC.presence_of_element_located(\n                    (By.XPATH, '//*[@id=\"web-content\"]/div/div[2]/div/div[2]/div/div[3]/div[2]/div[5]')))\n            username.send_keys(self.username)\n            password.send_keys(self.password)\n            input_to.click()\n\n            self.wait.until(\n                EC.presence_of_element_located((By.XPATH, '//*[@id=\"home-main-search\"]')))\n            print('登陆成功')\n            self.go_page()\n\n        except Exception:\n            self.browser.close()\n            print(\"登陆失败\")\n\n    def go_page(self):\n        \"\"\"进入指定页面\"\"\"\n        self.browser.get(self.page_url.format(page=str(self.page+1)))  # ohp带电话\n        self.get_info()\n        self.go_page()\n\n    def get_info(self):\n        \"\"\"获取当前页面，企业名称+电话号码\"\"\"\n        html = self.browser.page_source\n        etr = etree.HTML(html)\n        divs = etr.xpath(\"//div[@class='search-item sv-search-company']\")\n        for div in divs:\n            title = div.xpath('./div/div[3]/div[1]/a/text()')\n            phone = div.xpath('./div/div[3]/div[3]/div[1]/script/text()')\n            if not phone:\n                phone = div.xpath('./div/div[3]/div[3]/div[1]/span[2]/span/text()')\n\n            if not phone:\n                phone = div.xpath('./div/div[3]/div[4]/div[1]/script/text()')\n            print(title, phone)\n        time.sleep(2)\n\n\nif __name__ == \"__main__\":\n    name = input(\"请输入你的微博用户名:\")\n    pas = input(\"请输入密码:\")\n    spider = TYC_Spider(name, pas)\n    spider.run()\n"
  },
  {
    "path": "其他实战/【天翼】登录/login.py",
    "content": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/1/23\n\n\nimport requests\nimport re\nimport execjs\n\n\nsession = requests.session()\nUA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'\n\n\ndef login(username, password):\n    with open('v1.js', 'r', encoding='utf-8') as f:\n        js = execjs.compile(f.read())\n    username = js.call('make', username)\n    password = js.call('make', password)\n    url = 'https://e.189.cn/index.do'\n    login_url = 'https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do'\n    response = session.get(url, headers={\"User-Agent\": UA})\n    ret = re.search(r'sign=(.*?)&appId=(.*?)&paras=(.*?)&format=(.*?)&clientType=(.*?)&version=(.*?)\">', response.text)\n\n    url = 'https://open.e.189.cn/api/logbox/oauth2/unifyAccountLogin.do?sign=' + ret.group(1) + '&appId=' + ret.group(\n        2) + '&paras=' + ret.group(3) + '&format=' + ret.group(4) + '&clientType=' + ret.group(\n        5) + '&version=' + ret.group(6)\n\n    response = session.get(url, headers={\"User-Agent\": UA})\n    text = response.text\n\n    captchaToken = re.search(r\"captchaToken' value='(.*?)'>\", text).group(1)\n\n    ret = re.search(r\"clientType = '(.*?)'[\\s\\S]*?accountType = '(.*?)'[\\s\\S]*?appKey = '(.*?)'\", text)\n    clientType = ret.group(1)\n    accountType = ret.group(2)\n    appKey = ret.group(3)\n\n    paramId = re.search(r'paramId = \"(.*?)\"', text).group(1)\n    REQID = re.search(r'reqId = \"(.*?)\"', text).group(1)\n    lt = re.search(r'lt = \"(.*?)\"', text).group(1)\n\n    headers = {\n        'User-Agent': UA,\n        'Host': 'open.e.189.cn',\n        'Origin': 'https://open.e.189.cn',\n        'Referer': url,\n        'REQID': REQID,\n        'lt': lt,\n    }\n    data = {\n        'appKey': appKey,\n        'accountType': accountType,\n        'validateCode': \"\",  # 验证码\n        'captchaToken': captchaToken,\n        'returnUrl': 'https://e.189.cn/user/loginMiddle.do?returnUrlMid=https://e.189.cn/user/index.do',\n        'mailSuffix': '',\n        'dynamicCheck': 'FALSE',\n        'clientType': clientType,\n        'cb_SaveName': '1',\n        'isOauth2': 'false',\n        'state': '',\n        'paramId': paramId,\n        'userName': username,\n        'password': password,\n    }\n    response = session.post(login_url, headers=headers, data=data)\n\n    # print(data)\n    print(response.text)\n\n\nprint(execjs.get().name)\nif execjs.get().name != 'Node.js (V8)':\n    print('请安装V8 引擎')\n\nif __name__ == '__main__':\n    user = input('用户名>>>')\n    pwd = input('密码>>>')\n    login(user, pwd)\n"
  },
  {
    "path": "其他实战/【天翼】登录/v1.js",
    "content": "var navigator = {};\nvar window = {};\nvar JSEncryptExports = {};\n! function(exports) {\n    function BigInteger(a, b, c) {\n        null != a && (\"number\" == typeof a ? this.fromNumber(a, b, c) : null == b && \"string\" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))\n    }\n\n    function nbi() {\n        return new BigInteger(null)\n    }\n\n    function int2char(a) {\n        return BI_RM.charAt(a)\n    }\n\n    function intAt(a, b) {\n        var c = BI_RC[a.charCodeAt(b)];\n        return null == c ? -1 : c\n    }\n\n    function nbv(a) {\n        var b = nbi();\n        return b.fromInt(a),\n        b\n    }\n\n    function nbits(a) {\n        var b, c = 1;\n        return 0 != (b = a >>> 16) && (a = b, c += 16),\n        0 != (b = a >> 8) && (a = b, c += 8),\n        0 != (b = a >> 4) && (a = b, c += 4),\n        0 != (b = a >> 2) && (a = b, c += 2),\n        0 != (b = a >> 1) && (a = b, c += 1),\n        c\n    }\n\n    function Classic(a) {\n        this.m = a\n    }\n\n    function Montgomery(a) {\n        this.m = a,\n        this.mp = a.invDigit(),\n        this.mpl = 32767 & this.mp,\n        this.mph = this.mp >> 15,\n        this.um = (1 << a.DB - 15) - 1,\n        this.mt2 = 2 * a.t\n    }\n\n    function op_and(a, b) {\n        return a & b\n    }\n\n    function op_or(a, b) {\n        return a | b\n    }\n\n    function op_xor(a, b) {\n        return a ^ b\n    }\n\n    function op_andnot(a, b) {\n        return a & ~b\n    }\n\n    function lbit(a) {\n        if (0 == a) return -1;\n        var b = 0;\n        return 0 == (65535 & a) && (a >>= 16, b += 16),\n        0 == (255 & a) && (a >>= 8, b += 8),\n        0 == (15 & a) && (a >>= 4, b += 4),\n        0 == (3 & a) && (a >>= 2, b += 2),\n        0 == (1 & a) && ++b,\n        b\n    }\n\n    function cbit(a) {\n        for (var b = 0; 0 != a;) a &= a - 1, ++b;\n        return b\n    }\n\n    function NullExp() {}\n\n    function nNop(a) {\n        return a\n    }\n\n    function Barrett(a) {\n        this.r2 = nbi(),\n        this.q3 = nbi(),\n        BigInteger.ONE.dlShiftTo(2 * a.t, this.r2),\n        this.mu = this.r2.divide(a),\n        this.m = a\n    }\n\n    function Arcfour() {\n        this.i = 0,\n        this.j = 0,\n        this.S = new Array\n    }\n\n    function rng_get_byte() {\n        if (null == rng_state) {\n            for (rng_state = new Arcfour; rng_pptr < rng_psize;) {\n                var a = Math.floor(65536 * Math.random());\n                rng_pool[rng_pptr++] = 255 & a\n            }\n            for (rng_state.init(rng_pool), rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) rng_pool[rng_pptr] = 0;\n            rng_pptr = 0\n        }\n        return rng_state.next()\n    }\n\n    function SecureRandom() {}\n\n    function parseBigInt(a, b) {\n        return new BigInteger(a, b)\n    }\n\n    function RSAKey() {\n        this.n = null,\n        this.e = 0,\n        this.d = null,\n        this.p = null,\n        this.q = null,\n        this.dmp1 = null,\n        this.dmq1 = null,\n        this.coeff = null\n    }\n\n    function hex2b64(a) {\n        var b, c, d = \"\";\n        for (b = 0; b + 3 <= a.length; b += 3) c = parseInt(a.substring(b, b + 3), 16),\n        d += b64map.charAt(c >> 6) + b64map.charAt(63 & c);\n        for (b + 1 == a.length ? (c = parseInt(a.substring(b, b + 1), 16), d += b64map.charAt(c << 2)) : b + 2 == a.length && (c = parseInt(a.substring(b, b + 2), 16), d += b64map.charAt(c >> 2) + b64map.charAt((3 & c) << 4)); 0 < (3 & d.length);) d += b64pad;\n        return d\n    }\n\n    function b64tohex(a) {\n        var b, c, d = \"\",\n            e = 0;\n        for (b = 0; b < a.length && a.charAt(b) != b64pad; ++b) v = b64map.indexOf(a.charAt(b)),\n        v < 0 || (e = 0 == e ? (d += int2char(v >> 2), c = 3 & v, 1) : 1 == e ? (d += int2char(c << 2 | v >> 4), c = 15 & v, 2) : 2 == e ? (d += int2char(c), d += int2char(v >> 2), c = 3 & v, 3) : (d += int2char(c << 2 | v >> 4), d += int2char(15 & v), 0));\n        return 1 == e && (d += int2char(c << 2)),\n        d\n    }\n    var dbits;\n    dbits = \"Microsoft Internet Explorer\" == navigator.appName ? (BigInteger.prototype.am = function(a, b, c, d, e, f) {\n        for (var g = 32767 & b,\n        h = b >> 15; 0 <= --f;) {\n            var i = 32767 & this[a],\n                j = this[a++] >> 15,\n                k = h * i + j * g;\n            e = ((i = g * i + ((32767 & k) << 15) + c[d] + (1073741823 & e)) >>> 30) + (k >>> 15) + h * j + (e >>> 30),\n            c[d++] = 1073741823 & i\n        }\n        return e\n    },\n    30) : \"Netscape\" != navigator.appName ? (BigInteger.prototype.am = function(a, b, c, d, e, f) {\n        for (; 0 <= --f;) {\n            var g = b * this[a++] + c[d] + e;\n            e = Math.floor(g / 67108864),\n            c[d++] = 67108863 & g\n        }\n        return e\n    },\n    26) : (BigInteger.prototype.am = function(a, b, c, d, e, f) {\n        for (var g = 16383 & b,\n        h = b >> 14; 0 <= --f;) {\n            var i = 16383 & this[a],\n                j = this[a++] >> 14,\n                k = h * i + j * g;\n            e = ((i = g * i + ((16383 & k) << 14) + c[d] + e) >> 28) + (k >> 14) + h * j,\n            c[d++] = 268435455 & i\n        }\n        return e\n    },\n    28),\n    BigInteger.prototype.DB = dbits,\n    BigInteger.prototype.DM = (1 << dbits) - 1,\n    BigInteger.prototype.DV = 1 << dbits;\n    BigInteger.prototype.FV = Math.pow(2, 52),\n    BigInteger.prototype.F1 = 52 - dbits,\n    BigInteger.prototype.F2 = 2 * dbits - 52;\n    var rr, vv, BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\",\n        BI_RC = new Array;\n    for (rr = \"0\".charCodeAt(0), vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n    for (rr = \"a\".charCodeAt(0), vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n    for (rr = \"A\".charCodeAt(0), vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n    Classic.prototype.convert = function(a) {\n        return a.s < 0 || 0 <= a.compareTo(this.m) ? a.mod(this.m) : a\n    },\n    Classic.prototype.revert = function(a) {\n        return a\n    },\n    Classic.prototype.reduce = function(a) {\n        a.divRemTo(this.m, null, a)\n    },\n    Classic.prototype.mulTo = function(a, b, c) {\n        a.multiplyTo(b, c),\n        this.reduce(c)\n    },\n    Classic.prototype.sqrTo = function(a, b) {\n        a.squareTo(b),\n        this.reduce(b)\n    },\n    Montgomery.prototype.convert = function(a) {\n        var b = nbi();\n        return a.abs().dlShiftTo(this.m.t, b),\n        b.divRemTo(this.m, null, b),\n        a.s < 0 && 0 < b.compareTo(BigInteger.ZERO) && this.m.subTo(b, b),\n        b\n    },\n    Montgomery.prototype.revert = function(a) {\n        var b = nbi();\n        return a.copyTo(b),\n        this.reduce(b),\n        b\n    },\n    Montgomery.prototype.reduce = function(a) {\n        for (; a.t <= this.mt2;) a[a.t++] = 0;\n        for (var b = 0; b < this.m.t; ++b) {\n            var c = 32767 & a[b],\n                d = c * this.mpl + ((c * this.mph + (a[b] >> 15) * this.mpl & this.um) << 15) & a.DM;\n            for (a[c = b + this.m.t] += this.m.am(0, d, a, b, 0, this.m.t); a[c] >= a.DV;) a[c] -= a.DV,\n            a[++c]++\n        }\n        a.clamp(),\n        a.drShiftTo(this.m.t, a),\n        0 <= a.compareTo(this.m) && a.subTo(this.m, a)\n    },\n    Montgomery.prototype.mulTo = function(a, b, c) {\n        a.multiplyTo(b, c),\n        this.reduce(c)\n    },\n    Montgomery.prototype.sqrTo = function(a, b) {\n        a.squareTo(b),\n        this.reduce(b)\n    },\n    BigInteger.prototype.copyTo = function(a) {\n        for (var b = this.t - 1; 0 <= b; --b) a[b] = this[b];\n        a.t = this.t,\n        a.s = this.s\n    },\n    BigInteger.prototype.fromInt = function(a) {\n        this.t = 1,\n        this.s = a < 0 ? -1 : 0,\n        0 < a ? this[0] = a : a < -1 ? this[0] = a + DV : this.t = 0\n    },\n    BigInteger.prototype.fromString = function(a, b) {\n        var c;\n        if (16 == b) c = 4;\n        else if (8 == b) c = 3;\n        else if (256 == b) c = 8;\n        else if (2 == b) c = 1;\n        else if (32 == b) c = 5;\n        else {\n            if (4 != b) return void this.fromRadix(a, b);\n            c = 2\n        }\n        this.t = 0,\n        this.s = 0;\n        for (var d = a.length,\n        e = !1,\n        f = 0; 0 <= --d;) {\n            var g = 8 == c ? 255 & a[d] : intAt(a, d);\n            g < 0 ? \"-\" == a.charAt(d) && (e = !0) : (e = !1, 0 == f ? this[this.t++] = g : f + c > this.DB ? (this[this.t - 1] |= (g & (1 << this.DB - f) - 1) << f, this[this.t++] = g >> this.DB - f) : this[this.t - 1] |= g << f, (f += c) >= this.DB && (f -= this.DB))\n        }\n        8 == c && 0 != (128 & a[0]) && (this.s = -1, 0 < f && (this[this.t - 1] |= (1 << this.DB - f) - 1 << f)),\n        this.clamp(),\n        e && BigInteger.ZERO.subTo(this, this)\n    },\n    BigInteger.prototype.clamp = function() {\n        for (var a = this.s & this.DM; 0 < this.t && this[this.t - 1] == a;)--this.t\n    },\n    BigInteger.prototype.dlShiftTo = function(a, b) {\n        var c;\n        for (c = this.t - 1; 0 <= c; --c) b[c + a] = this[c];\n        for (c = a - 1; 0 <= c; --c) b[c] = 0;\n        b.t = this.t + a,\n        b.s = this.s\n    },\n    BigInteger.prototype.drShiftTo = function(a, b) {\n        for (var c = a; c < this.t; ++c) b[c - a] = this[c];\n        b.t = Math.max(this.t - a, 0),\n        b.s = this.s\n    },\n    BigInteger.prototype.lShiftTo = function(a, b) {\n        var c, d = a % this.DB,\n            e = this.DB - d,\n            f = (1 << e) - 1,\n            g = Math.floor(a / this.DB),\n            h = this.s << d & this.DM;\n        for (c = this.t - 1; 0 <= c; --c) b[c + g + 1] = this[c] >> e | h,\n        h = (this[c] & f) << d;\n        for (c = g - 1; 0 <= c; --c) b[c] = 0;\n        b[g] = h,\n        b.t = this.t + g + 1,\n        b.s = this.s,\n        b.clamp()\n    },\n    BigInteger.prototype.rShiftTo = function(a, b) {\n        b.s = this.s;\n        var c = Math.floor(a / this.DB);\n        if (c >= this.t) b.t = 0;\n        else {\n            var d = a % this.DB,\n                e = this.DB - d,\n                f = (1 << d) - 1;\n            b[0] = this[c] >> d;\n            for (var g = c + 1; g < this.t; ++g) b[g - c - 1] |= (this[g] & f) << e,\n            b[g - c] = this[g] >> d;\n            0 < d && (b[this.t - c - 1] |= (this.s & f) << e),\n            b.t = this.t - c,\n            b.clamp()\n        }\n    },\n    BigInteger.prototype.subTo = function(a, b) {\n        for (var c = 0,\n        d = 0,\n        e = Math.min(a.t, this.t); c < e;) d += this[c] - a[c],\n        b[c++] = d & this.DM,\n        d >>= this.DB;\n        if (a.t < this.t) {\n            for (d -= a.s; c < this.t;) d += this[c],\n            b[c++] = d & this.DM,\n            d >>= this.DB;\n            d += this.s\n        } else {\n            for (d += this.s; c < a.t;) d -= a[c],\n            b[c++] = d & this.DM,\n            d >>= this.DB;\n            d -= a.s\n        }\n        b.s = d < 0 ? -1 : 0,\n        d < -1 ? b[c++] = this.DV + d : 0 < d && (b[c++] = d),\n        b.t = c,\n        b.clamp()\n    },\n    BigInteger.prototype.multiplyTo = function(a, b) {\n        var c = this.abs(),\n            d = a.abs(),\n            e = c.t;\n        for (b.t = e + d.t; 0 <= --e;) b[e] = 0;\n        for (e = 0; e < d.t; ++e) b[e + c.t] = c.am(0, d[e], b, e, 0, c.t);\n        b.s = 0,\n        b.clamp(),\n        this.s != a.s && BigInteger.ZERO.subTo(b, b)\n    },\n    BigInteger.prototype.squareTo = function(a) {\n        for (var b = this.abs(), c = a.t = 2 * b.t; 0 <= --c;) a[c] = 0;\n        for (c = 0; c < b.t - 1; ++c) {\n            var d = b.am(c, b[c], a, 2 * c, 0, 1);\n            (a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) >= b.DV && (a[c + b.t] -= b.DV, a[c + b.t + 1] = 1)\n        }\n        0 < a.t && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1)),\n        a.s = 0,\n        a.clamp()\n    },\n    BigInteger.prototype.divRemTo = function(a, b, c) {\n        var d = a.abs();\n        if (!(d.t <= 0)) {\n            var e = this.abs();\n            if (e.t < d.t) return null != b && b.fromInt(0),\n            void(null != c && this.copyTo(c));\n            null == c && (c = nbi());\n            var f = nbi(),\n                g = this.s,\n                h = a.s,\n                i = this.DB - nbits(d[d.t - 1]);\n            0 < i ? (d.lShiftTo(i, f), e.lShiftTo(i, c)) : (d.copyTo(f), e.copyTo(c));\n            var j = f.t,\n                k = f[j - 1];\n            if (0 != k) {\n                var l = k * (1 << this.F1) + (1 < j ? f[j - 2] >> this.F2 : 0),\n                    m = this.FV / l,\n                    n = (1 << this.F1) / l,\n                    o = 1 << this.F2,\n                    p = c.t,\n                    q = p - j,\n                    r = null == b ? nbi() : b;\n                for (f.dlShiftTo(q, r), 0 <= c.compareTo(r) && (c[c.t++] = 1, c.subTo(r, c)), BigInteger.ONE.dlShiftTo(j, r), r.subTo(f, f); f.t < j;) f[f.t++] = 0;\n                for (; 0 <= --q;) {\n                    var s = c[--p] == k ? this.DM : Math.floor(c[p] * m + (c[p - 1] + o) * n);\n                    if ((c[p] += f.am(0, s, c, q, 0, j)) < s) for (f.dlShiftTo(q, r), c.subTo(r, c); c[p] < --s;) c.subTo(r, c)\n                }\n                null != b && (c.drShiftTo(j, b), g != h && BigInteger.ZERO.subTo(b, b)),\n                c.t = j,\n                c.clamp(),\n                0 < i && c.rShiftTo(i, c),\n                g < 0 && BigInteger.ZERO.subTo(c, c)\n            }\n        }\n    },\n    BigInteger.prototype.invDigit = function() {\n        if (this.t < 1) return 0;\n        var a = this[0];\n        if (0 == (1 & a)) return 0;\n        var b = 3 & a;\n        return 0 < (b = (b = (b = (b = b * (2 - (15 & a) * b) & 15) * (2 - (255 & a) * b) & 255) * (2 - ((65535 & a) * b & 65535)) & 65535) * (2 - a * b % this.DV) % this.DV) ? this.DV - b : -b\n    },\n    BigInteger.prototype.isEven = function() {\n        return 0 == (0 < this.t ? 1 & this[0] : this.s)\n    },\n    BigInteger.prototype.exp = function(a, b) {\n        if (4294967295 < a || a < 1) return BigInteger.ONE;\n        var c = nbi(),\n            d = nbi(),\n            e = b.convert(this),\n            f = nbits(a) - 1;\n        for (e.copyTo(c); 0 <= --f;) if (b.sqrTo(c, d), 0 < (a & 1 << f)) b.mulTo(d, e, c);\n        else {\n            var g = c;\n            c = d,\n            d = g\n        }\n        return b.revert(c)\n    },\n    BigInteger.prototype.toString = function(a) {\n        if (this.s < 0) return \"-\" + this.negate().toString(a);\n        var b;\n        if (16 == a) b = 4;\n        else if (8 == a) b = 3;\n        else if (2 == a) b = 1;\n        else if (32 == a) b = 5;\n        else {\n            if (4 != a) return this.toRadix(a);\n            b = 2\n        }\n        var c, d = (1 << b) - 1,\n            e = !1,\n            f = \"\",\n            g = this.t,\n            h = this.DB - g * this.DB % b;\n        if (0 < g--) for (h < this.DB && 0 < (c = this[g] >> h) && (e = !0, f = int2char(c)); 0 <= g;) h < b ? (c = (this[g] & (1 << h) - 1) << b - h, c |= this[--g] >> (h += this.DB - b)) : (c = this[g] >> (h -= b) & d, h <= 0 && (h += this.DB, --g)),\n        0 < c && (e = !0),\n        e && (f += int2char(c));\n        return e ? f : \"0\"\n    },\n    BigInteger.prototype.negate = function() {\n        var a = nbi();\n        return BigInteger.ZERO.subTo(this, a),\n        a\n    },\n    BigInteger.prototype.abs = function() {\n        return this.s < 0 ? this.negate() : this\n    },\n    BigInteger.prototype.compareTo = function(a) {\n        var b = this.s - a.s;\n        if (0 != b) return b;\n        var c = this.t;\n        if (0 != (b = c - a.t)) return this.s < 0 ? -b : b;\n        for (; 0 <= --c;) if (0 != (b = this[c] - a[c])) return b;\n        return 0\n    },\n    BigInteger.prototype.bitLength = function() {\n        return this.t <= 0 ? 0 : this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM)\n    },\n    BigInteger.prototype.mod = function(a) {\n        var b = nbi();\n        return this.abs().divRemTo(a, null, b),\n        this.s < 0 && 0 < b.compareTo(BigInteger.ZERO) && a.subTo(b, b),\n        b\n    },\n    BigInteger.prototype.modPowInt = function(a, b) {\n        var c;\n        return c = a < 256 || b.isEven() ? new Classic(b) : new Montgomery(b),\n        this.exp(a, c)\n    },\n    BigInteger.ZERO = nbv(0),\n    BigInteger.ONE = nbv(1),\n    NullExp.prototype.convert = nNop,\n    NullExp.prototype.revert = nNop,\n    NullExp.prototype.mulTo = function(a, b, c) {\n        a.multiplyTo(b, c)\n    },\n    NullExp.prototype.sqrTo = function(a, b) {\n        a.squareTo(b)\n    },\n    Barrett.prototype.convert = function(a) {\n        if (a.s < 0 || a.t > 2 * this.m.t) return a.mod(this.m);\n        if (a.compareTo(this.m) < 0) return a;\n        var b = nbi();\n        return a.copyTo(b),\n        this.reduce(b),\n        b\n    },\n    Barrett.prototype.revert = function(a) {\n        return a\n    },\n    Barrett.prototype.reduce = function(a) {\n        for (a.drShiftTo(this.m.t - 1, this.r2), a.t > this.m.t + 1 && (a.t = this.m.t + 1, a.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); a.compareTo(this.r2) < 0;) a.dAddOffset(1, this.m.t + 1);\n        for (a.subTo(this.r2, a); 0 <= a.compareTo(this.m);) a.subTo(this.m, a)\n    },\n    Barrett.prototype.mulTo = function(a, b, c) {\n        a.multiplyTo(b, c),\n        this.reduce(c)\n    },\n    Barrett.prototype.sqrTo = function(a, b) {\n        a.squareTo(b),\n        this.reduce(b)\n    };\n    var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997],\n        lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\n    BigInteger.prototype.chunkSize = function(a) {\n        return Math.floor(Math.LN2 * this.DB / Math.log(a))\n    },\n    BigInteger.prototype.toRadix = function(a) {\n        if (null == a && (a = 10), 0 == this.signum() || a < 2 || 36 < a) return \"0\";\n        var b = this.chunkSize(a),\n            c = Math.pow(a, b),\n            d = nbv(c),\n            e = nbi(),\n            f = nbi(),\n            g = \"\";\n        for (this.divRemTo(d, e, f); 0 < e.signum();) g = (c + f.intValue()).toString(a).substr(1) + g,\n        e.divRemTo(d, e, f);\n        return f.intValue().toString(a) + g\n    },\n    BigInteger.prototype.fromRadix = function(a, b) {\n        this.fromInt(0),\n        null == b && (b = 10);\n        for (var c = this.chunkSize(b), d = Math.pow(b, c), e = !1, f = 0, g = 0, h = 0; h < a.length; ++h) {\n            var i = intAt(a, h);\n            i < 0 ? \"-\" == a.charAt(h) && 0 == this.signum() && (e = !0) : (g = b * g + i, ++f >= c && (this.dMultiply(d), this.dAddOffset(g, 0), g = f = 0))\n        }\n        0 < f && (this.dMultiply(Math.pow(b, f)), this.dAddOffset(g, 0)),\n        e && BigInteger.ZERO.subTo(this, this)\n    },\n    BigInteger.prototype.fromNumber = function(a, b, c) {\n        if (\"number\" == typeof b) if (a < 2) this.fromInt(1);\n        else for (this.fromNumber(a, c), this.testBit(a - 1) || this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(b);) this.dAddOffset(2, 0),\n        this.bitLength() > a && this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);\n        else {\n            var d = new Array,\n                e = 7 & a;\n            d.length = 1 + (a >> 3),\n            b.nextBytes(d),\n            0 < e ? d[0] &= (1 << e) - 1 : d[0] = 0,\n            this.fromString(d, 256)\n        }\n    },\n    BigInteger.prototype.bitwiseTo = function(a, b, c) {\n        var d, e, f = Math.min(a.t, this.t);\n        for (d = 0; d < f; ++d) c[d] = b(this[d], a[d]);\n        if (a.t < this.t) {\n            for (e = a.s & this.DM, d = f; d < this.t; ++d) c[d] = b(this[d], e);\n            c.t = this.t\n        } else {\n            for (e = this.s & this.DM, d = f; d < a.t; ++d) c[d] = b(e, a[d]);\n            c.t = a.t\n        }\n        c.s = b(this.s, a.s),\n        c.clamp()\n    },\n    BigInteger.prototype.changeBit = function(a, b) {\n        var c = BigInteger.ONE.shiftLeft(a);\n        return this.bitwiseTo(c, b, c),\n        c\n    },\n    BigInteger.prototype.addTo = function(a, b) {\n        for (var c = 0,\n        d = 0,\n        e = Math.min(a.t, this.t); c < e;) d += this[c] + a[c],\n        b[c++] = d & this.DM,\n        d >>= this.DB;\n        if (a.t < this.t) {\n            for (d += a.s; c < this.t;) d += this[c],\n            b[c++] = d & this.DM,\n            d >>= this.DB;\n            d += this.s\n        } else {\n            for (d += this.s; c < a.t;) d += a[c],\n            b[c++] = d & this.DM,\n            d >>= this.DB;\n            d += a.s\n        }\n        b.s = d < 0 ? -1 : 0,\n        0 < d ? b[c++] = d : d < -1 && (b[c++] = this.DV + d),\n        b.t = c,\n        b.clamp()\n    },\n    BigInteger.prototype.dMultiply = function(a) {\n        this[this.t] = this.am(0, a - 1, this, 0, 0, this.t), ++this.t,\n        this.clamp()\n    },\n    BigInteger.prototype.dAddOffset = function(a, b) {\n        if (0 != a) {\n            for (; this.t <= b;) this[this.t++] = 0;\n            for (this[b] += a; this[b] >= this.DV;) this[b] -= this.DV, ++b >= this.t && (this[this.t++] = 0), ++this[b]\n        }\n    },\n    BigInteger.prototype.multiplyLowerTo = function(a, b, c) {\n        var e, d = Math.min(this.t + a.t, b);\n        for (c.s = 0, c.t = d; 0 < d;) c[--d] = 0;\n        for (e = c.t - this.t; d < e; ++d) c[d + this.t] = this.am(0, a[d], c, d, 0, this.t);\n        for (e = Math.min(a.t, b); d < e; ++d) this.am(0, a[d], c, d, 0, b - d);\n        c.clamp()\n    },\n    BigInteger.prototype.multiplyUpperTo = function(a, b, c) {\n        --b;\n        var d = c.t = this.t + a.t - b;\n        for (c.s = 0; 0 <= --d;) c[d] = 0;\n        for (d = Math.max(b - this.t, 0); d < a.t; ++d) c[this.t + d - b] = this.am(b - d, a[d], c, 0, 0, this.t + d - b);\n        c.clamp(),\n        c.drShiftTo(1, c)\n    },\n    BigInteger.prototype.modInt = function(a) {\n        if (a <= 0) return 0;\n        var b = this.DV % a,\n            c = this.s < 0 ? a - 1 : 0;\n        if (0 < this.t) if (0 == b) c = this[0] % a;\n        else for (var d = this.t - 1; 0 <= d; --d) c = (b * c + this[d]) % a;\n        return c\n    },\n    BigInteger.prototype.millerRabin = function(a) {\n        var b = this.subtract(BigInteger.ONE),\n            c = b.getLowestSetBit();\n        if (c <= 0) return !1;\n        var d = b.shiftRight(c);\n        lowprimes.length < (a = a + 1 >> 1) && (a = lowprimes.length);\n        for (var e = nbi(), f = 0; f < a; ++f) {\n            e.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);\n            var g = e.modPow(d, this);\n            if (0 != g.compareTo(BigInteger.ONE) && 0 != g.compareTo(b)) {\n                for (var h = 1; h++ < c && 0 != g.compareTo(b);) if (0 == (g = g.modPowInt(2, this)).compareTo(BigInteger.ONE)) return !1;\n                if (0 != g.compareTo(b)) return !1\n            }\n        }\n        return !0\n    },\n    BigInteger.prototype.clone = function() {\n        var a = nbi();\n        return this.copyTo(a),\n        a\n    },\n    BigInteger.prototype.intValue = function() {\n        if (this.s < 0) {\n            if (1 == this.t) return this[0] - this.DV;\n            if (0 == this.t) return -1\n        } else {\n            if (1 == this.t) return this[0];\n            if (0 == this.t) return 0\n        }\n        return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]\n    },\n    BigInteger.prototype.byteValue = function() {\n        return 0 == this.t ? this.s : this[0] << 24 >> 24\n    },\n    BigInteger.prototype.shortValue = function() {\n        return 0 == this.t ? this.s : this[0] << 16 >> 16\n    },\n    BigInteger.prototype.signum = function() {\n        return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1\n    },\n    BigInteger.prototype.toByteArray = function() {\n        var a = this.t,\n            b = new Array;\n        b[0] = this.s;\n        var c, d = this.DB - a * this.DB % 8,\n            e = 0;\n        if (0 < a--) for (d < this.DB && (c = this[a] >> d) != (this.s & this.DM) >> d && (b[e++] = c | this.s << this.DB - d); 0 <= a;) d < 8 ? (c = (this[a] & (1 << d) - 1) << 8 - d, c |= this[--a] >> (d += this.DB - 8)) : (c = this[a] >> (d -= 8) & 255, d <= 0 && (d += this.DB, --a)),\n        0 != (128 & c) && (c |= -256),\n        0 == e && (128 & this.s) != (128 & c) && ++e, (0 < e || c != this.s) && (b[e++] = c);\n        return b\n    },\n    BigInteger.prototype.equals = function(a) {\n        return 0 == this.compareTo(a)\n    },\n    BigInteger.prototype.min = function(a) {\n        return this.compareTo(a) < 0 ? this : a\n    },\n    BigInteger.prototype.max = function(a) {\n        return 0 < this.compareTo(a) ? this : a\n    },\n    BigInteger.prototype.and = function(a) {\n        var b = nbi();\n        return this.bitwiseTo(a, op_and, b),\n        b\n    },\n    BigInteger.prototype.or = function(a) {\n        var b = nbi();\n        return this.bitwiseTo(a, op_or, b),\n        b\n    },\n    BigInteger.prototype.xor = function(a) {\n        var b = nbi();\n        return this.bitwiseTo(a, op_xor, b),\n        b\n    },\n    BigInteger.prototype.andNot = function(a) {\n        var b = nbi();\n        return this.bitwiseTo(a, op_andnot, b),\n        b\n    },\n    BigInteger.prototype.not = function() {\n        for (var a = nbi(), b = 0; b < this.t; ++b) a[b] = this.DM & ~this[b];\n        return a.t = this.t,\n        a.s = ~this.s,\n        a\n    },\n    BigInteger.prototype.shiftLeft = function(a) {\n        var b = nbi();\n        return a < 0 ? this.rShiftTo(-a, b) : this.lShiftTo(a, b),\n        b\n    },\n    BigInteger.prototype.shiftRight = function(a) {\n        var b = nbi();\n        return a < 0 ? this.lShiftTo(-a, b) : this.rShiftTo(a, b),\n        b\n    },\n    BigInteger.prototype.getLowestSetBit = function() {\n        for (var a = 0; a < this.t; ++a) if (0 != this[a]) return a * this.DB + lbit(this[a]);\n        return this.s < 0 ? this.t * this.DB : -1\n    },\n    BigInteger.prototype.bitCount = function() {\n        for (var a = 0,\n        b = this.s & this.DM,\n        c = 0; c < this.t; ++c) a += cbit(this[c] ^ b);\n        return a\n    },\n    BigInteger.prototype.testBit = function(a) {\n        var b = Math.floor(a / this.DB);\n        return b >= this.t ? 0 != this.s : 0 != (this[b] & 1 << a % this.DB)\n    },\n    BigInteger.prototype.setBit = function(a) {\n        return this.changeBit(a, op_or)\n    },\n    BigInteger.prototype.clearBit = function(a) {\n        return this.changeBit(a, op_andnot)\n    },\n    BigInteger.prototype.flipBit = function(a) {\n        return this.changeBit(a, op_xor)\n    },\n    BigInteger.prototype.add = function(a) {\n        var b = nbi();\n        return this.addTo(a, b),\n        b\n    },\n    BigInteger.prototype.subtract = function(a) {\n        var b = nbi();\n        return this.subTo(a, b),\n        b\n    },\n    BigInteger.prototype.multiply = function(a) {\n        var b = nbi();\n        return this.multiplyTo(a, b),\n        b\n    },\n    BigInteger.prototype.divide = function(a) {\n        var b = nbi();\n        return this.divRemTo(a, b, null),\n        b\n    },\n    BigInteger.prototype.remainder = function(a) {\n        var b = nbi();\n        return this.divRemTo(a, null, b),\n        b\n    },\n    BigInteger.prototype.divideAndRemainder = function(a) {\n        var b = nbi(),\n            c = nbi();\n        return this.divRemTo(a, b, c),\n        new Array(b, c)\n    },\n    BigInteger.prototype.modPow = function(a, b) {\n        var c, d, e = a.bitLength(),\n            f = nbv(1);\n        if (e <= 0) return f;\n        c = e < 18 ? 1 : e < 48 ? 3 : e < 144 ? 4 : e < 768 ? 5 : 6,\n        d = e < 8 ? new Classic(b) : b.isEven() ? new Barrett(b) : new Montgomery(b);\n        var g = new Array,\n            h = 3,\n            i = c - 1,\n            j = (1 << c) - 1;\n        if (g[1] = d.convert(this), 1 < c) {\n            var k = nbi();\n            for (d.sqrTo(g[1], k); h <= j;) g[h] = nbi(),\n            d.mulTo(k, g[h - 2], g[h]),\n            h += 2\n        }\n        var l, m, n = a.t - 1,\n            o = !0,\n            p = nbi();\n        for (e = nbits(a[n]) - 1; 0 <= n;) {\n            for (i <= e ? l = a[n] >> e - i & j : (l = (a[n] & (1 << e + 1) - 1) << i - e, 0 < n && (l |= a[n - 1] >> this.DB + e - i)), h = c; 0 == (1 & l);) l >>= 1, --h;\n            if ((e -= h) < 0 && (e += this.DB, --n), o) g[l].copyTo(f),\n            o = !1;\n            else {\n                for (; 1 < h;) d.sqrTo(f, p),\n                d.sqrTo(p, f),\n                h -= 2;\n                0 < h ? d.sqrTo(f, p) : (m = f, f = p, p = m),\n                d.mulTo(p, g[l], f)\n            }\n            for (; 0 <= n && 0 == (a[n] & 1 << e);) d.sqrTo(f, p),\n            m = f,\n            f = p,\n            p = m, --e < 0 && (e = this.DB - 1, --n)\n        }\n        return d.revert(f)\n    },\n    BigInteger.prototype.modInverse = function(a) {\n        var b = a.isEven();\n        if (this.isEven() && b || 0 == a.signum()) return BigInteger.ZERO;\n        for (var c = a.clone(), d = this.clone(), e = nbv(1), f = nbv(0), g = nbv(0), h = nbv(1); 0 != c.signum();) {\n            for (; c.isEven();) c.rShiftTo(1, c),\n            b ? (e.isEven() && f.isEven() || (e.addTo(this, e), f.subTo(a, f)), e.rShiftTo(1, e)) : f.isEven() || f.subTo(a, f),\n            f.rShiftTo(1, f);\n            for (; d.isEven();) d.rShiftTo(1, d),\n            b ? (g.isEven() && h.isEven() || (g.addTo(this, g), h.subTo(a, h)), g.rShiftTo(1, g)) : h.isEven() || h.subTo(a, h),\n            h.rShiftTo(1, h);\n            0 <= c.compareTo(d) ? (c.subTo(d, c), b && e.subTo(g, e), f.subTo(h, f)) : (d.subTo(c, d), b && g.subTo(e, g), h.subTo(f, h))\n        }\n        return 0 != d.compareTo(BigInteger.ONE) ? BigInteger.ZERO : 0 <= h.compareTo(a) ? h.subtract(a) : h.signum() < 0 ? (h.addTo(a, h), h.signum() < 0 ? h.add(a) : h) : h\n    },\n    BigInteger.prototype.pow = function(a) {\n        return this.exp(a, new NullExp)\n    },\n    BigInteger.prototype.gcd = function(a) {\n        var b = this.s < 0 ? this.negate() : this.clone(),\n            c = a.s < 0 ? a.negate() : a.clone();\n        if (b.compareTo(c) < 0) {\n            var d = b;\n            b = c,\n            c = d\n        }\n        var e = b.getLowestSetBit(),\n            f = c.getLowestSetBit();\n        if (f < 0) return b;\n        for (e < f && (f = e), 0 < f && (b.rShiftTo(f, b), c.rShiftTo(f, c)); 0 < b.signum();) 0 < (e = b.getLowestSetBit()) && b.rShiftTo(e, b),\n        0 < (e = c.getLowestSetBit()) && c.rShiftTo(e, c),\n        0 <= b.compareTo(c) ? (b.subTo(c, b), b.rShiftTo(1, b)) : (c.subTo(b, c), c.rShiftTo(1, c));\n        return 0 < f && c.lShiftTo(f, c),\n        c\n    },\n    BigInteger.prototype.isProbablePrime = function(a) {\n        var b, c = this.abs();\n        if (1 == c.t && c[0] <= lowprimes[lowprimes.length - 1]) {\n            for (b = 0; b < lowprimes.length; ++b) if (c[0] == lowprimes[b]) return !0;\n            return !1\n        }\n        if (c.isEven()) return !1;\n        for (b = 1; b < lowprimes.length;) {\n            for (var d = lowprimes[b], e = b + 1; e < lowprimes.length && d < lplim;) d *= lowprimes[e++];\n            for (d = c.modInt(d); b < e;) if (d % lowprimes[b++] == 0) return !1\n        }\n        return c.millerRabin(a)\n    },\n    BigInteger.prototype.square = function() {\n        var a = nbi();\n        return this.squareTo(a),\n        a\n    },\n    Arcfour.prototype.init = function(a) {\n        var b, c, d;\n        for (b = 0; b < 256; ++b) this.S[b] = b;\n        for (b = c = 0; b < 256; ++b) c = c + this.S[b] + a[b % a.length] & 255,\n        d = this.S[b],\n        this.S[b] = this.S[c],\n        this.S[c] = d;\n        this.i = 0,\n        this.j = 0\n    },\n    Arcfour.prototype.next = function() {\n        var a;\n        return this.i = this.i + 1 & 255,\n        this.j = this.j + this.S[this.i] & 255,\n        a = this.S[this.i],\n        this.S[this.i] = this.S[this.j],\n        this.S[this.j] = a,\n        this.S[a + this.S[this.i] & 255]\n    };\n    var rng_state, rng_pool, rng_pptr, rng_psize = 256;\n    if (null == rng_pool) {\n        var t;\n        if (rng_pool = new Array, rng_pptr = 0, window.crypto && window.crypto.getRandomValues) {\n            var z = new Uint32Array(256);\n            for (window.crypto.getRandomValues(z), t = 0; t < z.length; ++t) rng_pool[rng_pptr++] = 255 & z[t]\n        }\n        var onMouseMoveListener = function(a) {\n            if (this.count = this.count || 0, 256 <= this.count || rng_psize <= rng_pptr) window.removeEventListener ? window.removeEventListener(\"mousemove\", onMouseMoveListener) : window.detachEvent && window.detachEvent(\"onmousemove\", onMouseMoveListener);\n            else {\n                this.count += 1;\n                var b = a.x + a.y;\n                rng_pool[rng_pptr++] = 255 & b\n            }\n        };\n        window.addEventListener ? window.addEventListener(\"mousemove\", onMouseMoveListener) : window.attachEvent && window.attachEvent(\"onmousemove\", onMouseMoveListener)\n    }\n    SecureRandom.prototype.nextBytes = function(a) {\n        var b;\n        for (b = 0; b < a.length; ++b) a[b] = rng_get_byte()\n    },\n    RSAKey.prototype.doPublic = function(a) {\n        return a.modPowInt(this.e, this.n)\n    },\n    RSAKey.prototype.setPublic = function(a, b) {\n        null != a && null != b && 0 < a.length && 0 < b.length ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16)) : console.error(\"Invalid RSA public key\")\n    },\n    RSAKey.prototype.encrypt = function(a) {\n        var b = function(a, b) {\n            if (b < a.length + 11) return console.error(\"Message too long for RSA\"),\n            null;\n            for (var c = new Array,\n            d = a.length - 1; 0 <= d && 0 < b;) {\n                var e = a.charCodeAt(d--);\n                e < 128 ? c[--b] = e : 127 < e && e < 2048 ? (c[--b] = 63 & e | 128, c[--b] = e >> 6 | 192) : (c[--b] = 63 & e | 128, c[--b] = e >> 6 & 63 | 128, c[--b] = e >> 12 | 224)\n            }\n            c[--b] = 0;\n            for (var f = new SecureRandom,\n            g = new Array; 2 < b;) {\n                for (g[0] = 0; 0 == g[0];) f.nextBytes(g);\n                c[--b] = g[0]\n            }\n            return c[--b] = 2,\n            c[--b] = 0,\n            new BigInteger(c)\n        }(a, this.n.bitLength() + 7 >> 3);\n        if (null == b) return null;\n        var c = this.doPublic(b);\n        if (null == c) return null;\n        var d = c.toString(16);\n        return 0 == (1 & d.length) ? d : \"0\" + d\n    },\n    RSAKey.prototype.doPrivate = function(a) {\n        if (null == this.p || null == this.q) return a.modPow(this.d, this.n);\n        for (var b = a.mod(this.p).modPow(this.dmp1, this.p), c = a.mod(this.q).modPow(this.dmq1, this.q); b.compareTo(c) < 0;) b = b.add(this.p);\n        return b.subtract(c).multiply(this.coeff).mod(this.p).multiply(this.q).add(c)\n    },\n    RSAKey.prototype.setPrivate = function(a, b, c) {\n        null != a && null != b && 0 < a.length && 0 < b.length ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16), this.d = parseBigInt(c, 16)) : console.error(\"Invalid RSA private key\")\n    },\n    RSAKey.prototype.setPrivateEx = function(a, b, c, d, e, f, g, h) {\n        null != a && null != b && 0 < a.length && 0 < b.length ? (this.n = parseBigInt(a, 16), this.e = parseInt(b, 16), this.d = parseBigInt(c, 16), this.p = parseBigInt(d, 16), this.q = parseBigInt(e, 16), this.dmp1 = parseBigInt(f, 16), this.dmq1 = parseBigInt(g, 16), this.coeff = parseBigInt(h, 16)) : console.error(\"Invalid RSA private key\")\n    },\n    RSAKey.prototype.generate = function(a, b) {\n        var c = new SecureRandom,\n            d = a >> 1;\n        this.e = parseInt(b, 16);\n        for (var e = new BigInteger(b, 16);;) {\n            for (; this.p = new BigInteger(a - d, 1, c), 0 != this.p.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE) || !this.p.isProbablePrime(10););\n            for (; this.q = new BigInteger(d, 1, c), 0 != this.q.subtract(BigInteger.ONE).gcd(e).compareTo(BigInteger.ONE) || !this.q.isProbablePrime(10););\n            if (this.p.compareTo(this.q) <= 0) {\n                var f = this.p;\n                this.p = this.q,\n                this.q = f\n            }\n            var g = this.p.subtract(BigInteger.ONE),\n                h = this.q.subtract(BigInteger.ONE),\n                i = g.multiply(h);\n            if (0 == i.gcd(e).compareTo(BigInteger.ONE)) {\n                this.n = this.p.multiply(this.q),\n                this.d = e.modInverse(i),\n                this.dmp1 = this.d.mod(g),\n                this.dmq1 = this.d.mod(h),\n                this.coeff = this.q.modInverse(this.p);\n                break\n            }\n        }\n    },\n    RSAKey.prototype.decrypt = function(a) {\n        var b = parseBigInt(a, 16),\n            c = this.doPrivate(b);\n        return null == c ? null : function(a, b) {\n            for (var c = a.toByteArray(), d = 0; d < c.length && 0 == c[d];)++d;\n            if (c.length - d != b - 1 || 2 != c[d]) return null;\n            for (++d; 0 != c[d];) if (++d >= c.length) return null;\n            for (var e = \"\"; ++d < c.length;) {\n                var f = 255 & c[d];\n                f < 128 ? e += String.fromCharCode(f) : 191 < f && f < 224 ? (e += String.fromCharCode((31 & f) << 6 | 63 & c[d + 1]), ++d) : (e += String.fromCharCode((15 & f) << 12 | (63 & c[d + 1]) << 6 | 63 & c[d + 2]), d += 2)\n            }\n            return e\n        }(c, this.n.bitLength() + 7 >> 3)\n    },\n\n    function() {\n        RSAKey.prototype.generateAsync = function(a, b, c) {\n            var d = new SecureRandom,\n                e = a >> 1;\n            this.e = parseInt(b, 16);\n            var f = new BigInteger(b, 16),\n                g = this,\n                h = function() {\n                    var b = function() {\n                        if (g.p.compareTo(g.q) <= 0) {\n                            var a = g.p;\n                            g.p = g.q,\n                            g.q = a\n                        }\n                        var b = g.p.subtract(BigInteger.ONE),\n                            d = g.q.subtract(BigInteger.ONE),\n                            e = b.multiply(d);\n                        0 == e.gcd(f).compareTo(BigInteger.ONE) ? (g.n = g.p.multiply(g.q), g.d = f.modInverse(e), g.dmp1 = g.d.mod(b), g.dmq1 = g.d.mod(d), g.coeff = g.q.modInverse(g.p), setTimeout(function() {\n                            c()\n                        },\n                        0)) : setTimeout(h, 0)\n                    },\n                    i = function() {\n                        g.q = nbi(),\n                        g.q.fromNumberAsync(e, 1, d,\n\n                        function() {\n                            g.q.subtract(BigInteger.ONE).gcda(f,\n\n                            function(a) {\n                                0 == a.compareTo(BigInteger.ONE) && g.q.isProbablePrime(10) ? setTimeout(b, 0) : setTimeout(i, 0)\n                            })\n                        })\n                    },\n                    j = function() {\n                        g.p = nbi(),\n                        g.p.fromNumberAsync(a - e, 1, d,\n\n                        function() {\n                            g.p.subtract(BigInteger.ONE).gcda(f,\n\n                            function(a) {\n                                0 == a.compareTo(BigInteger.ONE) && g.p.isProbablePrime(10) ? setTimeout(i, 0) : setTimeout(j, 0)\n                            })\n                        })\n                    };\n                    setTimeout(j, 0)\n                };\n            setTimeout(h, 0)\n        };\n        BigInteger.prototype.gcda = function(a, b) {\n            var c = this.s < 0 ? this.negate() : this.clone(),\n                d = a.s < 0 ? a.negate() : a.clone();\n            if (c.compareTo(d) < 0) {\n                var e = c;\n                c = d,\n                d = e\n            }\n            var f = c.getLowestSetBit(),\n                g = d.getLowestSetBit();\n            if (g < 0) b(c);\n            else {\n                f < g && (g = f),\n                0 < g && (c.rShiftTo(g, c), d.rShiftTo(g, d));\n                var h = function() {\n                    0 < (f = c.getLowestSetBit()) && c.rShiftTo(f, c),\n                    0 < (f = d.getLowestSetBit()) && d.rShiftTo(f, d),\n                    0 <= c.compareTo(d) ? (c.subTo(d, c), c.rShiftTo(1, c)) : (d.subTo(c, d), d.rShiftTo(1, d)),\n                    0 < c.signum() ? setTimeout(h, 0) : (0 < g && d.lShiftTo(g, d), setTimeout(function() {\n                        b(d)\n                    },\n                    0))\n                };\n                setTimeout(h, 10)\n            }\n        };\n        BigInteger.prototype.fromNumberAsync = function(a, b, c, d) {\n            if (\"number\" == typeof b) if (a < 2) this.fromInt(1);\n            else {\n                this.fromNumber(a, c),\n                this.testBit(a - 1) || this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this),\n                this.isEven() && this.dAddOffset(1, 0);\n                var e = this,\n                    f = function() {\n                        e.dAddOffset(2, 0),\n                        e.bitLength() > a && e.subTo(BigInteger.ONE.shiftLeft(a - 1), e),\n                        e.isProbablePrime(b) ? setTimeout(function() {\n                            d()\n                        },\n                        0) : setTimeout(f, 0)\n                    };\n                setTimeout(f, 0)\n            } else {\n                var g = new Array,\n                    h = 7 & a;\n                g.length = 1 + (a >> 3),\n                b.nextBytes(g),\n                0 < h ? g[0] &= (1 << h) - 1 : g[0] = 0,\n                this.fromString(g, 256)\n            }\n        }\n    }();\n    var b64map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n        b64pad = \"=\",\n        JSX = JSX || {};\n    JSX.env = JSX.env || {};\n    var L = JSX,\n        OP = Object.prototype,\n        ADD = [\"toString\", \"valueOf\"];\n    JSX.env.parseUA = function(a) {\n        function c(a) {\n            var b = 0;\n            return parseFloat(a.replace(/\\./g,\n\n            function() {\n                return 1 == b++ ? \"\" : \".\"\n            }))\n        }\n        var b, d = navigator,\n            e = {\n                ie: 0,\n                opera: 0,\n                gecko: 0,\n                webkit: 0,\n                chrome: 0,\n                mobile: null,\n                air: 0,\n                ipad: 0,\n                iphone: 0,\n                ipod: 0,\n                ios: null,\n                android: 0,\n                webos: 0,\n                caja: d && d.cajaVersion,\n                secure: !1,\n                os: null\n            },\n            f = a || navigator && navigator.userAgent,\n            g = window && window.location,\n            h = g && g.href;\n        return e.secure = h && 0 === h.toLowerCase().indexOf(\"https\"),\n        f && (/windows|win32/i.test(f) ? e.os = \"windows\" : /macintosh/i.test(f) ? e.os = \"macintosh\" : /rhino/i.test(f) && (e.os = \"rhino\"), /KHTML/.test(f) && (e.webkit = 1), (b = f.match(/AppleWebKit\\/([^\\s]*)/)) && b[1] && (e.webkit = c(b[1]), / Mobile\\//.test(f) ? (e.mobile = \"Apple\", (b = f.match(/OS ([^\\s]*)/)) && b[1] && (b = c(b[1].replace(\"_\", \".\"))), e.ios = b, e.ipad = e.ipod = e.iphone = 0, (b = f.match(/iPad|iPod|iPhone/)) && b[0] && (e[b[0].toLowerCase()] = e.ios)) : ((b = f.match(/NokiaN[^\\/]*|Android \\d\\.\\d|webOS\\/\\d\\.\\d/)) && (e.mobile = b[0]), /webOS/.test(f) && (e.mobile = \"WebOS\", (b = f.match(/webOS\\/([^\\s]*);/)) && b[1] && (e.webos = c(b[1]))), / Android/.test(f) && (e.mobile = \"Android\", (b = f.match(/Android ([^\\s]*);/)) && b[1] && (e.android = c(b[1])))), (b = f.match(/Chrome\\/([^\\s]*)/)) && b[1] ? e.chrome = c(b[1]) : (b = f.match(/AdobeAIR\\/([^\\s]*)/)) && (e.air = b[0])), e.webkit || ((b = f.match(/Opera[\\s\\/]([^\\s]*)/)) && b[1] ? (e.opera = c(b[1]), (b = f.match(/Version\\/([^\\s]*)/)) && b[1] && (e.opera = c(b[1])), (b = f.match(/Opera Mini[^;]*/)) && (e.mobile = b[0])) : (b = f.match(/MSIE\\s([^;]*)/)) && b[1] ? e.ie = c(b[1]) : (b = f.match(/Gecko\\/([^\\s]*)/)) && (e.gecko = 1, (b = f.match(/rv:([^\\s\\)]*)/)) && b[1] && (e.gecko = c(b[1]))))),\n        e\n    },\n    JSX.env.ua = JSX.env.parseUA(),\n    JSX.isFunction = function(a) {\n        return \"function\" == typeof a || \"[object Function]\" === OP.toString.apply(a)\n    },\n    JSX._IEEnumFix = JSX.env.ua.ie ? function(a, b) {\n        var c, d, e;\n        for (c = 0; c < ADD.length; c += 1) e = b[d = ADD[c]],\n        L.isFunction(e) && e != OP[d] && (a[d] = e)\n    } : function() {},\n    JSX.extend = function(a, b, c) {\n        if (!b || !a) throw new Error(\"extend failed, please check that all dependencies are included.\");\n\n        function e() {}\n        var d;\n        if (e.prototype = b.prototype, a.prototype = new e, (a.prototype.constructor = a).superclass = b.prototype, b.prototype.constructor == OP.constructor && (b.prototype.constructor = b), c) {\n            for (d in c) L.hasOwnProperty(c, d) && (a.prototype[d] = c[d]);\n            L._IEEnumFix(a.prototype, c)\n        }\n    },\n        \"undefined\" != typeof KJUR && KJUR || (KJUR = {}),\n    void 0 !== KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}),\n    KJUR.asn1.ASN1Util = new\n\n    function() {\n        this.integerToByteHex = function(a) {\n            var b = a.toString(16);\n            return b.length % 2 == 1 && (b = \"0\" + b),\n            b\n        },\n        this.bigIntToMinTwosComplementsHex = function(a) {\n            var b = a.toString(16);\n            if (\"-\" != b.substr(0, 1)) b.length % 2 == 1 ? b = \"0\" + b : b.match(/^[0-7]/) || (b = \"00\" + b);\n            else {\n                var d = b.substr(1).length;\n                d % 2 == 1 ? d += 1 : b.match(/^[0-7]/) || (d += 2);\n                for (var e = \"\",\n                f = 0; f < d; f++) e += \"f\";\n                b = new BigInteger(e, 16).xor(a).add(BigInteger.ONE).toString(16).replace(/^-/, \"\")\n            }\n            return b\n        },\n        this.getPEMStringFromHex = function(a, b) {\n            var c = CryptoJS.enc.Hex.parse(a),\n                e = CryptoJS.enc.Base64.stringify(c).replace(/(.{64})/g, \"$1\\r\\n\");\n            return \"-----BEGIN \" + b + \"-----\\r\\n\" + (e = e.replace(/\\r\\n$/, \"\")) + \"\\r\\n-----END \" + b + \"-----\\r\\n\"\n        }\n    },\n    KJUR.asn1.ASN1Object = function() {\n        this.getLengthHexFromValue = function() {\n            if (void 0 === this.hV || null == this.hV) throw \"this.hV is null or undefined.\";\n            if (this.hV.length % 2 == 1) throw \"value hex must be even length: n=\" + \"\".length + \",v=\" + this.hV;\n            var b = this.hV.length / 2,\n                c = b.toString(16);\n            if (c.length % 2 == 1 && (c = \"0\" + c), b < 128) return c;\n            var d = c.length / 2;\n            if (15 < d) throw \"ASN.1 length too long to represent by 8x: n = \" + b.toString(16);\n            return (128 + d).toString(16) + c\n        },\n        this.getEncodedHex = function() {\n            return null != this.hTLV && !this.isModified || (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1),\n            this.hTLV\n        },\n        this.getValueHex = function() {\n            return this.getEncodedHex(),\n            this.hV\n        },\n        this.getFreshValueHex = function() {\n            return \"\"\n        }\n    },\n    KJUR.asn1.DERAbstractString = function(a) {\n        KJUR.asn1.DERAbstractString.superclass.constructor.call(this),\n        this.getString = function() {\n            return this.s\n        },\n        this.setString = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = a,\n            this.hV = stohex(this.s)\n        },\n        this.setStringHex = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = null,\n            this.hV = a\n        },\n        this.getFreshValueHex = function() {\n            return this.hV\n        },\n        void 0 !== a && (void 0 !== a.str ? this.setString(a.str) : void 0 !== a.hex && this.setStringHex(a.hex))\n    },\n    JSX.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERAbstractTime = function() {\n        KJUR.asn1.DERAbstractTime.superclass.constructor.call(this),\n        this.localDateToUTC = function(a) {\n            return utc = a.getTime() + 6e4 * a.getTimezoneOffset(),\n            new Date(utc)\n        },\n        this.formatDate = function(a, b) {\n            var c = this.zeroPadding,\n                d = this.localDateToUTC(a),\n                e = String(d.getFullYear());\n            return \"utc\" == b && (e = e.substr(2, 2)),\n            e + c(String(d.getMonth() + 1), 2) + c(String(d.getDate()), 2) + c(String(d.getHours()), 2) + c(String(d.getMinutes()), 2) + c(String(d.getSeconds()), 2) + \"Z\"\n        },\n        this.zeroPadding = function(a, b) {\n            return a.length >= b ? a : new Array(b - a.length + 1).join(\"0\") + a\n        },\n        this.getString = function() {\n            return this.s\n        },\n        this.setString = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = a,\n            this.hV = stohex(this.s)\n        },\n        this.setByDateValue = function(a, b, c, d, e, f) {\n            var g = new Date(Date.UTC(a, b - 1, c, d, e, f, 0));\n            this.setByDate(g)\n        },\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n    },\n    JSX.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERAbstractStructured = function(a) {\n        KJUR.asn1.DERAbstractString.superclass.constructor.call(this),\n        this.setByASN1ObjectArray = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.asn1Array = a\n        },\n        this.appendASN1Object = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.asn1Array.push(a)\n        },\n        this.asn1Array = new Array,\n        void 0 !== a && void 0 !== a.array && (this.asn1Array = a.array)\n    },\n    JSX.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERBoolean = function() {\n        KJUR.asn1.DERBoolean.superclass.constructor.call(this),\n        this.hT = \"01\",\n        this.hTLV = \"0101ff\"\n    },\n    JSX.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERInteger = function(a) {\n        KJUR.asn1.DERInteger.superclass.constructor.call(this),\n        this.hT = \"02\",\n        this.setByBigInteger = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(a)\n        },\n        this.setByInteger = function(a) {\n            var b = new BigInteger(String(a), 10);\n            this.setByBigInteger(b)\n        },\n        this.setValueHex = function(a) {\n            this.hV = a\n        },\n        this.getFreshValueHex = function() {\n            return this.hV\n        },\n        void 0 !== a && (void 0 !== a.bigint ? this.setByBigInteger(a.bigint) : void 0 !== a.int ? this.setByInteger(a.int) : void 0 !== a.hex && this.setValueHex(a.hex))\n    },\n    JSX.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERBitString = function(a) {\n        KJUR.asn1.DERBitString.superclass.constructor.call(this),\n        this.hT = \"03\",\n        this.setHexValueIncludingUnusedBits = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = a\n        },\n        this.setUnusedBitsAndHexValue = function(a, b) {\n            if (a < 0 || 7 < a) throw \"unused bits shall be from 0 to 7: u = \" + a;\n            var c = \"0\" + a;\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = c + b\n        },\n        this.setByBinaryString = function(a) {\n            var b = 8 - (a = a.replace(/0+$/, \"\")).length % 8;\n            8 == b && (b = 0);\n            for (var c = 0; c <= b; c++) a += \"0\";\n            var d = \"\";\n            for (c = 0; c < a.length - 1; c += 8) {\n                var e = a.substr(c, 8),\n                    f = parseInt(e, 2).toString(16);\n                1 == f.length && (f = \"0\" + f),\n                d += f\n            }\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = \"0\" + b + d\n        },\n        this.setByBooleanArray = function(a) {\n            for (var b = \"\",\n            c = 0; c < a.length; c++) b += 1 == a[c] ? \"1\" : \"0\";\n            this.setByBinaryString(b)\n        },\n        this.newFalseArray = function(a) {\n            for (var b = new Array(a), c = 0; c < a; c++) b[c] = !1;\n            return b\n        },\n        this.getFreshValueHex = function() {\n            return this.hV\n        },\n        void 0 !== a && (void 0 !== a.hex ? this.setHexValueIncludingUnusedBits(a.hex) : void 0 !== a.bin ? this.setByBinaryString(a.bin) : void 0 !== a.array && this.setByBooleanArray(a.array))\n    },\n    JSX.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DEROctetString = function(a) {\n        KJUR.asn1.DEROctetString.superclass.constructor.call(this, a),\n        this.hT = \"04\"\n    },\n    JSX.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERNull = function() {\n        KJUR.asn1.DERNull.superclass.constructor.call(this),\n        this.hT = \"05\",\n        this.hTLV = \"0500\"\n    },\n    JSX.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERObjectIdentifier = function(a) {\n        var b = function(a) {\n            var b = a.toString(16);\n            return 1 == b.length && (b = \"0\" + b),\n            b\n        },\n        c = function(a) {\n            var c = \"\",\n                e = new BigInteger(a, 10).toString(2),\n                f = 7 - e.length % 7;\n            7 == f && (f = 0);\n            for (var g = \"\",\n            h = 0; h < f; h++) g += \"0\";\n            e = g + e;\n            for (h = 0; h < e.length - 1; h += 7) {\n                var i = e.substr(h, 7);\n                h != e.length - 7 && (i = \"1\" + i),\n                c += b(parseInt(i, 2))\n            }\n            return c\n        };\n        KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this),\n        this.hT = \"06\",\n        this.setValueHex = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = null,\n            this.hV = a\n        },\n        this.setValueOidString = function(a) {\n            if (!a.match(/^[0-9.]+$/)) throw \"malformed oid string: \" + a;\n            var d = \"\",\n                e = a.split(\".\"),\n                f = 40 * parseInt(e[0]) + parseInt(e[1]);\n            d += b(f),\n            e.splice(0, 2);\n            for (var g = 0; g < e.length; g++) d += c(e[g]);\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = null,\n            this.hV = d\n        },\n        this.setValueName = function(a) {\n            if (void 0 === KJUR.asn1.x509.OID.name2oidList[a]) throw \"DERObjectIdentifier oidName undefined: \" + a;\n            var b = KJUR.asn1.x509.OID.name2oidList[a];\n            this.setValueOidString(b)\n        },\n        this.getFreshValueHex = function() {\n            return this.hV\n        },\n        void 0 !== a && (void 0 !== a.oid ? this.setValueOidString(a.oid) : void 0 !== a.hex ? this.setValueHex(a.hex) : void 0 !== a.name && this.setValueName(a.name))\n    },\n    JSX.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERUTF8String = function(a) {\n        KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a),\n        this.hT = \"0c\"\n    },\n    JSX.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERNumericString = function(a) {\n        KJUR.asn1.DERNumericString.superclass.constructor.call(this, a),\n        this.hT = \"12\"\n    },\n    JSX.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERPrintableString = function(a) {\n        KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a),\n        this.hT = \"13\"\n    },\n    JSX.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERTeletexString = function(a) {\n        KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a),\n        this.hT = \"14\"\n    },\n    JSX.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERIA5String = function(a) {\n        KJUR.asn1.DERIA5String.superclass.constructor.call(this, a),\n        this.hT = \"16\"\n    },\n    JSX.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERUTCTime = function(a) {\n        KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a),\n        this.hT = \"17\",\n        this.setByDate = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.date = a,\n            this.s = this.formatDate(this.date, \"utc\"),\n            this.hV = stohex(this.s)\n        },\n        void 0 !== a && (void 0 !== a.str ? this.setString(a.str) : void 0 !== a.hex ? this.setStringHex(a.hex) : void 0 !== a.date && this.setByDate(a.date))\n    },\n    JSX.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime),\n    KJUR.asn1.DERGeneralizedTime = function(a) {\n        KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a),\n        this.hT = \"18\",\n        this.setByDate = function(a) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.date = a,\n            this.s = this.formatDate(this.date, \"gen\"),\n            this.hV = stohex(this.s)\n        },\n        void 0 !== a && (void 0 !== a.str ? this.setString(a.str) : void 0 !== a.hex ? this.setStringHex(a.hex) : void 0 !== a.date && this.setByDate(a.date))\n    },\n    JSX.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime),\n    KJUR.asn1.DERSequence = function(a) {\n        KJUR.asn1.DERSequence.superclass.constructor.call(this, a),\n        this.hT = \"30\",\n        this.getFreshValueHex = function() {\n            for (var a = \"\",\n            b = 0; b < this.asn1Array.length; b++) {\n                a += this.asn1Array[b].getEncodedHex()\n            }\n            return this.hV = a,\n            this.hV\n        }\n    },\n    JSX.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured),\n    KJUR.asn1.DERSet = function(a) {\n        KJUR.asn1.DERSet.superclass.constructor.call(this, a),\n        this.hT = \"31\",\n        this.getFreshValueHex = function() {\n            for (var a = new Array,\n            b = 0; b < this.asn1Array.length; b++) {\n                var c = this.asn1Array[b];\n                a.push(c.getEncodedHex())\n            }\n            return a.sort(),\n            this.hV = a.join(\"\"),\n            this.hV\n        }\n    },\n    JSX.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured),\n    KJUR.asn1.DERTaggedObject = function(a) {\n        KJUR.asn1.DERTaggedObject.superclass.constructor.call(this),\n        this.hT = \"a0\",\n        this.hV = \"\",\n        this.isExplicit = !0,\n        this.asn1Object = null,\n        this.setASN1Object = function(a, b, c) {\n            this.hT = b,\n            this.isExplicit = a,\n            this.asn1Object = c,\n            this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = c.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, b), this.isModified = !1)\n        },\n        this.getFreshValueHex = function() {\n            return this.hV\n        },\n        void 0 !== a && (void 0 !== a.tag && (this.hT = a.tag), void 0 !== a.explicit && (this.isExplicit = a.explicit), void 0 !== a.obj && (this.asn1Object = a.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)))\n    },\n    JSX.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object),\n\n    function(a) {\n        \"use strict\";\n        var b, c = {\n            decode: function(c) {\n                var d;\n                if (b === a) {\n                    var e = \"0123456789ABCDEF\",\n                        f = \" \\f\\n\\r\\t聽\\u2028\\u2029\";\n                    for (b = [], d = 0; d < 16; ++d) b[e.charAt(d)] = d;\n                    for (e = e.toLowerCase(), d = 10; d < 16; ++d) b[e.charAt(d)] = d;\n                    for (d = 0; d < f.length; ++d) b[f.charAt(d)] = -1\n                }\n                var g = [],\n                    h = 0,\n                    i = 0;\n                for (d = 0; d < c.length; ++d) {\n                    var j = c.charAt(d);\n                    if (\"=\" == j) break;\n                    if (-1 != (j = b[j])) {\n                        if (j === a) throw \"Illegal character at offset \" + d;\n                        h |= j,\n                        2 <= ++i ? (g[g.length] = h, i = h = 0) : h <<= 4\n                    }\n                }\n                if (i) throw \"Hex encoding incomplete: 4 bits missing\";\n                return g\n            }\n        };\n        window.Hex = c\n    }(),\n\n    function(a) {\n        \"use strict\";\n        var b, c = {\n            decode: function(c) {\n                var d;\n                if (b === a) {\n                    var f = \"= \\f\\n\\r\\t聽\\u2028\\u2029\";\n                    for (b = [], d = 0; d < 64; ++d) b[\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(d)] = d;\n                    for (d = 0; d < f.length; ++d) b[f.charAt(d)] = -1\n                }\n                var g = [],\n                    h = 0,\n                    i = 0;\n                for (d = 0; d < c.length; ++d) {\n                    var j = c.charAt(d);\n                    if (\"=\" == j) break;\n                    if (-1 != (j = b[j])) {\n                        if (j === a) throw \"Illegal character at offset \" + d;\n                        h |= j,\n                        4 <= ++i ? (g[g.length] = h >> 16, g[g.length] = h >> 8 & 255, g[g.length] = 255 & h, i = h = 0) : h <<= 6\n                    }\n                }\n                switch (i) {\n                    case 1:\n                        throw \"Base64 encoding incomplete: at least 2 bits missing\";\n                    case 2:\n                        g[g.length] = h >> 10;\n                        break;\n                    case 3:\n                        g[g.length] = h >> 16,\n                        g[g.length] = h >> 8 & 255\n                }\n                return g\n            },\n            re: /-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n            unarmor: function(a) {\n                var b = c.re.exec(a);\n                if (b) if (b[1]) a = b[1];\n                else {\n                    if (!b[2]) throw \"RegExp out of sync\";\n                    a = b[2]\n                }\n                return c.decode(a)\n            }\n        };\n        window.Base64 = c\n    }(),\n\n    function(a) {\n        \"use strict\";\n\n        function b(a, c) {\n            a instanceof b ? (this.enc = a.enc, this.pos = a.pos) : (this.enc = a, this.pos = c)\n        }\n\n        function c(a, b, c, d, e) {\n            this.stream = a,\n            this.header = b,\n            this.length = c,\n            this.tag = d,\n            this.sub = e\n        }\n        var d = 100,\n            f_tag = function(a, b) {\n                var c = document.createElement(a);\n                return c.className = b,\n                c\n            },\n            f_text = function(a) {\n                return document.createTextNode(a)\n            };\n        b.prototype.get = function(b) {\n            if (b === a && (b = this.pos++), b >= this.enc.length) throw \"Requesting byte offset \" + b + \" on a stream of length \" + this.enc.length;\n            return this.enc[b]\n        },\n        b.prototype.hexDigits = \"0123456789ABCDEF\",\n        b.prototype.hexByte = function(a) {\n            return this.hexDigits.charAt(a >> 4 & 15) + this.hexDigits.charAt(15 & a)\n        },\n        b.prototype.hexDump = function(a, b, c) {\n            for (var d = \"\",\n            e = a; e < b; ++e) if (d += this.hexByte(this.get(e)), !0 !== c) switch (15 & e) {\n                case 7:\n                    d += \"  \";\n                    break;\n                case 15:\n                    d += \"\\n\";\n                    break;\n                default:\n                    d += \" \"\n            }\n            return d\n        },\n        b.prototype.parseStringISO = function(a, b) {\n            for (var c = \"\",\n            d = a; d < b; ++d) c += String.fromCharCode(this.get(d));\n            return c\n        },\n        b.prototype.parseStringUTF = function(a, b) {\n            for (var c = \"\",\n            d = a; d < b;) {\n                var e = this.get(d++);\n                c += String.fromCharCode(e < 128 ? e : 191 < e && e < 224 ? (31 & e) << 6 | 63 & this.get(d++) : (15 & e) << 12 | (63 & this.get(d++)) << 6 | 63 & this.get(d++))\n            }\n            return c\n        },\n        b.prototype.parseStringBMP = function(a, b) {\n            for (var c = \"\",\n            d = a; d < b; d += 2) {\n                var e = this.get(d),\n                    f = this.get(d + 1);\n                c += String.fromCharCode((e << 8) + f)\n            }\n            return c\n        },\n        b.prototype.reTime = /^((?:1[89]|2\\d)?\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/,\n        b.prototype.parseTime = function(a, b) {\n            var c = this.parseStringISO(a, b),\n                d = this.reTime.exec(c);\n            return d ? (c = d[1] + \"-\" + d[2] + \"-\" + d[3] + \" \" + d[4], d[5] && (c += \":\" + d[5], d[6] && (c += \":\" + d[6], d[7] && (c += \".\" + d[7]))), d[8] && (c += \" UTC\", \"Z\" != d[8] && (c += d[8], d[9] && (c += \":\" + d[9]))), c) : \"Unrecognized time: \" + c\n        },\n        b.prototype.parseInteger = function(a, b) {\n            var c = b - a;\n            if (4 < c) {\n                c <<= 3;\n                var d = this.get(a);\n                if (0 === d) c -= 8;\n                else for (; d < 128;) d <<= 1, --c;\n                return \"(\" + c + \" bit)\"\n            }\n            for (var e = 0,\n            f = a; f < b; ++f) e = e << 8 | this.get(f);\n            return e\n        },\n        b.prototype.parseBitString = function(a, b) {\n            var c = this.get(a),\n                d = (b - a - 1 << 3) - c,\n                e = \"(\" + d + \" bit)\";\n            if (d <= 20) {\n                var f = c;\n                e += \" \";\n                for (var g = b - 1; a < g; --g) {\n                    for (var h = this.get(g), i = f; i < 8; ++i) e += h >> i & 1 ? \"1\" : \"0\";\n                    f = 0\n                }\n            }\n            return e\n        },\n        b.prototype.parseOctetString = function(a, b) {\n            var c = b - a,\n                f = \"(\" + c + \" byte) \";\n            d < c && (b = a + d);\n            for (var g = a; g < b; ++g) f += this.hexByte(this.get(g));\n            return d < c && (f += \"鈥?\"),\n            f\n        },\n        b.prototype.parseOID = function(a, b) {\n            for (var c = \"\",\n            d = 0,\n            e = 0,\n            f = a; f < b; ++f) {\n                var g = this.get(f);\n                if (d = d << 7 | 127 & g, e += 7, !(128 & g)) {\n                    if (\"\" === c) {\n                        var h = d < 80 ? d < 40 ? 0 : 1 : 2;\n                        c = h + \".\" + (d - 40 * h)\n                    } else c += \".\" + (31 <= e ? \"bigint\" : d);\n                    d = e = 0\n                }\n            }\n            return c\n        },\n        c.prototype.typeName = function() {\n            if (this.tag === a) return \"unknown\";\n            var b = this.tag >> 6,\n                c = (this.tag, 31 & this.tag);\n            switch (b) {\n                case 0:\n                    switch (c) {\n                        case 0:\n                            return \"EOC\";\n                        case 1:\n                            return \"BOOLEAN\";\n                        case 2:\n                            return \"INTEGER\";\n                        case 3:\n                            return \"BIT_STRING\";\n                        case 4:\n                            return \"OCTET_STRING\";\n                        case 5:\n                            return \"NULL\";\n                        case 6:\n                            return \"OBJECT_IDENTIFIER\";\n                        case 7:\n                            return \"ObjectDescriptor\";\n                        case 8:\n                            return \"EXTERNAL\";\n                        case 9:\n                            return \"REAL\";\n                        case 10:\n                            return \"ENUMERATED\";\n                        case 11:\n                            return \"EMBEDDED_PDV\";\n                        case 12:\n                            return \"UTF8String\";\n                        case 16:\n                            return \"SEQUENCE\";\n                        case 17:\n                            return \"SET\";\n                        case 18:\n                            return \"NumericString\";\n                        case 19:\n                            return \"PrintableString\";\n                        case 20:\n                            return \"TeletexString\";\n                        case 21:\n                            return \"VideotexString\";\n                        case 22:\n                            return \"IA5String\";\n                        case 23:\n                            return \"UTCTime\";\n                        case 24:\n                            return \"GeneralizedTime\";\n                        case 25:\n                            return \"GraphicString\";\n                        case 26:\n                            return \"VisibleString\";\n                        case 27:\n                            return \"GeneralString\";\n                        case 28:\n                            return \"UniversalString\";\n                        case 30:\n                            return \"BMPString\";\n                        default:\n                            return \"Universal_\" + c.toString(16)\n                    }\n                case 1:\n                    return \"Application_\" + c.toString(16);\n                case 2:\n                    return \"[\" + c + \"]\";\n                case 3:\n                    return \"Private_\" + c.toString(16)\n            }\n        },\n        c.prototype.reSeemsASCII = /^[ -~]+$/,\n        c.prototype.content = function() {\n            if (this.tag === a) return null;\n            var b = this.tag >> 6,\n                c = 31 & this.tag,\n                f = this.posContent(),\n                g = Math.abs(this.length);\n            if (0 != b) {\n                if (null !== this.sub) return \"(\" + this.sub.length + \" elem)\";\n                var h = this.stream.parseStringISO(f, f + Math.min(g, d));\n                return this.reSeemsASCII.test(h) ? h.substring(0, 200) + (200 < h.length ? \"鈥?\" : \"\") : this.stream.parseOctetString(f, f + g)\n            }\n            switch (c) {\n                case 1:\n                    return 0 === this.stream.get(f) ? \"false\" : \"true\";\n                case 2:\n                    return this.stream.parseInteger(f, f + g);\n                case 3:\n                    return this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseBitString(f, f + g);\n                case 4:\n                    return this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseOctetString(f, f + g);\n                case 6:\n                    return this.stream.parseOID(f, f + g);\n                case 16:\n                case 17:\n                    return \"(\" + this.sub.length + \" elem)\";\n                case 12:\n                    return this.stream.parseStringUTF(f, f + g);\n                case 18:\n                case 19:\n                case 20:\n                case 21:\n                case 22:\n                case 26:\n                    return this.stream.parseStringISO(f, f + g);\n                case 30:\n                    return this.stream.parseStringBMP(f, f + g);\n                case 23:\n                case 24:\n                    return this.stream.parseTime(f, f + g)\n            }\n            return null\n        },\n        c.prototype.toString = function() {\n            return this.typeName() + \"@\" + this.stream.pos + \"[header:\" + this.header + \",length:\" + this.length + \",sub:\" + (null === this.sub ? \"null\" : this.sub.length) + \"]\"\n        },\n        c.prototype.print = function(b) {\n            if (b === a && (b = \"\"), document.writeln(b + this), null !== this.sub) {\n                b += \"  \";\n                for (var c = 0,\n                d = this.sub.length; c < d; ++c) this.sub[c].print(b)\n            }\n        },\n        c.prototype.toPrettyString = function(b) {\n            b === a && (b = \"\");\n            var c = b + this.typeName() + \" @\" + this.stream.pos;\n            if (0 <= this.length && (c += \"+\"), c += this.length, 32 & this.tag ? c += \" (constructed)\" : 3 != this.tag && 4 != this.tag || null === this.sub || (c += \" (encapsulates)\"), c += \"\\n\", null !== this.sub) {\n                b += \"  \";\n                for (var d = 0,\n                e = this.sub.length; d < e; ++d) c += this.sub[d].toPrettyString(b)\n            }\n            return c\n        },\n        c.prototype.toDOM = function() {\n            var a = f_tag(\"div\", \"node\");\n            a.asn1 = this;\n            var b = f_tag(\"div\", \"head\"),\n                c = this.typeName().replace(/_/g, \" \");\n            b.innerHTML = c;\n            var d = this.content();\n            if (null !== d) {\n                d = String(d).replace(/</g, \"&lt;\");\n                var e = f_tag(\"span\", \"preview\");\n                e.appendChild(f_text(d)),\n                b.appendChild(e)\n            }\n            a.appendChild(b),\n            this.node = a,\n            this.head = b;\n            var g = f_tag(\"div\", \"value\");\n            if (c = \"Offset: \" + this.stream.pos + \"<br/>\", c += \"Length: \" + this.header + \"+\", c += 0 <= this.length ? this.length : -this.length + \" (undefined)\", 32 & this.tag ? c += \"<br/>(constructed)\" : 3 != this.tag && 4 != this.tag || null === this.sub || (c += \"<br/>(encapsulates)\"), null !== d && (c += \"<br/>Value:<br/><b>\" + d + \"</b>\", \"object\" == typeof oids && 6 == this.tag)) {\n                var h = oids[d];\n                h && (h.d && (c += \"<br/>\" + h.d), h.c && (c += \"<br/>\" + h.c), h.w && (c += \"<br/>(warning!)\"))\n            }\n            g.innerHTML = c,\n            a.appendChild(g);\n            var i = f_tag(\"div\", \"sub\");\n            if (null !== this.sub) for (var j = 0,\n            k = this.sub.length; j < k; ++j) i.appendChild(this.sub[j].toDOM());\n            return a.appendChild(i),\n            b.onclick = function() {\n                a.className = \"node collapsed\" == a.className ? \"node\" : \"node collapsed\"\n            },\n            a\n        },\n        c.prototype.posStart = function() {\n            return this.stream.pos\n        },\n        c.prototype.posContent = function() {\n            return this.stream.pos + this.header\n        },\n        c.prototype.posEnd = function() {\n            return this.stream.pos + this.header + Math.abs(this.length)\n        },\n        c.prototype.fakeHover = function(a) {\n            this.node.className += \" hover\",\n            a && (this.head.className += \" hover\")\n        },\n        c.prototype.fakeOut = function(a) {\n            var b = / ?hover/;\n            this.node.className = this.node.className.replace(b, \"\"),\n            a && (this.head.className = this.head.className.replace(b, \"\"))\n        },\n        c.prototype.toHexDOM_sub = function(a, b, c, d, e) {\n            if (!(e <= d)) {\n                var g = f_tag(\"span\", b);\n                g.appendChild(f_text(c.hexDump(d, e))),\n                a.appendChild(g)\n            }\n        },\n        c.prototype.toHexDOM = function(b) {\n            var c = f_tag(\"span\", \"hex\");\n            if (b === a && (b = c), this.head.hexNode = c, this.head.onmouseover = function() {\n                this.hexNode.className = \"hexCurrent\"\n            },\n            this.head.onmouseout = function() {\n                this.hexNode.className = \"hex\"\n            },\n            c.asn1 = this, c.onmouseover = function() {\n                var a = !b.selected;\n                a && (b.selected = this.asn1, this.className = \"hexCurrent\"),\n                this.asn1.fakeHover(a)\n            },\n            c.onmouseout = function() {\n                var a = b.selected == this.asn1;\n                this.asn1.fakeOut(a),\n                a && (b.selected = null, this.className = \"hex\")\n            },\n            this.toHexDOM_sub(c, \"tag\", this.stream, this.posStart(), this.posStart() + 1), this.toHexDOM_sub(c, 0 <= this.length ? \"dlen\" : \"ulen\", this.stream, this.posStart() + 1, this.posContent()), null === this.sub) c.appendChild(f_text(this.stream.hexDump(this.posContent(), this.posEnd())));\n            else if (0 < this.sub.length) {\n                var d = this.sub[0],\n                    e = this.sub[this.sub.length - 1];\n                this.toHexDOM_sub(c, \"intro\", this.stream, this.posContent(), d.posStart());\n                for (var g = 0,\n                h = this.sub.length; g < h; ++g) c.appendChild(this.sub[g].toHexDOM(b));\n                this.toHexDOM_sub(c, \"outro\", this.stream, e.posEnd(), this.posEnd())\n            }\n            return c\n        },\n        c.prototype.toHexString = function() {\n            return this.stream.hexDump(this.posStart(), this.posEnd(), !0)\n        },\n        c.decodeLength = function(a) {\n            var b = a.get(),\n                c = 127 & b;\n            if (c == b) return c;\n            if (3 < c) throw \"Length over 24 bits not supported at position \" + (a.pos - 1);\n            if (0 == c) return -1;\n            for (var d = b = 0; d < c; ++d) b = b << 8 | a.get();\n            return b\n        },\n        c.hasContent = function(a, d, e) {\n            if (32 & a) return !0;\n            if (a < 3 || 4 < a) return !1;\n            var f = new b(e);\n            if (3 == a && f.get(), f.get() >> 6 & 1) return !1;\n            try {\n                var h = c.decodeLength(f);\n                return f.pos - e.pos + h == d\n            } catch (i) {\n                return !1\n            }\n        },\n        c.decode = function(a) {\n            a instanceof b || (a = new b(a, 0));\n            var d = new b(a),\n                e = a.get(),\n                f = c.decodeLength(a),\n                g = a.pos - d.pos,\n                h = null;\n            if (c.hasContent(e, f, a)) {\n                var i = a.pos;\n                if (3 == e && a.get(), h = [], 0 <= f) {\n                    for (var j = i + f; a.pos < j;) h[h.length] = c.decode(a);\n                    if (a.pos != j) throw \"Content size is not correct for container starting at offset \" + i\n                } else try {\n                    for (;;) {\n                        var k = c.decode(a);\n                        if (0 === k.tag) break;\n                        h[h.length] = k\n                    }\n                    f = i - a.pos\n                } catch (l) {\n                    throw \"Exception while decoding undefined length content: \" + l\n                }\n            } else a.pos += f;\n            return new c(d, g, f, e, h)\n        },\n        c.test = function() {\n            for (var a = [{\n                value: [39],\n                expected: 39\n            }, {\n                value: [129, 201],\n                expected: 201\n            }, {\n                value: [131, 254, 220, 186],\n                expected: 16702650\n            }], d = 0, e = a.length; d < e; ++d) {\n                var f = new b(a[d].value, 0),\n                    g = c.decodeLength(f);\n                g != a[d].expected && document.write(\"In test[\" + d + \"] expected \" + a[d].expected + \" got \" + g + \"\\n\")\n            }\n        },\n        window.ASN1 = c\n    }(),\n    ASN1 = window.ASN1\n    ASN1.prototype.getHexStringValue = function() {\n        var a = this.toHexString(),\n            b = 2 * this.header,\n            c = 2 * this.length;\n        return a.substr(b, c)\n    },\n    RSAKey.prototype.parseKey = function(a) {\n        try {\n            var b = 0,\n                c = 0,\n                e = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/.test(a) ? Hex.decode(a) : Base64.unarmor(a),\n                f = ASN1.decode(e);\n            if (3 === f.sub.length && (f = f.sub[2].sub[0]), 9 === f.sub.length) {\n                b = f.sub[1].getHexStringValue(),\n                this.n = parseBigInt(b, 16),\n                c = f.sub[2].getHexStringValue(),\n                this.e = parseInt(c, 16);\n                var g = f.sub[3].getHexStringValue();\n                this.d = parseBigInt(g, 16);\n                var h = f.sub[4].getHexStringValue();\n                this.p = parseBigInt(h, 16);\n                var i = f.sub[5].getHexStringValue();\n                this.q = parseBigInt(i, 16);\n                var j = f.sub[6].getHexStringValue();\n                this.dmp1 = parseBigInt(j, 16);\n                var k = f.sub[7].getHexStringValue();\n                this.dmq1 = parseBigInt(k, 16);\n                var l = f.sub[8].getHexStringValue();\n                this.coeff = parseBigInt(l, 16)\n            } else {\n                if (2 !== f.sub.length) return !1;\n                var n = f.sub[1].sub[0];\n                b = n.sub[0].getHexStringValue(),\n                this.n = parseBigInt(b, 16),\n                c = n.sub[1].getHexStringValue(),\n                this.e = parseInt(c, 16)\n            }\n            return !0\n        } catch (o) {\n            return !1\n        }\n    },\n    RSAKey.prototype.getPrivateBaseKey = function() {\n        var a = {\n            array: [new KJUR.asn1.DERInteger({\n                int: 0\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.n\n            }), new KJUR.asn1.DERInteger({\n                int: this.e\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.d\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.p\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.q\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.dmp1\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.dmq1\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.coeff\n            })]\n        };\n        return new KJUR.asn1.DERSequence(a).getEncodedHex()\n    },\n    RSAKey.prototype.getPrivateBaseKeyB64 = function() {\n        return hex2b64(this.getPrivateBaseKey())\n    },\n    RSAKey.prototype.getPublicBaseKey = function() {\n        var a = {\n            array: [new KJUR.asn1.DERObjectIdentifier({\n                oid: \"1.2.840.113549.1.1.1\"\n            }), new KJUR.asn1.DERNull]\n        },\n        b = new KJUR.asn1.DERSequence(a);\n        return a = {\n            array: [new KJUR.asn1.DERInteger({\n                bigint: this.n\n            }), new KJUR.asn1.DERInteger({\n                int: this.e\n            })]\n        },\n        a = {\n            hex: \"00\" + new KJUR.asn1.DERSequence(a).getEncodedHex()\n        },\n        a = {\n            array: [b, new KJUR.asn1.DERBitString(a)]\n        },\n        new KJUR.asn1.DERSequence(a).getEncodedHex()\n    },\n    RSAKey.prototype.getPublicBaseKeyB64 = function() {\n        return hex2b64(this.getPublicBaseKey())\n    },\n    RSAKey.prototype.wordwrap = function(a, b) {\n        if (!a) return a;\n        var c = \"(.{1,\" + (b = b || 64) + \"})( +|$\\n?)|(.{1,\" + b + \"})\";\n        return a.match(RegExp(c, \"g\")).join(\"\\n\")\n    },\n    RSAKey.prototype.getPrivateKey = function() {\n        var a = \"-----BEGIN RSA PRIVATE KEY-----\\n\";\n        return (a += this.wordwrap(this.getPrivateBaseKeyB64()) + \"\\n\") + \"-----END RSA PRIVATE KEY-----\"\n    },\n    RSAKey.prototype.getPublicKey = function() {\n        var a = \"-----BEGIN PUBLIC KEY-----\\n\";\n        return (a += this.wordwrap(this.getPublicBaseKeyB64()) + \"\\n\") + \"-----END PUBLIC KEY-----\"\n    },\n    RSAKey.prototype.hasPublicKeyProperty = function(a) {\n        return (a = a || {}).hasOwnProperty(\"n\") && a.hasOwnProperty(\"e\")\n    },\n    RSAKey.prototype.hasPrivateKeyProperty = function(a) {\n        return (a = a || {}).hasOwnProperty(\"n\") && a.hasOwnProperty(\"e\") && a.hasOwnProperty(\"d\") && a.hasOwnProperty(\"p\") && a.hasOwnProperty(\"q\") && a.hasOwnProperty(\"dmp1\") && a.hasOwnProperty(\"dmq1\") && a.hasOwnProperty(\"coeff\")\n    },\n    RSAKey.prototype.parsePropertiesFrom = function(a) {\n        this.n = a.n,\n        this.e = a.e,\n        a.hasOwnProperty(\"d\") && (this.d = a.d, this.p = a.p, this.q = a.q, this.dmp1 = a.dmp1, this.dmq1 = a.dmq1, this.coeff = a.coeff)\n    };\n\n    function JSEncryptRSAKey(a) {\n        RSAKey.call(this),\n        a && (\"string\" == typeof a ? this.parseKey(a) : (this.hasPrivateKeyProperty(a) || this.hasPublicKeyProperty(a)) && this.parsePropertiesFrom(a))\n    }(JSEncryptRSAKey.prototype = new RSAKey).constructor = JSEncryptRSAKey;\n\n    function JSEncrypt(a) {\n        a = a || {},\n        this.default_key_size = parseInt(a.default_key_size) || 1024,\n        this.default_public_exponent = a.default_public_exponent || \"010001\",\n        this.log = a.log || !1,\n        this.key = null\n    }\n    JSEncrypt.prototype.setKey = function(a) {\n        this.log && this.key && console.warn(\"A key was already set, overriding existing.\"),\n        this.key = new JSEncryptRSAKey(a)\n    },\n    JSEncrypt.prototype.setPrivateKey = function(a) {\n        this.setKey(a)\n    },\n    JSEncrypt.prototype.setPublicKey = function(a) {\n        this.setKey(a)\n    },\n    JSEncrypt.prototype.decrypt = function(a) {\n        try {\n            return this.getKey().decrypt(b64tohex(a))\n        } catch (b) {\n            return !1\n        }\n    },\n    JSEncrypt.prototype.encrypt = function(a) {\n        try {\n            return this.getKey().encrypt(a)\n        } catch (b) {\n            return !1\n        }\n    },\n    JSEncrypt.prototype.getKey = function(a) {\n        if (!this.key) {\n            if (this.key = new JSEncryptRSAKey, a && \"[object Function]\" === {}.toString.call(a)) return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, a);\n            this.key.generate(this.default_key_size, this.default_public_exponent)\n        }\n        return this.key\n    },\n    JSEncrypt.prototype.getPrivateKey = function() {\n        return this.getKey().getPrivateKey()\n    },\n    JSEncrypt.prototype.getPrivateKeyB64 = function() {\n        return this.getKey().getPrivateBaseKeyB64()\n    },\n    JSEncrypt.prototype.getPublicKey = function() {\n        return this.getKey().getPublicKey()\n    },\n    JSEncrypt.prototype.getPublicKeyB64 = function() {\n        return this.getKey().getPublicBaseKeyB64()\n    },\n    exports.JSEncrypt = JSEncrypt\n}(JSEncryptExports);\n\nvar j_Key = \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDY7mpaUysvgQkbp0iIn2ezoUyhi1zPFn0HCXloLFWT7uoNkqtrphpQ/63LEcPz1VYzmDuDIf3iGxQKzeoHTiVMSmW6FlhDeqVOG094hFJvZeK4OzA6HVwzwnEW5vIZ7d+u61RV1bsFxmB68+8JXs3ycGcE4anY+YzZJcyOcEGKVQIDAQAB\"\n\n    function make(msg) {\n        JSEncrypt = JSEncryptExports.JSEncrypt;\n        (encrypt = new JSEncrypt).setPublicKey(j_Key);\n        return '{RSA}' + encrypt.encrypt(msg)\n    }\nHex = window.Hex;\nBase64 = window.Base64;\nASN1 = window.ASN1;\nHex = window.Hex;\nBase64 = window.Base64;\nASN1 = window.ASN1;"
  },
  {
    "path": "其他实战/【好莱客】参数解析/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【好莱客】参数解析/encryp.js",
    "content": "var key = {};\n\nfunction get_key_iv(str) {\n    if (str.length < 32) {\n        str += \"abcdefghijklmnopqrstuvwxyz1234567890\"\n    }\n    str = str.toUpperCase();\n    key.key = str.substring(0, 16);\n    key.iv = str.substring(16, 32);\n    key.security = \"\\u4435\\u5320\\u4d35\"\n    return key\n}\n\nvar CryptoJS = CryptoJS || function(u, p) {\n    var d = {}\n      , l = d.lib = {}\n      , s = function() {}\n      , t = l.Base = {\n        extend: function(a) {\n            s.prototype = this;\n            var c = new s;\n            a && c.mixIn(a);\n            c.hasOwnProperty(\"init\") || (c.init = function() {\n                c.$super.init.apply(this, arguments)\n            }\n            );\n            c.init.prototype = c;\n            c.$super = this;\n            return c\n        },\n        create: function() {\n            var a = this.extend();\n            a.init.apply(a, arguments);\n            return a\n        },\n        init: function() {},\n        mixIn: function(a) {\n            for (var c in a)\n                a.hasOwnProperty(c) && (this[c] = a[c]);\n            a.hasOwnProperty(\"toString\") && (this.toString = a.toString)\n        },\n        clone: function() {\n            return this.init.prototype.extend(this)\n        }\n    }\n      , r = l.WordArray = t.extend({\n        init: function(a, c) {\n            a = this.words = a || [];\n            this.sigBytes = c != p ? c : 4 * a.length\n        },\n        toString: function(a) {\n            return (a || v).stringify(this)\n        },\n        concat: function(a) {\n            var c = this.words\n              , e = a.words\n              , j = this.sigBytes;\n            a = a.sigBytes;\n            this.clamp();\n            if (j % 4)\n                for (var k = 0; k < a; k++)\n                    c[j + k >>> 2] |= (e[k >>> 2] >>> 24 - 8 * (k % 4) & 255) << 24 - 8 * ((j + k) % 4);\n            else if (65535 < e.length)\n                for (k = 0; k < a; k += 4)\n                    c[j + k >>> 2] = e[k >>> 2];\n            else\n                c.push.apply(c, e);\n            this.sigBytes += a;\n            return this\n        },\n        clamp: function() {\n            var a = this.words\n              , c = this.sigBytes;\n            a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4);\n            a.length = u.ceil(c / 4)\n        },\n        clone: function() {\n            var a = t.clone.call(this);\n            a.words = this.words.slice(0);\n            return a\n        },\n        random: function(a) {\n            for (var c = [], e = 0; e < a; e += 4)\n                c.push(4294967296 * u.random() | 0);\n            return new r.init(c,a)\n        }\n    })\n      , w = d.enc = {}\n      , v = w.Hex = {\n        stringify: function(a) {\n            var c = a.words;\n            a = a.sigBytes;\n            for (var e = [], j = 0; j < a; j++) {\n                var k = c[j >>> 2] >>> 24 - 8 * (j % 4) & 255;\n                e.push((k >>> 4).toString(16));\n                e.push((k & 15).toString(16))\n            }\n            return e.join(\"\")\n        },\n        parse: function(a) {\n            for (var c = a.length, e = [], j = 0; j < c; j += 2)\n                e[j >>> 3] |= parseInt(a.substr(j, 2), 16) << 24 - 4 * (j % 8);\n            return new r.init(e,c / 2)\n        }\n    }\n      , b = w.Latin1 = {\n        stringify: function(a) {\n            var c = a.words;\n            a = a.sigBytes;\n            for (var e = [], j = 0; j < a; j++)\n                e.push(String.fromCharCode(c[j >>> 2] >>> 24 - 8 * (j % 4) & 255));\n            return e.join(\"\")\n        },\n        parse: function(a) {\n            for (var c = a.length, e = [], j = 0; j < c; j++)\n                e[j >>> 2] |= (a.charCodeAt(j) & 255) << 24 - 8 * (j % 4);\n            return new r.init(e,c)\n        }\n    }\n      , x = w.Utf8 = {\n        stringify: function(a) {\n            try {\n                return decodeURIComponent(escape(b.stringify(a)))\n            } catch (c) {\n                throw Error(\"Malformed UTF-8 data\");\n            }\n        },\n        parse: function(a) {\n            return b.parse(unescape(encodeURIComponent(a)))\n        }\n    }\n      , q = l.BufferedBlockAlgorithm = t.extend({\n        reset: function() {\n            this._data = new r.init;\n            this._nDataBytes = 0\n        },\n        _append: function(a) {\n            \"string\" == typeof a && (a = x.parse(a));\n            this._data.concat(a);\n            this._nDataBytes += a.sigBytes\n        },\n        _process: function(a) {\n            var c = this._data\n              , e = c.words\n              , j = c.sigBytes\n              , k = this.blockSize\n              , b = j / (4 * k)\n              , b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0);\n            a = b * k;\n            j = u.min(4 * a, j);\n            if (a) {\n                for (var q = 0; q < a; q += k)\n                    this._doProcessBlock(e, q);\n                q = e.splice(0, a);\n                c.sigBytes -= j\n            }\n            return new r.init(q,j)\n        },\n        clone: function() {\n            var a = t.clone.call(this);\n            a._data = this._data.clone();\n            return a\n        },\n        _minBufferSize: 0\n    });\n    l.Hasher = q.extend({\n        cfg: t.extend(),\n        init: function(a) {\n            this.cfg = this.cfg.extend(a);\n            this.reset()\n        },\n        reset: function() {\n            q.reset.call(this);\n            this._doReset()\n        },\n        update: function(a) {\n            this._append(a);\n            this._process();\n            return this\n        },\n        finalize: function(a) {\n            a && this._append(a);\n            return this._doFinalize()\n        },\n        blockSize: 16,\n        _createHelper: function(a) {\n            return function(b, e) {\n                return (new a.init(e)).finalize(b)\n            }\n        },\n        _createHmacHelper: function(a) {\n            return function(b, e) {\n                return (new n.HMAC.init(a,e)).finalize(b)\n            }\n        }\n    });\n    var n = d.algo = {};\n    return d\n}(Math);\n(function() {\n    var u = CryptoJS\n      , p = u.lib.WordArray;\n    u.enc.Base64 = {\n        stringify: function(d) {\n            var l = d.words\n              , p = d.sigBytes\n              , t = this._map;\n            d.clamp();\n            d = [];\n            for (var r = 0; r < p; r += 3)\n                for (var w = (l[r >>> 2] >>> 24 - 8 * (r % 4) & 255) << 16 | (l[r + 1 >>> 2] >>> 24 - 8 * ((r + 1) % 4) & 255) << 8 | l[r + 2 >>> 2] >>> 24 - 8 * ((r + 2) % 4) & 255, v = 0; 4 > v && r + 0.75 * v < p; v++)\n                    d.push(t.charAt(w >>> 6 * (3 - v) & 63));\n            if (l = t.charAt(64))\n                for (; d.length % 4; )\n                    d.push(l);\n            return d.join(\"\")\n        },\n        parse: function(d) {\n            var l = d.length\n              , s = this._map\n              , t = s.charAt(64);\n            t && (t = d.indexOf(t),\n            -1 != t && (l = t));\n            for (var t = [], r = 0, w = 0; w < l; w++)\n                if (w % 4) {\n                    var v = s.indexOf(d.charAt(w - 1)) << 2 * (w % 4)\n                      , b = s.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4);\n                    t[r >>> 2] |= (v | b) << 24 - 8 * (r % 4);\n                    r++\n                }\n            return p.create(t, r)\n        },\n        _map: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n    }\n}\n)();\n(function(u) {\n    function p(b, n, a, c, e, j, k) {\n        b = b + (n & a | ~n & c) + e + k;\n        return (b << j | b >>> 32 - j) + n\n    }\n    function d(b, n, a, c, e, j, k) {\n        b = b + (n & c | a & ~c) + e + k;\n        return (b << j | b >>> 32 - j) + n\n    }\n    function l(b, n, a, c, e, j, k) {\n        b = b + (n ^ a ^ c) + e + k;\n        return (b << j | b >>> 32 - j) + n\n    }\n    function s(b, n, a, c, e, j, k) {\n        b = b + (a ^ (n | ~c)) + e + k;\n        return (b << j | b >>> 32 - j) + n\n    }\n    for (var t = CryptoJS, r = t.lib, w = r.WordArray, v = r.Hasher, r = t.algo, b = [], x = 0; 64 > x; x++)\n        b[x] = 4294967296 * u.abs(u.sin(x + 1)) | 0;\n    r = r.MD5 = v.extend({\n        _doReset: function() {\n            this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878])\n        },\n        _doProcessBlock: function(q, n) {\n            for (var a = 0; 16 > a; a++) {\n                var c = n + a\n                  , e = q[c];\n                q[c] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360\n            }\n            var a = this._hash.words\n              , c = q[n + 0]\n              , e = q[n + 1]\n              , j = q[n + 2]\n              , k = q[n + 3]\n              , z = q[n + 4]\n              , r = q[n + 5]\n              , t = q[n + 6]\n              , w = q[n + 7]\n              , v = q[n + 8]\n              , A = q[n + 9]\n              , B = q[n + 10]\n              , C = q[n + 11]\n              , u = q[n + 12]\n              , D = q[n + 13]\n              , E = q[n + 14]\n              , x = q[n + 15]\n              , f = a[0]\n              , m = a[1]\n              , g = a[2]\n              , h = a[3]\n              , f = p(f, m, g, h, c, 7, b[0])\n              , h = p(h, f, m, g, e, 12, b[1])\n              , g = p(g, h, f, m, j, 17, b[2])\n              , m = p(m, g, h, f, k, 22, b[3])\n              , f = p(f, m, g, h, z, 7, b[4])\n              , h = p(h, f, m, g, r, 12, b[5])\n              , g = p(g, h, f, m, t, 17, b[6])\n              , m = p(m, g, h, f, w, 22, b[7])\n              , f = p(f, m, g, h, v, 7, b[8])\n              , h = p(h, f, m, g, A, 12, b[9])\n              , g = p(g, h, f, m, B, 17, b[10])\n              , m = p(m, g, h, f, C, 22, b[11])\n              , f = p(f, m, g, h, u, 7, b[12])\n              , h = p(h, f, m, g, D, 12, b[13])\n              , g = p(g, h, f, m, E, 17, b[14])\n              , m = p(m, g, h, f, x, 22, b[15])\n              , f = d(f, m, g, h, e, 5, b[16])\n              , h = d(h, f, m, g, t, 9, b[17])\n              , g = d(g, h, f, m, C, 14, b[18])\n              , m = d(m, g, h, f, c, 20, b[19])\n              , f = d(f, m, g, h, r, 5, b[20])\n              , h = d(h, f, m, g, B, 9, b[21])\n              , g = d(g, h, f, m, x, 14, b[22])\n              , m = d(m, g, h, f, z, 20, b[23])\n              , f = d(f, m, g, h, A, 5, b[24])\n              , h = d(h, f, m, g, E, 9, b[25])\n              , g = d(g, h, f, m, k, 14, b[26])\n              , m = d(m, g, h, f, v, 20, b[27])\n              , f = d(f, m, g, h, D, 5, b[28])\n              , h = d(h, f, m, g, j, 9, b[29])\n              , g = d(g, h, f, m, w, 14, b[30])\n              , m = d(m, g, h, f, u, 20, b[31])\n              , f = l(f, m, g, h, r, 4, b[32])\n              , h = l(h, f, m, g, v, 11, b[33])\n              , g = l(g, h, f, m, C, 16, b[34])\n              , m = l(m, g, h, f, E, 23, b[35])\n              , f = l(f, m, g, h, e, 4, b[36])\n              , h = l(h, f, m, g, z, 11, b[37])\n              , g = l(g, h, f, m, w, 16, b[38])\n              , m = l(m, g, h, f, B, 23, b[39])\n              , f = l(f, m, g, h, D, 4, b[40])\n              , h = l(h, f, m, g, c, 11, b[41])\n              , g = l(g, h, f, m, k, 16, b[42])\n              , m = l(m, g, h, f, t, 23, b[43])\n              , f = l(f, m, g, h, A, 4, b[44])\n              , h = l(h, f, m, g, u, 11, b[45])\n              , g = l(g, h, f, m, x, 16, b[46])\n              , m = l(m, g, h, f, j, 23, b[47])\n              , f = s(f, m, g, h, c, 6, b[48])\n              , h = s(h, f, m, g, w, 10, b[49])\n              , g = s(g, h, f, m, E, 15, b[50])\n              , m = s(m, g, h, f, r, 21, b[51])\n              , f = s(f, m, g, h, u, 6, b[52])\n              , h = s(h, f, m, g, k, 10, b[53])\n              , g = s(g, h, f, m, B, 15, b[54])\n              , m = s(m, g, h, f, e, 21, b[55])\n              , f = s(f, m, g, h, v, 6, b[56])\n              , h = s(h, f, m, g, x, 10, b[57])\n              , g = s(g, h, f, m, t, 15, b[58])\n              , m = s(m, g, h, f, D, 21, b[59])\n              , f = s(f, m, g, h, z, 6, b[60])\n              , h = s(h, f, m, g, C, 10, b[61])\n              , g = s(g, h, f, m, j, 15, b[62])\n              , m = s(m, g, h, f, A, 21, b[63]);\n            a[0] = a[0] + f | 0;\n            a[1] = a[1] + m | 0;\n            a[2] = a[2] + g | 0;\n            a[3] = a[3] + h | 0\n        },\n        _doFinalize: function() {\n            var b = this._data\n              , n = b.words\n              , a = 8 * this._nDataBytes\n              , c = 8 * b.sigBytes;\n            n[c >>> 5] |= 128 << 24 - c % 32;\n            var e = u.floor(a / 4294967296);\n            n[(c + 64 >>> 9 << 4) + 15] = (e << 8 | e >>> 24) & 16711935 | (e << 24 | e >>> 8) & 4278255360;\n            n[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360;\n            b.sigBytes = 4 * (n.length + 1);\n            this._process();\n            b = this._hash;\n            n = b.words;\n            for (a = 0; 4 > a; a++)\n                c = n[a],\n                n[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;\n            return b\n        },\n        clone: function() {\n            var b = v.clone.call(this);\n            b._hash = this._hash.clone();\n            return b\n        }\n    });\n    t.MD5 = v._createHelper(r);\n    t.HmacMD5 = v._createHmacHelper(r)\n}\n)(Math);\n(function() {\n    var u = CryptoJS\n      , p = u.lib\n      , d = p.Base\n      , l = p.WordArray\n      , p = u.algo\n      , s = p.EvpKDF = d.extend({\n        cfg: d.extend({\n            keySize: 4,\n            hasher: p.MD5,\n            iterations: 1\n        }),\n        init: function(d) {\n            this.cfg = this.cfg.extend(d)\n        },\n        compute: function(d, r) {\n            for (var p = this.cfg, s = p.hasher.create(), b = l.create(), u = b.words, q = p.keySize, p = p.iterations; u.length < q; ) {\n                n && s.update(n);\n                var n = s.update(d).finalize(r);\n                s.reset();\n                for (var a = 1; a < p; a++)\n                    n = s.finalize(n),\n                    s.reset();\n                b.concat(n)\n            }\n            b.sigBytes = 4 * q;\n            return b\n        }\n    });\n    u.EvpKDF = function(d, l, p) {\n        return s.create(p).compute(d, l)\n    }\n}\n)();\nCryptoJS.lib.Cipher || function(u) {\n    var p = CryptoJS\n      , d = p.lib\n      , l = d.Base\n      , s = d.WordArray\n      , t = d.BufferedBlockAlgorithm\n      , r = p.enc.Base64\n      , w = p.algo.EvpKDF\n      , v = d.Cipher = t.extend({\n        cfg: l.extend(),\n        createEncryptor: function(e, a) {\n            return this.create(this._ENC_XFORM_MODE, e, a)\n        },\n        createDecryptor: function(e, a) {\n            return this.create(this._DEC_XFORM_MODE, e, a)\n        },\n        init: function(e, a, b) {\n            this.cfg = this.cfg.extend(b);\n            this._xformMode = e;\n            this._key = a;\n            this.reset()\n        },\n        reset: function() {\n            t.reset.call(this);\n            this._doReset()\n        },\n        process: function(e) {\n            this._append(e);\n            return this._process()\n        },\n        finalize: function(e) {\n            e && this._append(e);\n            return this._doFinalize()\n        },\n        keySize: 4,\n        ivSize: 4,\n        _ENC_XFORM_MODE: 1,\n        _DEC_XFORM_MODE: 2,\n        _createHelper: function(e) {\n            return {\n                encrypt: function(b, k, d) {\n                    return (\"string\" == typeof k ? c : a).encrypt(e, b, k, d)\n                },\n                decrypt: function(b, k, d) {\n                    return (\"string\" == typeof k ? c : a).decrypt(e, b, k, d)\n                }\n            }\n        }\n    });\n    d.StreamCipher = v.extend({\n        _doFinalize: function() {\n            return this._process(!0)\n        },\n        blockSize: 1\n    });\n    var b = p.mode = {}\n      , x = function(e, a, b) {\n        var c = this._iv;\n        c ? this._iv = u : c = this._prevBlock;\n        for (var d = 0; d < b; d++)\n            e[a + d] ^= c[d]\n    }\n      , q = (d.BlockCipherMode = l.extend({\n        createEncryptor: function(e, a) {\n            return this.Encryptor.create(e, a)\n        },\n        createDecryptor: function(e, a) {\n            return this.Decryptor.create(e, a)\n        },\n        init: function(e, a) {\n            this._cipher = e;\n            this._iv = a\n        }\n    })).extend();\n    q.Encryptor = q.extend({\n        processBlock: function(e, a) {\n            var b = this._cipher\n              , c = b.blockSize;\n            x.call(this, e, a, c);\n            b.encryptBlock(e, a);\n            this._prevBlock = e.slice(a, a + c)\n        }\n    });\n    q.Decryptor = q.extend({\n        processBlock: function(e, a) {\n            var b = this._cipher\n              , c = b.blockSize\n              , d = e.slice(a, a + c);\n            b.decryptBlock(e, a);\n            x.call(this, e, a, c);\n            this._prevBlock = d\n        }\n    });\n    b = b.CBC = q;\n    q = (p.pad = {}).Pkcs7 = {\n        pad: function(a, b) {\n            for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, l = [], n = 0; n < c; n += 4)\n                l.push(d);\n            c = s.create(l, c);\n            a.concat(c)\n        },\n        unpad: function(a) {\n            a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255\n        }\n    };\n    d.BlockCipher = v.extend({\n        cfg: v.cfg.extend({\n            mode: b,\n            padding: q\n        }),\n        reset: function() {\n            v.reset.call(this);\n            var a = this.cfg\n              , b = a.iv\n              , a = a.mode;\n            if (this._xformMode == this._ENC_XFORM_MODE)\n                var c = a.createEncryptor;\n            else\n                c = a.createDecryptor,\n                this._minBufferSize = 1;\n            this._mode = c.call(a, this, b && b.words)\n        },\n        _doProcessBlock: function(a, b) {\n            this._mode.processBlock(a, b)\n        },\n        _doFinalize: function() {\n            var a = this.cfg.padding;\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                a.pad(this._data, this.blockSize);\n                var b = this._process(!0)\n            } else\n                b = this._process(!0),\n                a.unpad(b);\n            return b\n        },\n        blockSize: 4\n    });\n    var n = d.CipherParams = l.extend({\n        init: function(a) {\n            this.mixIn(a)\n        },\n        toString: function(a) {\n            return (a || this.formatter).stringify(this)\n        }\n    })\n      , b = (p.format = {}).OpenSSL = {\n        stringify: function(a) {\n            var b = a.ciphertext;\n            a = a.salt;\n            return (a ? s.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r)\n        },\n        parse: function(a) {\n            a = r.parse(a);\n            var b = a.words;\n            if (1398893684 == b[0] && 1701076831 == b[1]) {\n                var c = s.create(b.slice(2, 4));\n                b.splice(0, 4);\n                a.sigBytes -= 16\n            }\n            return n.create({\n                ciphertext: a,\n                salt: c\n            })\n        }\n    }\n      , a = d.SerializableCipher = l.extend({\n        cfg: l.extend({\n            format: b\n        }),\n        encrypt: function(a, b, c, d) {\n            d = this.cfg.extend(d);\n            var l = a.createEncryptor(c, d);\n            b = l.finalize(b);\n            l = l.cfg;\n            return n.create({\n                ciphertext: b,\n                key: c,\n                iv: l.iv,\n                algorithm: a,\n                mode: l.mode,\n                padding: l.padding,\n                blockSize: a.blockSize,\n                formatter: d.format\n            })\n        },\n        decrypt: function(a, b, c, d) {\n            d = this.cfg.extend(d);\n            b = this._parse(b, d.format);\n            return a.createDecryptor(c, d).finalize(b.ciphertext)\n        },\n        _parse: function(a, b) {\n            return \"string\" == typeof a ? b.parse(a, this) : a\n        }\n    })\n      , p = (p.kdf = {}).OpenSSL = {\n        execute: function(a, b, c, d) {\n            d || (d = s.random(8));\n            a = w.create({\n                keySize: b + c\n            }).compute(a, d);\n            c = s.create(a.words.slice(b), 4 * c);\n            a.sigBytes = 4 * b;\n            return n.create({\n                key: a,\n                iv: c,\n                salt: d\n            })\n        }\n    }\n      , c = d.PasswordBasedCipher = a.extend({\n        cfg: a.cfg.extend({\n            kdf: p\n        }),\n        encrypt: function(b, c, d, l) {\n            l = this.cfg.extend(l);\n            d = l.kdf.execute(d, b.keySize, b.ivSize);\n            l.iv = d.iv;\n            b = a.encrypt.call(this, b, c, d.key, l);\n            b.mixIn(d);\n            return b\n        },\n        decrypt: function(b, c, d, l) {\n            l = this.cfg.extend(l);\n            c = this._parse(c, l.format);\n            d = l.kdf.execute(d, b.keySize, b.ivSize, c.salt);\n            l.iv = d.iv;\n            return a.decrypt.call(this, b, c, d.key, l)\n        }\n    })\n}();\n(function() {\n    for (var u = CryptoJS, p = u.lib.BlockCipher, d = u.algo, l = [], s = [], t = [], r = [], w = [], v = [], b = [], x = [], q = [], n = [], a = [], c = 0; 256 > c; c++)\n        a[c] = 128 > c ? c << 1 : c << 1 ^ 283;\n    for (var e = 0, j = 0, c = 0; 256 > c; c++) {\n        var k = j ^ j << 1 ^ j << 2 ^ j << 3 ^ j << 4\n          , k = k >>> 8 ^ k & 255 ^ 99;\n        l[e] = k;\n        s[k] = e;\n        var z = a[e]\n          , F = a[z]\n          , G = a[F]\n          , y = 257 * a[k] ^ 16843008 * k;\n        t[e] = y << 24 | y >>> 8;\n        r[e] = y << 16 | y >>> 16;\n        w[e] = y << 8 | y >>> 24;\n        v[e] = y;\n        y = 16843009 * G ^ 65537 * F ^ 257 * z ^ 16843008 * e;\n        b[k] = y << 24 | y >>> 8;\n        x[k] = y << 16 | y >>> 16;\n        q[k] = y << 8 | y >>> 24;\n        n[k] = y;\n        e ? (e = z ^ a[a[a[G ^ z]]],\n        j ^= a[a[j]]) : e = j = 1\n    }\n    var H = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]\n      , d = d.AES = p.extend({\n        _doReset: function() {\n            for (var a = this._key, c = a.words, d = a.sigBytes / 4, a = 4 * ((this._nRounds = d + 6) + 1), e = this._keySchedule = [], j = 0; j < a; j++)\n                if (j < d)\n                    e[j] = c[j];\n                else {\n                    var k = e[j - 1];\n                    j % d ? 6 < d && 4 == j % d && (k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255]) : (k = k << 8 | k >>> 24,\n                    k = l[k >>> 24] << 24 | l[k >>> 16 & 255] << 16 | l[k >>> 8 & 255] << 8 | l[k & 255],\n                    k ^= H[j / d | 0] << 24);\n                    e[j] = e[j - d] ^ k\n                }\n            c = this._invKeySchedule = [];\n            for (d = 0; d < a; d++)\n                j = a - d,\n                k = d % 4 ? e[j] : e[j - 4],\n                c[d] = 4 > d || 4 >= j ? k : b[l[k >>> 24]] ^ x[l[k >>> 16 & 255]] ^ q[l[k >>> 8 & 255]] ^ n[l[k & 255]]\n        },\n        encryptBlock: function(a, b) {\n            this._doCryptBlock(a, b, this._keySchedule, t, r, w, v, l)\n        },\n        decryptBlock: function(a, c) {\n            var d = a[c + 1];\n            a[c + 1] = a[c + 3];\n            a[c + 3] = d;\n            this._doCryptBlock(a, c, this._invKeySchedule, b, x, q, n, s);\n            d = a[c + 1];\n            a[c + 1] = a[c + 3];\n            a[c + 3] = d\n        },\n        _doCryptBlock: function(a, b, c, d, e, j, l, f) {\n            for (var m = this._nRounds, g = a[b] ^ c[0], h = a[b + 1] ^ c[1], k = a[b + 2] ^ c[2], n = a[b + 3] ^ c[3], p = 4, r = 1; r < m; r++)\n                var q = d[g >>> 24] ^ e[h >>> 16 & 255] ^ j[k >>> 8 & 255] ^ l[n & 255] ^ c[p++]\n                  , s = d[h >>> 24] ^ e[k >>> 16 & 255] ^ j[n >>> 8 & 255] ^ l[g & 255] ^ c[p++]\n                  , t = d[k >>> 24] ^ e[n >>> 16 & 255] ^ j[g >>> 8 & 255] ^ l[h & 255] ^ c[p++]\n                  , n = d[n >>> 24] ^ e[g >>> 16 & 255] ^ j[h >>> 8 & 255] ^ l[k & 255] ^ c[p++]\n                  , g = q\n                  , h = s\n                  , k = t;\n            q = (f[g >>> 24] << 24 | f[h >>> 16 & 255] << 16 | f[k >>> 8 & 255] << 8 | f[n & 255]) ^ c[p++];\n            s = (f[h >>> 24] << 24 | f[k >>> 16 & 255] << 16 | f[n >>> 8 & 255] << 8 | f[g & 255]) ^ c[p++];\n            t = (f[k >>> 24] << 24 | f[n >>> 16 & 255] << 16 | f[g >>> 8 & 255] << 8 | f[h & 255]) ^ c[p++];\n            n = (f[n >>> 24] << 24 | f[g >>> 16 & 255] << 16 | f[h >>> 8 & 255] << 8 | f[k & 255]) ^ c[p++];\n            a[b] = q;\n            a[b + 1] = s;\n            a[b + 2] = t;\n            a[b + 3] = n\n        },\n        keySize: 8\n    });\n    u.AES = p._createHelper(d)\n}\n)();\n\n// keyObj = {'key': '28496DC85152D9C0', 'iv': '278F6962C0647024', 'security': '䐵匠䴵'}\n\n\n\nfunction make_j_password(pwd, security, key, iv){\n\treturn security + CryptoJS.AES.encrypt(pwd, CryptoJS.enc.Utf8.parse(key), {\n                iv: CryptoJS.enc.Utf8.parse(iv)\n            }).toString()\n}"
  },
  {
    "path": "其他实战/【好莱客】参数解析/holike.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-07  Python: 3.7\nimport execjs.runtime_names\nimport requests\nimport time\nimport re\n\n\nclass MakeParam:\n    \"\"\"\n    好莱客\n    http://oa.holike.com/login.jsp\n    \"\"\"\n\n    def __init__(self, name, pwd):\n        self.name = name\n        self.pwd = pwd\n        self.js = None\n\n        self.read_js()\n\n    def get_key_vi(self):\n        url = 'http://oa.holike.com/resource/js/session.jsp?_={t}&s_ajax=true'\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'\n        }\n        response = requests.get(url.format(t=int(round(time.time() * 1000))), headers=headers)\n        try:\n            ret = re.search(r'return \"(.*?)\";', response.text).group(1)\n            _key = self.js.call('get_key_iv', ret)\n            return _key\n        except AttributeError:\n            print('获取key失败')\n\n    def read_js(self):\n        with open('encryp.js', 'r', encoding='utf-8') as f:\n            self.js = execjs.compile(f.read())\n\n    def make_params(self):\n        obj = self.get_key_vi()\n        j_password = self.js.call(\"make_j_password\", self.pwd, obj.get('security'), obj.get('key'), obj.get('iv'))\n\n        msg = \"\"\"\n        j_username: {user}\n        j_password: {j_password}\n        \"\"\".format(user=self.name, j_password=j_password)\n        print(msg)\n\n\nif __name__ == '__main__':\n    username = input('请输入用户名')\n    password = input('请输入密码')\n    hk = MakeParam(username, password)\n    hk.make_params()\n"
  },
  {
    "path": "其他实战/【小牛在线】登录参数生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【小牛在线】登录参数生成/encryp.js",
    "content": "var window = this;\n    !function(e) {\n        function t(i) {\n            var e = u\n              , t = e.biDivideByRadixPower(i, this.k - 1)\n              , s = e.biMultiply(t, this.mu)\n              , n = e.biDivideByRadixPower(s, this.k + 1)\n              , o = e.biModuloByRadixPower(i, this.k + 1)\n              , r = e.biMultiply(n, this.modulus)\n              , a = e.biModuloByRadixPower(r, this.k + 1)\n              , l = e.biSubtract(o, a);\n            l.isNeg && (l = e.biAdd(l, this.bkplus1));\n            for (var d = e.biCompare(l, this.modulus) >= 0; d; )\n                l = e.biSubtract(l, this.modulus),\n                d = e.biCompare(l, this.modulus) >= 0;\n            return l\n        }\n        function s(i, e) {\n            var t = u.biMultiply(i, e);\n            return this.modulo(t)\n        }\n        function n(i, e) {\n            var t = new b;\n            t.digits[0] = 1;\n            for (var s = i, n = e; ; ) {\n                if (0 != (1 & n.digits[0]) && (t = this.multiplyMod(t, s)),\n                n = u.biShiftRight(n, 1),\n                0 == n.digits[0] && 0 == u.biHighIndex(n))\n                    break;\n                s = this.multiplyMod(s, s)\n            }\n            return t\n        }\n        function o(i) {\n            for (var e = \"\", t = 0; t < i; t++)\n                e += Math.floor(10 * Math.random());\n            return e\n        }\n        var r, a, l, d, u = e.RSAUtils || {}, c = 16, h = c, f = 65536, m = f >>> 1, p = f * f, g = f - 1, b = e.BigInt = function(i) {\n            \"boolean\" == typeof i && 1 == i ? this.digits = null : this.digits = a.slice(0),\n            this.isNeg = !1\n        }\n        ;\n        u.setMaxDigits = function(i) {\n            r = i,\n            a = new Array(r);\n            for (var e = 0; e < a.length; e++)\n                a[e] = 0;\n            l = new b,\n            d = new b,\n            d.digits[0] = 1\n        }\n        ,\n        u.setMaxDigits(20);\n        var v = 15;\n        u.biFromNumber = function(i) {\n            var e = new b;\n            e.isNeg = i < 0,\n            i = Math.abs(i);\n            for (var t = 0; i > 0; )\n                e.digits[t++] = i & g,\n                i = Math.floor(i / f);\n            return e\n        }\n        ;\n        var w = u.biFromNumber(1e15);\n        u.biFromDecimal = function(i) {\n            for (var e, t = \"-\" == i.charAt(0), s = t ? 1 : 0; s < i.length && \"0\" == i.charAt(s); )\n                ++s;\n            if (s == i.length)\n                e = new b;\n            else {\n                var n = i.length - s\n                  , o = n % v;\n                for (0 == o && (o = v),\n                e = u.biFromNumber(Number(i.substr(s, o))),\n                s += o; s < i.length; )\n                    e = u.biAdd(u.biMultiply(e, w), u.biFromNumber(Number(i.substr(s, v)))),\n                    s += v;\n                e.isNeg = t\n            }\n            return e\n        }\n        ,\n        u.biCopy = function(i) {\n            var e = new b((!0));\n            return e.digits = i.digits.slice(0),\n            e.isNeg = i.isNeg,\n            e\n        }\n        ,\n        u.reverseStr = function(i) {\n            for (var e = \"\", t = i.length - 1; t > -1; --t)\n                e += i.charAt(t);\n            return e\n        }\n        ;\n        var x = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\"];\n        u.biToString = function(i, e) {\n            var t = new b;\n            t.digits[0] = e;\n            for (var s = u.biDivideModulo(i, t), n = x[s[1].digits[0]]; 1 == u.biCompare(s[0], l); )\n                s = u.biDivideModulo(s[0], t),\n                digit = s[1].digits[0],\n                n += x[s[1].digits[0]];\n            return (i.isNeg ? \"-\" : \"\") + u.reverseStr(n)\n        }\n        ,\n        u.biToDecimal = function(i) {\n            var e = new b;\n            e.digits[0] = 10;\n            for (var t = u.biDivideModulo(i, e), s = String(t[1].digits[0]); 1 == u.biCompare(t[0], l); )\n                t = u.biDivideModulo(t[0], e),\n                s += String(t[1].digits[0]);\n            return (i.isNeg ? \"-\" : \"\") + u.reverseStr(s)\n        }\n        ;\n        var y = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\n        u.digitToHex = function(e) {\n            var t = 15\n              , s = \"\";\n            for (i = 0; i < 4; ++i)\n                s += y[e & t],\n                e >>>= 4;\n            return u.reverseStr(s)\n        }\n        ,\n        u.biToHex = function(i) {\n            for (var e = \"\", t = (u.biHighIndex(i),\n            u.biHighIndex(i)); t > -1; --t)\n                e += u.digitToHex(i.digits[t]);\n            return e\n        }\n        ,\n        u.charToHex = function(i) {\n            var e, t = 48, s = t + 9, n = 97, o = n + 25, r = 65, a = 90;\n            return e = i >= t && i <= s ? i - t : i >= r && i <= a ? 10 + i - r : i >= n && i <= o ? 10 + i - n : 0\n        }\n        ,\n        u.hexToDigit = function(i) {\n            for (var e = 0, t = Math.min(i.length, 4), s = 0; s < t; ++s)\n                e <<= 4,\n                e |= u.charToHex(i.charCodeAt(s));\n            return e\n        }\n        ,\n        u.biFromHex = function(i) {\n            for (var e = new b, t = i.length, s = t, n = 0; s > 0; s -= 4,\n            ++n)\n                e.digits[n] = u.hexToDigit(i.substr(Math.max(s - 4, 0), Math.min(s, 4)));\n            return e\n        }\n        ,\n        u.biFromString = function(i, e) {\n            var t = \"-\" == i.charAt(0)\n              , s = t ? 1 : 0\n              , n = new b\n              , o = new b;\n            o.digits[0] = 1;\n            for (var r = i.length - 1; r >= s; r--) {\n                var a = i.charCodeAt(r)\n                  , l = u.charToHex(a)\n                  , d = u.biMultiplyDigit(o, l);\n                n = u.biAdd(n, d),\n                o = u.biMultiplyDigit(o, e)\n            }\n            return n.isNeg = t,\n            n\n        }\n        ,\n        u.biDump = function(i) {\n            return (i.isNeg ? \"-\" : \"\") + i.digits.join(\" \")\n        }\n        ,\n        u.biAdd = function(i, e) {\n            var t;\n            if (i.isNeg != e.isNeg)\n                e.isNeg = !e.isNeg,\n                t = u.biSubtract(i, e),\n                e.isNeg = !e.isNeg;\n            else {\n                t = new b;\n                for (var s, n = 0, o = 0; o < i.digits.length; ++o)\n                    s = i.digits[o] + e.digits[o] + n,\n                    t.digits[o] = s % f,\n                    n = Number(s >= f);\n                t.isNeg = i.isNeg\n            }\n            return t\n        }\n        ,\n        u.biSubtract = function(i, e) {\n            var t;\n            if (i.isNeg != e.isNeg)\n                e.isNeg = !e.isNeg,\n                t = u.biAdd(i, e),\n                e.isNeg = !e.isNeg;\n            else {\n                t = new b;\n                var s, n;\n                n = 0;\n                for (var o = 0; o < i.digits.length; ++o)\n                    s = i.digits[o] - e.digits[o] + n,\n                    t.digits[o] = s % f,\n                    t.digits[o] < 0 && (t.digits[o] += f),\n                    n = 0 - Number(s < 0);\n                if (n == -1) {\n                    n = 0;\n                    for (var o = 0; o < i.digits.length; ++o)\n                        s = 0 - t.digits[o] + n,\n                        t.digits[o] = s % f,\n                        t.digits[o] < 0 && (t.digits[o] += f),\n                        n = 0 - Number(s < 0);\n                    t.isNeg = !i.isNeg\n                } else\n                    t.isNeg = i.isNeg\n            }\n            return t\n        }\n        ,\n        u.biHighIndex = function(i) {\n            for (var e = i.digits.length - 1; e > 0 && 0 == i.digits[e]; )\n                --e;\n            return e\n        }\n        ,\n        u.biNumBits = function(i) {\n            var e, t = u.biHighIndex(i), s = i.digits[t], n = (t + 1) * h;\n            for (e = n; e > n - h && 0 == (32768 & s); --e)\n                s <<= 1;\n            return e\n        }\n        ,\n        u.biMultiply = function(i, e) {\n            for (var t, s, n, o = new b, r = u.biHighIndex(i), a = u.biHighIndex(e), l = 0; l <= a; ++l) {\n                for (t = 0,\n                n = l,\n                j = 0; j <= r; ++j,\n                ++n)\n                    s = o.digits[n] + i.digits[j] * e.digits[l] + t,\n                    o.digits[n] = s & g,\n                    t = s >>> c;\n                o.digits[l + r + 1] = t\n            }\n            return o.isNeg = i.isNeg != e.isNeg,\n            o\n        }\n        ,\n        u.biMultiplyDigit = function(i, e) {\n            var t, s, n;\n            result = new b,\n            t = u.biHighIndex(i),\n            s = 0;\n            for (var o = 0; o <= t; ++o)\n                n = result.digits[o] + i.digits[o] * e + s,\n                result.digits[o] = n & g,\n                s = n >>> c;\n            return result.digits[1 + t] = s,\n            result\n        }\n        ,\n        u.arrayCopy = function(i, e, t, s, n) {\n            for (var o = Math.min(e + n, i.length), r = e, a = s; r < o; ++r,\n            ++a)\n                t[a] = i[r]\n        }\n        ;\n        var C = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535];\n        u.biShiftLeft = function(i, e) {\n            var t = Math.floor(e / h)\n              , s = new b;\n            u.arrayCopy(i.digits, 0, s.digits, t, s.digits.length - t);\n            for (var n = e % h, o = h - n, r = s.digits.length - 1, a = r - 1; r > 0; --r,\n            --a)\n                s.digits[r] = s.digits[r] << n & g | (s.digits[a] & C[n]) >>> o;\n            return s.digits[0] = s.digits[r] << n & g,\n            s.isNeg = i.isNeg,\n            s\n        }\n        ;\n        var S = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535];\n        u.biShiftRight = function(i, e) {\n            var t = Math.floor(e / h)\n              , s = new b;\n            u.arrayCopy(i.digits, t, s.digits, 0, i.digits.length - t);\n            for (var n = e % h, o = h - n, r = 0, a = r + 1; r < s.digits.length - 1; ++r,\n            ++a)\n                s.digits[r] = s.digits[r] >>> n | (s.digits[a] & S[n]) << o;\n            return s.digits[s.digits.length - 1] >>>= n,\n            s.isNeg = i.isNeg,\n            s\n        }\n        ,\n        u.biMultiplyByRadixPower = function(i, e) {\n            var t = new b;\n            return u.arrayCopy(i.digits, 0, t.digits, e, t.digits.length - e),\n            t\n        }\n        ,\n        u.biDivideByRadixPower = function(i, e) {\n            var t = new b;\n            return u.arrayCopy(i.digits, e, t.digits, 0, t.digits.length - e),\n            t\n        }\n        ,\n        u.biModuloByRadixPower = function(i, e) {\n            var t = new b;\n            return u.arrayCopy(i.digits, 0, t.digits, 0, e),\n            t\n        }\n        ,\n        u.biCompare = function(i, e) {\n            if (i.isNeg != e.isNeg)\n                return 1 - 2 * Number(i.isNeg);\n            for (var t = i.digits.length - 1; t >= 0; --t)\n                if (i.digits[t] != e.digits[t])\n                    return i.isNeg ? 1 - 2 * Number(i.digits[t] > e.digits[t]) : 1 - 2 * Number(i.digits[t] < e.digits[t]);\n            return 0\n        }\n        ,\n        u.biDivideModulo = function(i, e) {\n            var t, s, n = u.biNumBits(i), o = u.biNumBits(e), r = e.isNeg;\n            if (n < o)\n                return i.isNeg ? (t = u.biCopy(d),\n                t.isNeg = !e.isNeg,\n                i.isNeg = !1,\n                e.isNeg = !1,\n                s = biSubtract(e, i),\n                i.isNeg = !0,\n                e.isNeg = r) : (t = new b,\n                s = u.biCopy(i)),\n                [t, s];\n            t = new b,\n            s = i;\n            for (var a = Math.ceil(o / h) - 1, l = 0; e.digits[a] < m; )\n                e = u.biShiftLeft(e, 1),\n                ++l,\n                ++o,\n                a = Math.ceil(o / h) - 1;\n            s = u.biShiftLeft(s, l),\n            n += l;\n            for (var c = Math.ceil(n / h) - 1, v = u.biMultiplyByRadixPower(e, c - a); u.biCompare(s, v) != -1; )\n                ++t.digits[c - a],\n                s = u.biSubtract(s, v);\n            for (var w = c; w > a; --w) {\n                var x = w >= s.digits.length ? 0 : s.digits[w]\n                  , y = w - 1 >= s.digits.length ? 0 : s.digits[w - 1]\n                  , C = w - 2 >= s.digits.length ? 0 : s.digits[w - 2]\n                  , S = a >= e.digits.length ? 0 : e.digits[a]\n                  , $ = a - 1 >= e.digits.length ? 0 : e.digits[a - 1];\n                x == S ? t.digits[w - a - 1] = g : t.digits[w - a - 1] = Math.floor((x * f + y) / S);\n                for (var I = t.digits[w - a - 1] * (S * f + $), k = x * p + (y * f + C); I > k; )\n                    --t.digits[w - a - 1],\n                    I = t.digits[w - a - 1] * (S * f | $),\n                    k = x * f * f + (y * f + C);\n                v = u.biMultiplyByRadixPower(e, w - a - 1),\n                s = u.biSubtract(s, u.biMultiplyDigit(v, t.digits[w - a - 1])),\n                s.isNeg && (s = u.biAdd(s, v),\n                --t.digits[w - a - 1])\n            }\n            return s = u.biShiftRight(s, l),\n            t.isNeg = i.isNeg != r,\n            i.isNeg && (t = r ? u.biAdd(t, d) : u.biSubtract(t, d),\n            e = u.biShiftRight(e, l),\n            s = u.biSubtract(e, s)),\n            0 == s.digits[0] && 0 == u.biHighIndex(s) && (s.isNeg = !1),\n            [t, s]\n        }\n        ,\n        u.biDivide = function(i, e) {\n            return u.biDivideModulo(i, e)[0]\n        }\n        ,\n        u.biModulo = function(i, e) {\n            return u.biDivideModulo(i, e)[1]\n        }\n        ,\n        u.biMultiplyMod = function(i, e, t) {\n            return u.biModulo(u.biMultiply(i, e), t)\n        }\n        ,\n        u.biPow = function(i, e) {\n            for (var t = d, s = i; ; ) {\n                if (0 != (1 & e) && (t = u.biMultiply(t, s)),\n                e >>= 1,\n                0 == e)\n                    break;\n                s = u.biMultiply(s, s)\n            }\n            return t\n        }\n        ,\n        u.biPowMod = function(i, e, t) {\n            for (var s = d, n = i, o = e; ; ) {\n                if (0 != (1 & o.digits[0]) && (s = u.biMultiplyMod(s, n, t)),\n                o = u.biShiftRight(o, 1),\n                0 == o.digits[0] && 0 == u.biHighIndex(o))\n                    break;\n                n = u.biMultiplyMod(n, n, t)\n            }\n            return s\n        }\n        ,\n        e.BarrettMu = function(i) {\n            this.modulus = u.biCopy(i),\n            this.k = u.biHighIndex(this.modulus) + 1;\n            var e = new b;\n            e.digits[2 * this.k] = 1,\n            this.mu = u.biDivide(e, this.modulus),\n            this.bkplus1 = new b,\n            this.bkplus1.digits[this.k + 1] = 1,\n            this.modulo = t,\n            this.multiplyMod = s,\n            this.powMod = n\n        }\n        ;\n        var $ = function(i, t, s, n) {\n            var o = u;\n            this.e = o.biFromHex(i),\n            this.d = o.biFromHex(t),\n            this.m = o.biFromHex(s),\n            this.chunkSize = 2 * o.biHighIndex(this.m),\n            this.radix = 16,\n            this.barrett = new e.BarrettMu(this.m),\n            this.rndLen = n\n        };\n        u.getKeyPair = function(i, e, t, s) {\n            return new $(i,e,t,s)\n        }\n        ,\n        \"undefined\" == typeof e.twoDigit && (e.twoDigit = function(i) {\n            return (i < 10 ? \"0\" : \"\") + String(i)\n        }\n        );\n        var I = \"00d3e5839928d17df7ad0ae809c772cd07615cc6531e49aaa2331ba80d1308d25a67f055d2e5c2e90871e779e6ac8629de1d9203333e3b3aabdb1c90dea66c23db6d6941ec89bb99a1f8e44e0a4207341a58f5e43e49f9b69bff1f3115dda47a27e67c6d4b81895a39065ca1ae278d0dfca752aac9c8ac9d0b25cdea70e17e39db\"\n          , k = \"010001\"\n          , _ = \"7\";\n        u.pwdEncode = function(i) {\n            var e = u.getKeyPair(k, \"\", I, _);\n            return u.encryptedString(e, i)\n        }\n        ,\n        u.encryptedString = function(i, e) {\n            for (var t = o(i.rndLen) + e, s = [], n = t.length, r = 0; r < n; )\n                s[r] = t.charCodeAt(r),\n                r++;\n            for (; s.length % i.chunkSize != 0; )\n                s[r++] = 0;\n            var a, l, d, c = s.length, h = \"\";\n            for (r = 0; r < c; r += i.chunkSize) {\n                for (d = new b,\n                a = 0,\n                l = r; l < r + i.chunkSize; ++a)\n                    d.digits[a] = s[l++],\n                    d.digits[a] += s[l++] << 8;\n                var f = i.barrett.powMod(d, i.e)\n                  , m = 16 == i.radix ? u.biToHex(f) : u.biToString(f, i.radix);\n                h += m + \" \"\n            }\n            return h.substring(0, h.length - 1)\n        }\n        ,\n        u.decryptedString = function(i, e) {\n            var t, s, n, o = e.split(\" \"), r = \"\";\n            for (t = 0; t < o.length; ++t) {\n                var a;\n                for (a = 16 == i.radix ? u.biFromHex(o[t]) : u.biFromString(o[t], i.radix),\n                n = i.barrett.powMod(a, i.d),\n                s = 0; s <= u.biHighIndex(n); ++s)\n                    r += String.fromCharCode(255 & n.digits[s], n.digits[s] >> 8)\n            }\n            return 0 == r.charCodeAt(r.length - 1) && (r = r.substring(0, r.length - 1)),\n            r\n        }\n        ,\n        u.setMaxDigits(130),\n        e.RSAUtils = u\n    }(window)\n\n\n\nfunction get_pwd(pwd){\n\treturn RSAUtils.pwdEncode(pwd)\n}"
  },
  {
    "path": "其他实战/【小牛在线】登录参数生成/make_param.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-29  Python: 3.7\n\nimport execjs.runtime_names\n\n\"\"\"\n小牛在线，登陆密码参数解密\nhttps://www.xiaoniu88.com/user/login\n\"\"\"\n\n\ndef init_js():\n    with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n        return execjs.compile(f.read())\n\n\ndef make_param(password):\n    js = init_js()\n    pwd = js.call('get_pwd', password)\n    print('加密后密码', pwd)\n\n\nif __name__ == '__main__':\n    password = input('明文密码')\n    make_param(password)\n"
  },
  {
    "path": "其他实战/【开鑫贷】登陆参数生成/KaiXinDai.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-15  Python: 3.7\nimport requests\nimport execjs.runtime_names\n\n\nclass KaiXinDai:\n    \"\"\"\n    开鑫贷登陆参数解密\n    https://www.gkkxd.com/userAuth/login\n    \"\"\"\n    def __init__(self, pwd):\n        self.js = None\n        self.pwd = pwd\n        self.init_js()\n\n    @staticmethod\n    def get_dl():\n        from lxml import etree\n        url = 'https://www.kxjf.com/user/login?mainSiteName=kxd'\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',\n            'Host': 'www.kxjf.com',\n            'Referer': 'https://www.gkkxd.com/userAuth/login',\n        }\n        response = requests.get(url, headers=headers)\n        etree = etree.HTML(response.text)\n        dlmy = etree.xpath('//*[@id=\"dlmy\"]/@value')[0]\n        return dlmy\n\n    def init_js(self):\n        with open('encryp.js', 'r', encoding='utf-8') as f:\n            self.js = execjs.compile(f.read())\n\n    def make_param(self):\n        pwd = self.js.call('test', self.get_dl(), self.pwd)\n        print('pwd生成', pwd)\n\n\nif __name__ == '__main__':\n    password = input('请输入用户密码')\n    kxd = KaiXinDai(password)\n    kxd.make_param()\n"
  },
  {
    "path": "其他实战/【开鑫贷】登陆参数生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【开鑫贷】登陆参数生成/encryp.js",
    "content": " var hexcase = 0;\nvar b64pad = \"\";\nvar chrsz = 8;\nfunction pwd_encrypt(a, b) {\n    return encrypt_md5_aes(a, b)\n}\nfunction hex_md5(a) {\n    return binl2hex(core_md5(str2binl(a), a.length * chrsz))\n}\nfunction b64_md5(a) {\n    return binl2b64(core_md5(str2binl(a), a.length * chrsz))\n}\nfunction hex_hmac_md5(a, b) {\n    return binl2hex(core_hmac_md5(a, b))\n}\nfunction b64_hmac_md5(a, b) {\n    return binl2b64(core_hmac_md5(a, b))\n}\nfunction calcMD5(a) {\n    return binl2hex(core_md5(str2binl(a), a.length * chrsz))\n}\nfunction md5_vm_test() {\n    return hex_md5(\"abc\") == \"900150983cd24fb0d6963f7d28e17f72\"\n}\nfunction core_md5(p, k) {\n    p[k >> 5] |= 128 << ((k) % 32);\n    p[(((k + 64) >>> 9) << 4) + 14] = k;\n    var o = 1732584193;\n    var n = -271733879;\n    var m = -1732584194;\n    var l = 271733878;\n    for (var g = 0; g < p.length; g += 16) {\n        var j = o;\n        var h = n;\n        var f = m;\n        var e = l;\n        o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936);\n        l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);\n        m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);\n        n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);\n        o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);\n        l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);\n        m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);\n        n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);\n        o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);\n        l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);\n        m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);\n        n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);\n        o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682);\n        l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);\n        m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);\n        n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);\n        o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);\n        l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);\n        m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);\n        n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);\n        o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);\n        l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);\n        m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);\n        n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);\n        o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);\n        l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);\n        m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);\n        n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);\n        o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);\n        l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);\n        m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);\n        n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734);\n        o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);\n        l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);\n        m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);\n        n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);\n        o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);\n        l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);\n        m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);\n        n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);\n        o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);\n        l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);\n        m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979);\n        n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);\n        o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);\n        l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);\n        m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);\n        n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);\n        o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);\n        l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415);\n        m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);\n        n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);\n        o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);\n        l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606);\n        m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);\n        n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);\n        o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);\n        l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);\n        m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);\n        n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);\n        o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);\n        l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);\n        m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);\n        n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);\n        o = safe_add(o, j);\n        n = safe_add(n, h);\n        m = safe_add(m, f);\n        l = safe_add(l, e)\n    }\n    return Array(o, n, m, l)\n}\nfunction md5_cmn(h, e, d, c, g, f) {\n    return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)\n}\nfunction md5_ff(g, f, k, j, e, i, h) {\n    return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)\n}\nfunction md5_gg(g, f, k, j, e, i, h) {\n    return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)\n}\nfunction md5_hh(g, f, k, j, e, i, h) {\n    return md5_cmn(f ^ k ^ j, g, f, e, i, h)\n}\nfunction md5_ii(g, f, k, j, e, i, h) {\n    return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)\n}\nfunction core_hmac_md5(c, f) {\n    var e = str2binl(c);\n    if (e.length > 16) {\n        e = core_md5(e, c.length * chrsz)\n    }\n    var a = Array(16)\n      , d = Array(16);\n    for (var b = 0; b < 16; b++) {\n        a[b] = e[b] ^ 909522486;\n        d[b] = e[b] ^ 1549556828\n    }\n    var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz);\n    return core_md5(d.concat(g), 512 + 128)\n}\nfunction safe_add(a, d) {\n    var c = (a & 65535) + (d & 65535);\n    var b = (a >> 16) + (d >> 16) + (c >> 16);\n    return (b << 16) | (c & 65535)\n}\nfunction bit_rol(a, b) {\n    return (a << b) | (a >>> (32 - b))\n}\nfunction str2binl(d) {\n    var c = Array();\n    var a = (1 << chrsz) - 1;\n    for (var b = 0; b < d.length * chrsz; b += chrsz) {\n        c[b >> 5] |= (d.charCodeAt(b / chrsz) & a) << (b % 32)\n    }\n    return c\n}\nfunction binl2hex(c) {\n    var b = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\n    var d = \"\";\n    for (var a = 0; a < c.length * 4; a++) {\n        d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15)\n    }\n    return d\n}\nfunction binl2b64(d) {\n    var c = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var f = \"\";\n    for (var b = 0; b < d.length * 4; b += 3) {\n        var e = (((d[b >> 2] >> 8 * (b % 4)) & 255) << 16) | (((d[b + 1 >> 2] >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d[b + 2 >> 2] >> 8 * ((b + 2) % 4)) & 255);\n        for (var a = 0; a < 4; a++) {\n            if (b * 8 + a * 6 > d.length * 32) {\n                f += b64pad\n            } else {\n                f += c.charAt((e >> 6 * (3 - a)) & 63)\n            }\n        }\n    }\n    return f\n}\nvar CryptoJS = CryptoJS || function(o, e) {\n    var h = {}\n      , g = h.lib = {}\n      , z = function() {}\n      , y = g.Base = {\n        extend: function(b) {\n            z.prototype = this;\n            var d = new z;\n            b && d.mixIn(b);\n            d.hasOwnProperty(\"init\") || (d.init = function() {\n                d.$super.init.apply(this, arguments)\n            }\n            );\n            d.init.prototype = d;\n            d.$super = this;\n            return d\n        },\n        create: function() {\n            var b = this.extend();\n            b.init.apply(b, arguments);\n            return b\n        },\n        init: function() {},\n        mixIn: function(b) {\n            for (var d in b) {\n                b.hasOwnProperty(d) && (this[d] = b[d])\n            }\n            b.hasOwnProperty(\"toString\") && (this.toString = b.toString)\n        },\n        clone: function() {\n            return this.init.prototype.extend(this)\n        }\n    }\n      , a = g.WordArray = y.extend({\n        init: function(b, d) {\n            b = this.words = b || [];\n            this.sigBytes = d != e ? d : 4 * b.length\n        },\n        toString: function(b) {\n            return (b || m).stringify(this)\n        },\n        concat: function(b) {\n            var p = this.words\n              , n = b.words\n              , l = this.sigBytes;\n            b = b.sigBytes;\n            this.clamp();\n            if (l % 4) {\n                for (var d = 0; d < b; d++) {\n                    p[l + d >>> 2] |= (n[d >>> 2] >>> 24 - 8 * (d % 4) & 255) << 24 - 8 * ((l + d) % 4)\n                }\n            } else {\n                if (65535 < n.length) {\n                    for (d = 0; d < b; d += 4) {\n                        p[l + d >>> 2] = n[d >>> 2]\n                    }\n                } else {\n                    p.push.apply(p, n)\n                }\n            }\n            this.sigBytes += b;\n            return this\n        },\n        clamp: function() {\n            var b = this.words\n              , d = this.sigBytes;\n            b[d >>> 2] &= 4294967295 << 32 - 8 * (d % 4);\n            b.length = o.ceil(d / 4)\n        },\n        clone: function() {\n            var b = y.clone.call(this);\n            b.words = this.words.slice(0);\n            return b\n        },\n        random: function(b) {\n            for (var l = [], d = 0; d < b; d += 4) {\n                l.push(4294967296 * o.random() | 0)\n            }\n            return new a.init(l,b)\n        }\n    })\n      , k = h.enc = {}\n      , m = k.Hex = {\n        stringify: function(b) {\n            var p = b.words;\n            b = b.sigBytes;\n            for (var n = [], l = 0; l < b; l++) {\n                var d = p[l >>> 2] >>> 24 - 8 * (l % 4) & 255;\n                n.push((d >>> 4).toString(16));\n                n.push((d & 15).toString(16))\n            }\n            return n.join(\"\")\n        },\n        parse: function(b) {\n            for (var n = b.length, l = [], d = 0; d < n; d += 2) {\n                l[d >>> 3] |= parseInt(b.substr(d, 2), 16) << 24 - 4 * (d % 8)\n            }\n            return new a.init(l,n / 2)\n        }\n    }\n      , i = k.Latin1 = {\n        stringify: function(b) {\n            var n = b.words;\n            b = b.sigBytes;\n            for (var l = [], d = 0; d < b; d++) {\n                l.push(String.fromCharCode(n[d >>> 2] >>> 24 - 8 * (d % 4) & 255))\n            }\n            return l.join(\"\")\n        },\n        parse: function(b) {\n            for (var n = b.length, l = [], d = 0; d < n; d++) {\n                l[d >>> 2] |= (b.charCodeAt(d) & 255) << 24 - 8 * (d % 4)\n            }\n            return new a.init(l,n)\n        }\n    }\n      , j = k.Utf8 = {\n        stringify: function(b) {\n            try {\n                return decodeURIComponent(escape(i.stringify(b)))\n            } catch (d) {\n                throw Error(\"Malformed UTF-8 data\")\n            }\n        },\n        parse: function(b) {\n            return i.parse(unescape(encodeURIComponent(b)))\n        }\n    }\n      , c = g.BufferedBlockAlgorithm = y.extend({\n        reset: function() {\n            this._data = new a.init;\n            this._nDataBytes = 0\n        },\n        _append: function(b) {\n            \"string\" == typeof b && (b = j.parse(b));\n            this._data.concat(b);\n            this._nDataBytes += b.sigBytes\n        },\n        _process: function(l) {\n            var t = this._data\n              , s = t.words\n              , p = t.sigBytes\n              , n = this.blockSize\n              , d = p / (4 * n)\n              , d = l ? o.ceil(d) : o.max((d | 0) - this._minBufferSize, 0);\n            l = d * n;\n            p = o.min(4 * l, p);\n            if (l) {\n                for (var r = 0; r < l; r += n) {\n                    this._doProcessBlock(s, r)\n                }\n                r = s.splice(0, l);\n                t.sigBytes -= p\n            }\n            return new a.init(r,p)\n        },\n        clone: function() {\n            var b = y.clone.call(this);\n            b._data = this._data.clone();\n            return b\n        },\n        _minBufferSize: 0\n    });\n    g.Hasher = c.extend({\n        cfg: y.extend(),\n        init: function(b) {\n            this.cfg = this.cfg.extend(b);\n            this.reset()\n        },\n        reset: function() {\n            c.reset.call(this);\n            this._doReset()\n        },\n        update: function(b) {\n            this._append(b);\n            this._process();\n            return this\n        },\n        finalize: function(b) {\n            b && this._append(b);\n            return this._doFinalize()\n        },\n        blockSize: 16,\n        _createHelper: function(b) {\n            return function(d, l) {\n                return (new b.init(l)).finalize(d)\n            }\n        },\n        _createHmacHelper: function(b) {\n            return function(d, l) {\n                return (new f.HMAC.init(b,l)).finalize(d)\n            }\n        }\n    });\n    var f = h.algo = {};\n    return h\n}(Math);\n(function() {\n    var a = CryptoJS\n      , b = a.lib.WordArray;\n    a.enc.Base64 = {\n        stringify: function(j) {\n            var e = j.words\n              , i = j.sigBytes\n              , g = this._map;\n            j.clamp();\n            j = [];\n            for (var h = 0; h < i; h += 3) {\n                for (var c = (e[h >>> 2] >>> 24 - 8 * (h % 4) & 255) << 16 | (e[h + 1 >>> 2] >>> 24 - 8 * ((h + 1) % 4) & 255) << 8 | e[h + 2 >>> 2] >>> 24 - 8 * ((h + 2) % 4) & 255, f = 0; 4 > f && h + 0.75 * f < i; f++) {\n                    j.push(g.charAt(c >>> 6 * (3 - f) & 63))\n                }\n            }\n            if (e = g.charAt(64)) {\n                for (; j.length % 4; ) {\n                    j.push(e)\n                }\n            }\n            return j.join(\"\")\n        },\n        parse: function(k) {\n            var f = k.length\n              , i = this._map\n              , h = i.charAt(64);\n            h && (h = k.indexOf(h),\n            -1 != h && (f = h));\n            for (var h = [], j = 0, e = 0; e < f; e++) {\n                if (e % 4) {\n                    var g = i.indexOf(k.charAt(e - 1)) << 2 * (e % 4)\n                      , c = i.indexOf(k.charAt(e)) >>> 6 - 2 * (e % 4);\n                    h[j >>> 2] |= (g | c) << 24 - 8 * (j % 4);\n                    j++\n                }\n            }\n            return b.create(h, j)\n        },\n        _map: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n    }\n}\n)();\n(function(k) {\n    function c(d, s, l, r, q, p, o) {\n        d = d + (s & l | ~s & r) + q + o;\n        return (d << p | d >>> 32 - p) + s\n    }\n    function f(d, s, l, r, q, p, o) {\n        d = d + (s & r | l & ~r) + q + o;\n        return (d << p | d >>> 32 - p) + s\n    }\n    function e(d, s, l, r, q, p, o) {\n        d = d + (s ^ l ^ r) + q + o;\n        return (d << p | d >>> 32 - p) + s\n    }\n    function n(d, s, l, r, q, p, o) {\n        d = d + (l ^ (s | ~r)) + q + o;\n        return (d << p | d >>> 32 - p) + s\n    }\n    for (var m = CryptoJS, a = m.lib, i = a.WordArray, j = a.Hasher, a = m.algo, g = [], h = 0; 64 > h; h++) {\n        g[h] = 4294967296 * k.abs(k.sin(h + 1)) | 0\n    }\n    a = a.MD5 = j.extend({\n        _doReset: function() {\n            this._hash = new i.init([1732584193, 4023233417, 2562383102, 271733878])\n        },\n        _doProcessBlock: function(J, L) {\n            for (var U = 0; 16 > U; U++) {\n                var T = L + U\n                  , S = J[T];\n                J[T] = (S << 8 | S >>> 24) & 16711935 | (S << 24 | S >>> 8) & 4278255360\n            }\n            var U = this._hash.words\n              , T = J[L + 0]\n              , S = J[L + 1]\n              , O = J[L + 2]\n              , N = J[L + 3]\n              , b = J[L + 4]\n              , H = J[L + 5]\n              , y = J[L + 6]\n              , l = J[L + 7]\n              , o = J[L + 8]\n              , K = J[L + 9]\n              , I = J[L + 10]\n              , G = J[L + 11]\n              , p = J[L + 12]\n              , F = J[L + 13]\n              , s = J[L + 14]\n              , d = J[L + 15]\n              , R = U[0]\n              , M = U[1]\n              , Q = U[2]\n              , P = U[3]\n              , R = c(R, M, Q, P, T, 7, g[0])\n              , P = c(P, R, M, Q, S, 12, g[1])\n              , Q = c(Q, P, R, M, O, 17, g[2])\n              , M = c(M, Q, P, R, N, 22, g[3])\n              , R = c(R, M, Q, P, b, 7, g[4])\n              , P = c(P, R, M, Q, H, 12, g[5])\n              , Q = c(Q, P, R, M, y, 17, g[6])\n              , M = c(M, Q, P, R, l, 22, g[7])\n              , R = c(R, M, Q, P, o, 7, g[8])\n              , P = c(P, R, M, Q, K, 12, g[9])\n              , Q = c(Q, P, R, M, I, 17, g[10])\n              , M = c(M, Q, P, R, G, 22, g[11])\n              , R = c(R, M, Q, P, p, 7, g[12])\n              , P = c(P, R, M, Q, F, 12, g[13])\n              , Q = c(Q, P, R, M, s, 17, g[14])\n              , M = c(M, Q, P, R, d, 22, g[15])\n              , R = f(R, M, Q, P, S, 5, g[16])\n              , P = f(P, R, M, Q, y, 9, g[17])\n              , Q = f(Q, P, R, M, G, 14, g[18])\n              , M = f(M, Q, P, R, T, 20, g[19])\n              , R = f(R, M, Q, P, H, 5, g[20])\n              , P = f(P, R, M, Q, I, 9, g[21])\n              , Q = f(Q, P, R, M, d, 14, g[22])\n              , M = f(M, Q, P, R, b, 20, g[23])\n              , R = f(R, M, Q, P, K, 5, g[24])\n              , P = f(P, R, M, Q, s, 9, g[25])\n              , Q = f(Q, P, R, M, N, 14, g[26])\n              , M = f(M, Q, P, R, o, 20, g[27])\n              , R = f(R, M, Q, P, F, 5, g[28])\n              , P = f(P, R, M, Q, O, 9, g[29])\n              , Q = f(Q, P, R, M, l, 14, g[30])\n              , M = f(M, Q, P, R, p, 20, g[31])\n              , R = e(R, M, Q, P, H, 4, g[32])\n              , P = e(P, R, M, Q, o, 11, g[33])\n              , Q = e(Q, P, R, M, G, 16, g[34])\n              , M = e(M, Q, P, R, s, 23, g[35])\n              , R = e(R, M, Q, P, S, 4, g[36])\n              , P = e(P, R, M, Q, b, 11, g[37])\n              , Q = e(Q, P, R, M, l, 16, g[38])\n              , M = e(M, Q, P, R, I, 23, g[39])\n              , R = e(R, M, Q, P, F, 4, g[40])\n              , P = e(P, R, M, Q, T, 11, g[41])\n              , Q = e(Q, P, R, M, N, 16, g[42])\n              , M = e(M, Q, P, R, y, 23, g[43])\n              , R = e(R, M, Q, P, K, 4, g[44])\n              , P = e(P, R, M, Q, p, 11, g[45])\n              , Q = e(Q, P, R, M, d, 16, g[46])\n              , M = e(M, Q, P, R, O, 23, g[47])\n              , R = n(R, M, Q, P, T, 6, g[48])\n              , P = n(P, R, M, Q, l, 10, g[49])\n              , Q = n(Q, P, R, M, s, 15, g[50])\n              , M = n(M, Q, P, R, H, 21, g[51])\n              , R = n(R, M, Q, P, p, 6, g[52])\n              , P = n(P, R, M, Q, N, 10, g[53])\n              , Q = n(Q, P, R, M, I, 15, g[54])\n              , M = n(M, Q, P, R, S, 21, g[55])\n              , R = n(R, M, Q, P, o, 6, g[56])\n              , P = n(P, R, M, Q, d, 10, g[57])\n              , Q = n(Q, P, R, M, y, 15, g[58])\n              , M = n(M, Q, P, R, F, 21, g[59])\n              , R = n(R, M, Q, P, b, 6, g[60])\n              , P = n(P, R, M, Q, G, 10, g[61])\n              , Q = n(Q, P, R, M, O, 15, g[62])\n              , M = n(M, Q, P, R, K, 21, g[63]);\n            U[0] = U[0] + R | 0;\n            U[1] = U[1] + M | 0;\n            U[2] = U[2] + Q | 0;\n            U[3] = U[3] + P | 0\n        },\n        _doFinalize: function() {\n            var d = this._data\n              , q = d.words\n              , l = 8 * this._nDataBytes\n              , p = 8 * d.sigBytes;\n            q[p >>> 5] |= 128 << 24 - p % 32;\n            var o = k.floor(l / 4294967296);\n            q[(p + 64 >>> 9 << 4) + 15] = (o << 8 | o >>> 24) & 16711935 | (o << 24 | o >>> 8) & 4278255360;\n            q[(p + 64 >>> 9 << 4) + 14] = (l << 8 | l >>> 24) & 16711935 | (l << 24 | l >>> 8) & 4278255360;\n            d.sigBytes = 4 * (q.length + 1);\n            this._process();\n            d = this._hash;\n            q = d.words;\n            for (l = 0; 4 > l; l++) {\n                p = q[l],\n                q[l] = (p << 8 | p >>> 24) & 16711935 | (p << 24 | p >>> 8) & 4278255360\n            }\n            return d\n        },\n        clone: function() {\n            var d = j.clone.call(this);\n            d._hash = this._hash.clone();\n            return d\n        }\n    });\n    m.MD5 = j._createHelper(a);\n    m.HmacMD5 = j._createHmacHelper(a)\n}\n)(Math);\n(function() {\n    var b = CryptoJS\n      , e = b.lib\n      , f = e.Base\n      , a = e.WordArray\n      , e = b.algo\n      , c = e.EvpKDF = f.extend({\n        cfg: f.extend({\n            keySize: 4,\n            hasher: e.MD5,\n            iterations: 1\n        }),\n        init: function(g) {\n            this.cfg = this.cfg.extend(g)\n        },\n        compute: function(k, g) {\n            for (var i = this.cfg, t = i.hasher.create(), l = a.create(), o = l.words, h = i.keySize, i = i.iterations; o.length < h; ) {\n                j && t.update(j);\n                var j = t.update(k).finalize(g);\n                t.reset();\n                for (var m = 1; m < i; m++) {\n                    j = t.finalize(j),\n                    t.reset()\n                }\n                l.concat(j)\n            }\n            l.sigBytes = 4 * h;\n            return l\n        }\n    });\n    b.EvpKDF = function(i, g, h) {\n        return c.create(h).compute(i, g)\n    }\n}\n)();\nCryptoJS.lib.Cipher || function(B) {\n    var g = CryptoJS\n      , j = g.lib\n      , i = j.Base\n      , D = j.WordArray\n      , C = j.BufferedBlockAlgorithm\n      , e = g.enc.Base64\n      , z = g.algo.EvpKDF\n      , A = j.Cipher = C.extend({\n        cfg: i.extend(),\n        createEncryptor: function(c, b) {\n            return this.create(this._ENC_XFORM_MODE, c, b)\n        },\n        createDecryptor: function(c, b) {\n            return this.create(this._DEC_XFORM_MODE, c, b)\n        },\n        init: function(l, d, c) {\n            this.cfg = this.cfg.extend(c);\n            this._xformMode = l;\n            this._key = d;\n            this.reset()\n        },\n        reset: function() {\n            C.reset.call(this);\n            this._doReset()\n        },\n        process: function(a) {\n            this._append(a);\n            return this._process()\n        },\n        finalize: function(a) {\n            a && this._append(a);\n            return this._doFinalize()\n        },\n        keySize: 4,\n        ivSize: 4,\n        _ENC_XFORM_MODE: 1,\n        _DEC_XFORM_MODE: 2,\n        _createHelper: function(a) {\n            return {\n                encrypt: function(c, l, n) {\n                    return (\"string\" == typeof l ? k : o).encrypt(a, c, l, n)\n                },\n                decrypt: function(c, l, n) {\n                    return (\"string\" == typeof l ? k : o).decrypt(a, c, l, n)\n                }\n            }\n        }\n    });\n    j.StreamCipher = A.extend({\n        _doFinalize: function() {\n            return this._process(!0)\n        },\n        blockSize: 1\n    });\n    var m = g.mode = {}\n      , y = function(p, n, l) {\n        var r = this._iv;\n        r ? this._iv = B : r = this._prevBlock;\n        for (var q = 0; q < l; q++) {\n            p[n + q] ^= r[q]\n        }\n    }\n      , f = (j.BlockCipherMode = i.extend({\n        createEncryptor: function(c, b) {\n            return this.Encryptor.create(c, b)\n        },\n        createDecryptor: function(c, b) {\n            return this.Decryptor.create(c, b)\n        },\n        init: function(c, b) {\n            this._cipher = c;\n            this._iv = b\n        }\n    })).extend();\n    f.Encryptor = f.extend({\n        processBlock: function(n, l) {\n            var d = this._cipher\n              , p = d.blockSize;\n            y.call(this, n, l, p);\n            d.encryptBlock(n, l);\n            this._prevBlock = n.slice(l, l + p)\n        }\n    });\n    f.Decryptor = f.extend({\n        processBlock: function(p, n) {\n            var l = this._cipher\n              , r = l.blockSize\n              , q = p.slice(n, n + r);\n            l.decryptBlock(p, n);\n            y.call(this, p, n, r);\n            this._prevBlock = q\n        }\n    });\n    m = m.CBC = f;\n    f = (g.pad = {}).Pkcs7 = {\n        pad: function(r, p) {\n            for (var u = 4 * p, u = u - r.sigBytes % u, s = u << 24 | u << 16 | u << 8 | u, q = [], t = 0; t < u; t += 4) {\n                q.push(s)\n            }\n            u = D.create(q, u);\n            r.concat(u)\n        },\n        unpad: function(b) {\n            b.sigBytes -= b.words[b.sigBytes - 1 >>> 2] & 255\n        }\n    };\n    j.BlockCipher = A.extend({\n        cfg: A.cfg.extend({\n            mode: m,\n            padding: f\n        }),\n        reset: function() {\n            A.reset.call(this);\n            var l = this.cfg\n              , d = l.iv\n              , l = l.mode;\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                var n = l.createEncryptor\n            } else {\n                n = l.createDecryptor,\n                this._minBufferSize = 1\n            }\n            this._mode = n.call(l, this, d && d.words)\n        },\n        _doProcessBlock: function(d, c) {\n            this._mode.processBlock(d, c)\n        },\n        _doFinalize: function() {\n            var d = this.cfg.padding;\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                d.pad(this._data, this.blockSize);\n                var c = this._process(!0)\n            } else {\n                c = this._process(!0),\n                d.unpad(c)\n            }\n            return c\n        },\n        blockSize: 4\n    });\n    var h = j.CipherParams = i.extend({\n        init: function(b) {\n            this.mixIn(b)\n        },\n        toString: function(b) {\n            return (b || this.formatter).stringify(this)\n        }\n    })\n      , m = (g.format = {}).OpenSSL = {\n        stringify: function(d) {\n            var c = d.ciphertext;\n            d = d.salt;\n            return (d ? D.create([1398893684, 1701076831]).concat(d).concat(c) : c).toString(e)\n        },\n        parse: function(l) {\n            l = e.parse(l);\n            var d = l.words;\n            if (1398893684 == d[0] && 1701076831 == d[1]) {\n                var n = D.create(d.slice(2, 4));\n                d.splice(0, 4);\n                l.sigBytes -= 16\n            }\n            return h.create({\n                ciphertext: l,\n                salt: n\n            })\n        }\n    }\n      , o = j.SerializableCipher = i.extend({\n        cfg: i.extend({\n            format: m\n        }),\n        encrypt: function(q, n, s, r) {\n            r = this.cfg.extend(r);\n            var p = q.createEncryptor(s, r);\n            n = p.finalize(n);\n            p = p.cfg;\n            return h.create({\n                ciphertext: n,\n                key: s,\n                iv: p.iv,\n                algorithm: q,\n                mode: p.mode,\n                padding: p.padding,\n                blockSize: q.blockSize,\n                formatter: r.format\n            })\n        },\n        decrypt: function(n, l, q, p) {\n            p = this.cfg.extend(p);\n            l = this._parse(l, p.format);\n            return n.createDecryptor(q, p).finalize(l.ciphertext)\n        },\n        _parse: function(d, c) {\n            return \"string\" == typeof d ? c.parse(d, this) : d\n        }\n    })\n      , g = (g.kdf = {}).OpenSSL = {\n        execute: function(n, l, q, p) {\n            p || (p = D.random(8));\n            n = z.create({\n                keySize: l + q\n            }).compute(n, p);\n            q = D.create(n.words.slice(l), 4 * q);\n            n.sigBytes = 4 * l;\n            return h.create({\n                key: n,\n                iv: q,\n                salt: p\n            })\n        }\n    }\n      , k = j.PasswordBasedCipher = o.extend({\n        cfg: o.cfg.extend({\n            kdf: g\n        }),\n        encrypt: function(a, q, p, n) {\n            n = this.cfg.extend(n);\n            p = n.kdf.execute(p, a.keySize, a.ivSize);\n            n.iv = p.iv;\n            a = o.encrypt.call(this, a, q, p.key, n);\n            a.mixIn(p);\n            return a\n        },\n        decrypt: function(a, q, p, n) {\n            n = this.cfg.extend(n);\n            q = this._parse(q, n.format);\n            p = n.kdf.execute(p, a.keySize, a.ivSize, q.salt);\n            n.iv = p.iv;\n            return o.decrypt.call(this, a, q, p.key, n)\n        }\n    })\n}();\n(function() {\n    for (var C = CryptoJS, K = C.lib.BlockCipher, Q = C.algo, M = [], E = [], D = [], I = [], m = [], A = [], S = [], h = [], J = [], L = [], T = [], R = 0; 256 > R; R++) {\n        T[R] = 128 > R ? R << 1 : R << 1 ^ 283\n    }\n    for (var P = 0, O = 0, R = 0; 256 > R; R++) {\n        var N = O ^ O << 1 ^ O << 2 ^ O << 3 ^ O << 4\n          , N = N >>> 8 ^ N & 255 ^ 99;\n        M[P] = N;\n        E[N] = P;\n        var f = T[P]\n          , B = T[f]\n          , o = T[B]\n          , g = 257 * T[N] ^ 16843008 * N;\n        D[P] = g << 24 | g >>> 8;\n        I[P] = g << 16 | g >>> 16;\n        m[P] = g << 8 | g >>> 24;\n        A[P] = g;\n        g = 16843009 * o ^ 65537 * B ^ 257 * f ^ 16843008 * P;\n        S[N] = g << 24 | g >>> 8;\n        h[N] = g << 16 | g >>> 16;\n        J[N] = g << 8 | g >>> 24;\n        L[N] = g;\n        P ? (P = f ^ T[T[T[o ^ f]]],\n        O ^= T[T[O]]) : P = O = 1\n    }\n    var i = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]\n      , Q = Q.AES = K.extend({\n        _doReset: function() {\n            for (var b = this._key, r = b.words, q = b.sigBytes / 4, b = 4 * ((this._nRounds = q + 6) + 1), p = this._keySchedule = [], n = 0; n < b; n++) {\n                if (n < q) {\n                    p[n] = r[n]\n                } else {\n                    var l = p[n - 1];\n                    n % q ? 6 < q && 4 == n % q && (l = M[l >>> 24] << 24 | M[l >>> 16 & 255] << 16 | M[l >>> 8 & 255] << 8 | M[l & 255]) : (l = l << 8 | l >>> 24,\n                    l = M[l >>> 24] << 24 | M[l >>> 16 & 255] << 16 | M[l >>> 8 & 255] << 8 | M[l & 255],\n                    l ^= i[n / q | 0] << 24);\n                    p[n] = p[n - q] ^ l\n                }\n            }\n            r = this._invKeySchedule = [];\n            for (q = 0; q < b; q++) {\n                n = b - q,\n                l = q % 4 ? p[n] : p[n - 4],\n                r[q] = 4 > q || 4 >= n ? l : S[M[l >>> 24]] ^ h[M[l >>> 16 & 255]] ^ J[M[l >>> 8 & 255]] ^ L[M[l & 255]]\n            }\n        },\n        encryptBlock: function(d, c) {\n            this._doCryptBlock(d, c, this._keySchedule, D, I, m, A, M)\n        },\n        decryptBlock: function(b, j) {\n            var e = b[j + 1];\n            b[j + 1] = b[j + 3];\n            b[j + 3] = e;\n            this._doCryptBlock(b, j, this._invKeySchedule, S, h, J, L, E);\n            e = b[j + 1];\n            b[j + 1] = b[j + 3];\n            b[j + 3] = e\n        },\n        _doCryptBlock: function(ac, ab, aa, Z, Y, U, G, X) {\n            for (var F = this._nRounds, W = ac[ab] ^ aa[0], V = ac[ab + 1] ^ aa[1], H = ac[ab + 2] ^ aa[2], z = ac[ab + 3] ^ aa[3], y = 4, w = 1; w < F; w++) {\n                var x = Z[W >>> 24] ^ Y[V >>> 16 & 255] ^ U[H >>> 8 & 255] ^ G[z & 255] ^ aa[y++]\n                  , v = Z[V >>> 24] ^ Y[H >>> 16 & 255] ^ U[z >>> 8 & 255] ^ G[W & 255] ^ aa[y++]\n                  , u = Z[H >>> 24] ^ Y[z >>> 16 & 255] ^ U[W >>> 8 & 255] ^ G[V & 255] ^ aa[y++]\n                  , z = Z[z >>> 24] ^ Y[W >>> 16 & 255] ^ U[V >>> 8 & 255] ^ G[H & 255] ^ aa[y++]\n                  , W = x\n                  , V = v\n                  , H = u\n            }\n            x = (X[W >>> 24] << 24 | X[V >>> 16 & 255] << 16 | X[H >>> 8 & 255] << 8 | X[z & 255]) ^ aa[y++];\n            v = (X[V >>> 24] << 24 | X[H >>> 16 & 255] << 16 | X[z >>> 8 & 255] << 8 | X[W & 255]) ^ aa[y++];\n            u = (X[H >>> 24] << 24 | X[z >>> 16 & 255] << 16 | X[W >>> 8 & 255] << 8 | X[V & 255]) ^ aa[y++];\n            z = (X[z >>> 24] << 24 | X[W >>> 16 & 255] << 16 | X[V >>> 8 & 255] << 8 | X[H & 255]) ^ aa[y++];\n            ac[ab] = x;\n            ac[ab + 1] = v;\n            ac[ab + 2] = u;\n            ac[ab + 3] = z\n        },\n        keySize: 8\n    });\n    C.AES = K._createHelper(Q)\n}\n)();\nCryptoJS.pad.NoPadding = {\n    pad: function() {},\n    unpad: function() {}\n};\nfunction encrypt_md5_aes(c, f) {\n    var g = hex_md5(f);\n    var d = CryptoJS.enc.Utf8.parse(c);\n    var b = CryptoJS.enc.Utf8.parse(c);\n    var e = CryptoJS.enc.Utf8.parse(g);\n    var a = CryptoJS.AES.encrypt(e, d, {\n        iv: b,\n        mode: CryptoJS.mode.CBC,\n        padding: CryptoJS.pad.NoPadding\n    });\n    return a.toString()\n}\nfunction encrypt_aes(c, f) {\n    var d = CryptoJS.enc.Utf8.parse(c);\n    var b = CryptoJS.enc.Utf8.parse(c);\n    var e = CryptoJS.enc.Utf8.parse(f);\n    var a = CryptoJS.AES.encrypt(e, d, {\n        iv: b,\n        mode: CryptoJS.mode.CBC,\n        padding: CryptoJS.pad.NoPadding\n    });\n    return a.toString()\n}\n\n\n\n\nfunction test(dlmy, pwd){\n\treturn pwd_encrypt(dlmy, pwd);\n}"
  },
  {
    "path": "其他实战/【微信】登录参数生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-10  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【微信】登录参数生成/encryp.js",
    "content": "function e(n, r) {\n    var t = (65535 & n) + (65535 & r)\n    return (n >> 16) + (r >> 16) + (t >> 16) << 16 | 65535 & t\n}\nfunction u(n, r, t, u, o, c) {\n    return e(function(n, r) {\n        return n << r | n >>> 32 - r\n    }(e(e(r, n), e(u, c)), o), t)\n}\nfunction o(n, r, t, e, o, c, f) {\n    return u(r & t | ~r & e, n, r, o, c, f)\n}\nfunction c(n, r, t, e, o, c, f) {\n    return u(r & e | t & ~e, n, r, o, c, f)\n}\nfunction f(n, r, t, e, o, c, f) {\n    return u(r ^ t ^ e, n, r, o, c, f)\n}\nfunction i(n, r, t, e, o, c, f) {\n    return u(t ^ (r | ~e), n, r, o, c, f)\n}\nfunction a(n, r) {\n    n[r >> 5] |= 128 << r % 32,\n    n[14 + (r + 64 >>> 9 << 4)] = r\n    var t, u, a, h, d, g = 1732584193, l = -271733879, v = -1732584194, s = 271733878\n    for (t = 0; t < n.length; t += 16)\n        u = g,\n        a = l,\n        h = v,\n        d = s,\n        l = i(l = i(l = i(l = i(l = f(l = f(l = f(l = f(l = c(l = c(l = c(l = c(l = o(l = o(l = o(l = o(l, v = o(v, s = o(s, g = o(g, l, v, s, n[t], 7, -680876936), l, v, n[t + 1], 12, -389564586), g, l, n[t + 2], 17, 606105819), s, g, n[t + 3], 22, -1044525330), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 4], 7, -176418897), l, v, n[t + 5], 12, 1200080426), g, l, n[t + 6], 17, -1473231341), s, g, n[t + 7], 22, -45705983), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 8], 7, 1770035416), l, v, n[t + 9], 12, -1958414417), g, l, n[t + 10], 17, -42063), s, g, n[t + 11], 22, -1990404162), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 12], 7, 1804603682), l, v, n[t + 13], 12, -40341101), g, l, n[t + 14], 17, -1502002290), s, g, n[t + 15], 22, 1236535329), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 1], 5, -165796510), l, v, n[t + 6], 9, -1069501632), g, l, n[t + 11], 14, 643717713), s, g, n[t], 20, -373897302), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 5], 5, -701558691), l, v, n[t + 10], 9, 38016083), g, l, n[t + 15], 14, -660478335), s, g, n[t + 4], 20, -405537848), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 9], 5, 568446438), l, v, n[t + 14], 9, -1019803690), g, l, n[t + 3], 14, -187363961), s, g, n[t + 8], 20, 1163531501), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 13], 5, -1444681467), l, v, n[t + 2], 9, -51403784), g, l, n[t + 7], 14, 1735328473), s, g, n[t + 12], 20, -1926607734), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 5], 4, -378558), l, v, n[t + 8], 11, -2022574463), g, l, n[t + 11], 16, 1839030562), s, g, n[t + 14], 23, -35309556), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 1], 4, -1530992060), l, v, n[t + 4], 11, 1272893353), g, l, n[t + 7], 16, -155497632), s, g, n[t + 10], 23, -1094730640), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 13], 4, 681279174), l, v, n[t], 11, -358537222), g, l, n[t + 3], 16, -722521979), s, g, n[t + 6], 23, 76029189), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 9], 4, -640364487), l, v, n[t + 12], 11, -421815835), g, l, n[t + 15], 16, 530742520), s, g, n[t + 2], 23, -995338651), v = i(v, s = i(s, g = i(g, l, v, s, n[t], 6, -198630844), l, v, n[t + 7], 10, 1126891415), g, l, n[t + 14], 15, -1416354905), s, g, n[t + 5], 21, -57434055), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 12], 6, 1700485571), l, v, n[t + 3], 10, -1894986606), g, l, n[t + 10], 15, -1051523), s, g, n[t + 1], 21, -2054922799), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 8], 6, 1873313359), l, v, n[t + 15], 10, -30611744), g, l, n[t + 6], 15, -1560198380), s, g, n[t + 13], 21, 1309151649), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 4], 6, -145523070), l, v, n[t + 11], 10, -1120210379), g, l, n[t + 2], 15, 718787259), s, g, n[t + 9], 21, -343485551),\n        g = e(g, u),\n        l = e(l, a),\n        v = e(v, h),\n        s = e(s, d)\n    return [g, l, v, s]\n}\nfunction h(n) {\n    var r, t = \"\"\n    for (r = 0; r < 32 * n.length; r += 8)\n        t += String.fromCharCode(n[r >> 5] >>> r % 32 & 255)\n    return t\n}\nfunction d(n) {\n    var r, t = []\n    for (t[(n.length >> 2) - 1] = void 0,\n    r = 0; r < t.length; r += 1)\n        t[r] = 0\n    for (r = 0; r < 8 * n.length; r += 8)\n        t[r >> 5] |= (255 & n.charCodeAt(r / 8)) << r % 32\n    return t\n}\nfunction g(n) {\n    var r, t, e = \"\"\n    for (t = 0; t < n.length; t += 1)\n        r = n.charCodeAt(t),\n        e += \"0123456789abcdef\".charAt(r >>> 4 & 15) + \"0123456789abcdef\".charAt(15 & r)\n    return e\n}\nfunction l(n) {\n    return unescape(encodeURIComponent(n))\n}\nfunction v(n) {\n    return function(n) {\n        return h(a(d(n), 8 * n.length))\n    }(l(n))\n}\nfunction s(n, r) {\n    return function(n, r) {\n        var t, e, u = d(n), o = [], c = []\n        for (o[15] = c[15] = void 0,\n        u.length > 16 && (u = a(u, 8 * n.length)),\n        t = 0; t < 16; t += 1)\n            o[t] = 909522486 ^ u[t],\n            c[t] = 1549556828 ^ u[t]\n        return e = a(o.concat(d(r)), 512 + 8 * r.length),\n        h(a(c.concat(e), 640))\n    }(l(n), l(r))\n}\nfunction make_pwd(n, r, t) {\n    return r ? t ? s(r, n) : function(n, r) {\n        return g(s(n, r))\n    }(r, n) : t ? v(n) : function(n) {\n        return g(v(n))\n    }(n)\n}\n"
  },
  {
    "path": "其他实战/【微信】登录参数生成/make_pwd.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-22  Python: 3.7\nimport execjs.runtime_names\n\n\nclass WeXin(object):\n    \"\"\"\n    wx 登陆密码解析\n    \"\"\"\n\n    def __init__(self):\n        self.url = 'https://mp.weixin.qq.com/?token=&lang=zh_CN'\n        print('引擎', execjs.get().name)\n\n    @staticmethod\n    def make_pwd(pwd):\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            ctx = execjs.compile(f.read())\n\n        ret = ctx.call(\"make_pwd\", pwd)\n        print(ret)\n\n\nif __name__ == '__main__':\n    pdd = WeXin()\n    pdd.make_pwd('密码')\n\n"
  },
  {
    "path": "其他实战/【房价】房价获取/README.md",
    "content": "# 概述\n这不是一个完整的项目，是测试demo，可以获取区域内在售房产单套价格\n\n\n\n**代码只是测试了一个最新销售小区中的一栋楼的在售楼房价格**\n\n如果需要更完整的，就联系作者"
  },
  {
    "path": "其他实战/【房价】房价获取/main.py",
    "content": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/2/21\n\nimport requests\nimport json\nimport os\nimport sys\nfrom urllib import parse\n\nsys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))\n\nfrom util import *\n\n\nclass Fun:\n    \"\"\"\n    So 层\n    IV： jhf5632s\n    Key：hjkiuy6754edxc32890tfhjkw23xdea\n    \"\"\"\n\n    def __init__(self):\n        self.session = requests.session()\n\n    def get_list(self):\n        \"\"\"\n        获取楼盘列表\n        作为演示只获取第一页，中的第一个地产\n        \"\"\"\n        get_list_url = 'https://mobileapi.funi.com/m/community/search.json?page=1&pageSize=20&lng=106.593157&lat=29.541358&cityId=1'\n        response = self.session.get(get_list_url)\n        return json.loads(response.text)\n\n    def get_building(self, _id):\n        \"\"\"\n        获取楼栋表\n        \"\"\"\n        house_id = _id\n        key = '81$$@$$80$$@$$40$$@$$0$$@$$69$$@$$68$$@$$11$$@$$' + house_id + '$$@$$59$$@$$10$$@$$39$$@$$78$$@$$79$$@$$79$$@$$35$$@$$29$$@$$83$$@$$57$$@$$79$$@$$24$$@$$7$$@$$62$$@$$7$$@$$37$$@$$5$$@$$73$$@$$49$$@$$16$$@$$79$$@$$45$$@$$5'\n        key = des3_encrypt(key)\n        key = parse.quote(key)\n        url = 'https://mobileapi.funi.com/m/community/building211.json?key={key}'.format(key=key)\n        response = self.session.get(url)\n        print('楼栋数据', response.text)\n        return json.loads(response.text)\n\n    def one_fun(self, infos, _id):\n        \"\"\"\n        通过获取到的楼栋表，取每栋的可售房信息\n        测试，只取了前三个\n        :return:\n        \"\"\"\n        # 组合楼栋串    这里只取前三栋，作为测试\n        buildingIdArray = ','.join([item.get('id') for item in infos.get('data')][:3])\n        url = 'https://mobileapi.funi.com/m/community/buildingAmount.json'\n        data = {\n            'tal_id': '867686021859176',  # ? 固定\n            'cityId': '1',  # 成都，测试这里固定先\n            'communityId': _id,  # 14944 = 蓝光观岭国际社区9期\n            'buildingIdArray': buildingIdArray,\n            'tal': 'ANDROID',\n        }\n        response = self.session.post(url, data=data)\n        print('楼栋数据', response.text)\n        return json.loads(response.text)\n\n    def getHousePrice(self,  buildingId, _id):\n        \"\"\"\n        获取房价单间\n        这里测试，只取获取到得建筑得第一栋\n        :return:\n        \"\"\"\n\n        bId = buildingId\n        houseId = _id\n        unitId = '1'\n        key = '59$$@$$34$$@$$7$$@$$' + houseId + '$$@$$' + bId + '$$@$$87$$@$$30$$@$$18$$@$$8$$@$$' + unitId + '$$@$$82$$@$$14$$@$$53$$@$$51$$@$$51$$@$$70$$@$$50$$@$$3$$@$$57$$@$$72$$@$$39$$@$$95$$@$$4$$@$$43$$@$$37$$@$$94$$@$$35$$@$$38$$@$$79$$@$$96$$@$$'\n        key = make_str(key)  # 这里需要重新处理\n        key = des3_encrypt(key)\n        key = parse.quote(key)\n        url = 'https://mobileapi.funi.com/m/community/house211.json?key={key}'.format(key=key)\n        response = self.session.get(url)\n        print('房价返回数据', response.text)\n        return json.loads(response.text)\n\n    def parse_data(self, items):\n        \"\"\"\n        这里只解析，在售状态得！！\n        :param items:\n        :return:\n        \"\"\"\n        for item in items.get('data'):\n            house_list = item.get('houseList')\n            for house in house_list:\n                if decrypt_str(house.get('status')) == \"已售\": continue\n                print('****每户分割线****')\n                print('楼层：', decrypt_str(house.get('floor')))\n                print('套内：', decrypt_str(house.get('roomNo')))\n                print('建面：', decrypt_str(house.get('totalArea')))\n                print('区域：', decrypt_str(house.get('area')))\n                print('状态：', decrypt_str(house.get('status')))\n                if house.get('listWaterPrice'):\n                    print('【价格】：', decrypt_str(house.get('listWaterPrice')))\n                # 这里其实还有更多字段，后面有空再研究\n\n    def start(self):\n        infos = self.get_list()\n\n        # 只取一个小区测试\n        _id = infos.get('data')[0].get('id')\n        data = self.get_building(_id)\n        buildings = self.one_fun(data, _id)\n\n        # 只取一栋楼测试\n        buildingId = buildings.get('data')[0].get('buildingId')\n        datas = self.getHousePrice(buildingId, _id)\n        self.parse_data(datas)\n\n\nif __name__ == '__main__':\n    fun = Fun()\n    fun.start()\n"
  },
  {
    "path": "其他实战/【房价】房价获取/util.py",
    "content": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/2/21\n\n\nfrom pyDes import *\nimport base64\n\nKEY = b'hjkiuy6754edxc32890tfhjkw23xdea'[:24]  # 密钥只需要24位\nIV = b'jhf5632s'\n\n\ndef des3_encrypt(s):\n    \"\"\"\n    3DES 加密\n    :param s: 原始字符串\n    :return: 加密后字符串，16进制\n    \"\"\"\n    k = triple_des(KEY, CBC, IV, pad=None, padmode=PAD_PKCS5)\n    en = k.encrypt(s, padmode=PAD_PKCS5)\n    return base64.b64encode(en).decode('utf-8')\n\n\ndef des3_decrypt(s):\n    \"\"\"\n    3DES 解密\n    :param s: 加密字符串\n    :return: 明文\n    \"\"\"\n    _str = base64.b64decode(s)\n    k = triple_des(KEY, CBC, IV, pad=None, padmode=PAD_PKCS5)\n    en = k.decrypt(_str, padmode=PAD_PKCS5).decode('utf-8')\n    return en\n\n\ndef decrypt_str(s):\n    info = des3_decrypt(s)  # 获得 解密后得 base64\n    content = info[:-6]\n    hIndex = base64.b64decode(info[-6:].replace(\"==\", \"\")).decode().split(\"_\")\n    content2 = content[int(hIndex[0]):]\n    txt = base64.b64decode(\n        content2[: len(content2)-int(hIndex[1])][::-1]\n    ).decode('utf-8').replace(\"##\", \"\").replace(\"{@mk7}\", \"\")\n    return txt\n\n\ndef make_str(enB):\n    \"\"\"\n    复写字符串算法\n\n    根据传入文档，转换ascii并计算和\n    并复写算法\n    for (byte item : enB.getBytes(\"UTF-8\")) {\n        sumResult = Long.valueOf(sumResult.longValue() + ((long) item));\n    }\n    \"\"\"\n    count = 0\n    for i in enB:\n        count += ord(i)\n    # print('合', count)  # 每个字符的 Ascii 码的总和\n    p = count % len(enB)\n    n = 1\n    # print('position', p)\n    while p + n < len(enB) and p - n >= 0:\n        enB = rep(\n            rep(enB, p + n, enB[p - n]),\n            p - n,\n            enB[p + n]\n        )\n        n += 1\n    return enB\n\n\ndef rep(source, index, rep_str):\n    \"\"\"\n    复写的java层字符转换方法\n    :return:\n    \"\"\"\n    str1 = source[0: index]\n    return str1 + rep_str + source[index + 1:]\n\n\nif __name__ == '__main__':\n    decrypt_str(\"AaDaKV8GxE77rIScVyq7E0rebiFQjhrkq8PUcmR8A22NHhAW58pQkQ==\")\n"
  },
  {
    "path": "其他实战/【房天下】自动登录/encryp.js",
    "content": "function setMaxDigits(n) {\n    maxDigits = n;\n    ZERO_ARRAY = new Array(maxDigits);\n    for (var t = 0; t < ZERO_ARRAY.length; t++)\n        ZERO_ARRAY[t] = 0;\n    bigZero = new BigInt;\n    bigOne = new BigInt;\n    bigOne.digits[0] = 1\n}\n\nfunction BigInt(n) {\n    this.digits = typeof n == \"boolean\" && n == !0 ? null : ZERO_ARRAY.slice(0);\n    this.isNeg = !1\n}\n\nfunction biFromDecimal(n) {\n    for (var u = n.charAt(0) == \"-\", t = u ? 1 : 0, i, f, r; t < n.length && n.charAt(t) == \"0\";)\n        ++t;\n    if (t == n.length)\n        i = new BigInt;\n    else {\n        for (f = n.length - t,\n                 r = f % dpl10,\n             r == 0 && (r = dpl10),\n                 i = biFromNumber(Number(n.substr(t, r))),\n                 t += r; t < n.length;)\n            i = biAdd(biMultiply(i, lr10), biFromNumber(Number(n.substr(t, dpl10)))),\n                t += dpl10;\n        i.isNeg = u\n    }\n    return i\n}\n\nfunction biCopy(n) {\n    var t = new BigInt(!0);\n    return t.digits = n.digits.slice(0),\n        t.isNeg = n.isNeg,\n        t\n}\n\nfunction biFromNumber(n) {\n    var t = new BigInt, i;\n    for (t.isNeg = n < 0,\n             n = Math.abs(n),\n             i = 0; n > 0;)\n        t.digits[i++] = n & maxDigitVal,\n            n = Math.floor(n / biRadix);\n    return t\n}\n\nfunction reverseStr(n) {\n    for (var i = \"\", t = n.length - 1; t > -1; --t)\n        i += n.charAt(t);\n    return i\n}\n\nfunction biToString(n, t) {\n    var r = new BigInt, i, u;\n    for (r.digits[0] = t,\n             i = biDivideModulo(n, r),\n             u = hexatrigesimalToChar[i[1].digits[0]]; biCompare(i[0], bigZero) == 1;)\n        i = biDivideModulo(i[0], r),\n            digit = i[1].digits[0],\n            u += hexatrigesimalToChar[i[1].digits[0]];\n    return (n.isNeg ? \"-\" : \"\") + reverseStr(u)\n}\n\nfunction biToDecimal(n) {\n    var i = new BigInt, t, r;\n    for (i.digits[0] = 10,\n             t = biDivideModulo(n, i),\n             r = String(t[1].digits[0]); biCompare(t[0], bigZero) == 1;)\n        t = biDivideModulo(t[0], i),\n            r += String(t[1].digits[0]);\n    return (n.isNeg ? \"-\" : \"\") + reverseStr(r)\n}\n\nfunction digitToHex(n) {\n    var t = \"\";\n    for (i = 0; i < 4; ++i)\n        t += hexToChar[n & 15],\n            n >>>= 4;\n    return reverseStr(t)\n}\n\nfunction biToHex(n) {\n    for (var i = \"\", r = biHighIndex(n), t = biHighIndex(n); t > -1; --t)\n        i += digitToHex(n.digits[t]);\n    return i\n}\n\nfunction charToHex(n) {\n    var t = 48\n        , u = t + 9\n        , i = 97\n        , f = i + 25\n        , r = 65;\n    return n >= t && n <= u ? n - t : n >= r && n <= 90 ? 10 + n - r : n >= i && n <= f ? 10 + n - i : 0\n}\n\nfunction hexToDigit(n) {\n    for (var t = 0, r = Math.min(n.length, 4), i = 0; i < r; ++i)\n        t <<= 4,\n            t |= charToHex(n.charCodeAt(i));\n    return t\n}\n\nfunction biFromHex(n) {\n    for (var i = new BigInt, u = n.length, t = u, r = 0; t > 0; t -= 4,\n        ++r)\n        i.digits[r] = hexToDigit(n.substr(Math.max(t - 4, 0), Math.min(t, 4)));\n    return i\n}\n\nfunction biFromString(n, t) {\n    var f = n.charAt(0) == \"-\", e = f ? 1 : 0, i = new BigInt, r = new BigInt, u;\n    for (r.digits[0] = 1,\n             u = n.length - 1; u >= e; u--) {\n        var o = n.charCodeAt(u)\n            , s = charToHex(o)\n            , h = biMultiplyDigit(r, s);\n        i = biAdd(i, h);\n        r = biMultiplyDigit(r, t)\n    }\n    return i.isNeg = f,\n        i\n}\n\nfunction biDump(n) {\n    return (n.isNeg ? \"-\" : \"\") + n.digits.join(\" \")\n}\n\nfunction biAdd(n, t) {\n    var r, u, f, i;\n    if (n.isNeg != t.isNeg)\n        t.isNeg = !t.isNeg,\n            r = biSubtract(n, t),\n            t.isNeg = !t.isNeg;\n    else {\n        for (r = new BigInt,\n                 u = 0,\n                 i = 0; i < n.digits.length; ++i)\n            f = n.digits[i] + t.digits[i] + u,\n                r.digits[i] = f % biRadix,\n                u = Number(f >= biRadix);\n        r.isNeg = n.isNeg\n    }\n    return r\n}\n\nfunction biSubtract(n, t) {\n    var r, f, u, i;\n    if (n.isNeg != t.isNeg)\n        t.isNeg = !t.isNeg,\n            r = biAdd(n, t),\n            t.isNeg = !t.isNeg;\n    else {\n        for (r = new BigInt,\n                 u = 0,\n                 i = 0; i < n.digits.length; ++i)\n            f = n.digits[i] - t.digits[i] + u,\n                r.digits[i] = f % biRadix,\n            r.digits[i] < 0 && (r.digits[i] += biRadix),\n                u = 0 - Number(f < 0);\n        if (u == -1) {\n            for (u = 0,\n                     i = 0; i < n.digits.length; ++i)\n                f = 0 - r.digits[i] + u,\n                    r.digits[i] = f % biRadix,\n                r.digits[i] < 0 && (r.digits[i] += biRadix),\n                    u = 0 - Number(f < 0);\n            r.isNeg = !n.isNeg\n        } else\n            r.isNeg = n.isNeg\n    }\n    return r\n}\n\nfunction biHighIndex(n) {\n    for (var t = n.digits.length - 1; t > 0 && n.digits[t] == 0;)\n        --t;\n    return t\n}\n\nfunction biNumBits(n) {\n    for (var i = biHighIndex(n), r = n.digits[i], u = (i + 1) * bitsPerDigit, t = u; t > u - bitsPerDigit; --t) {\n        if ((r & 32768) != 0)\n            break;\n        r <<= 1\n    }\n    return t\n}\n\nfunction biMultiply(n, t) {\n    for (var i = new BigInt, u, o = biHighIndex(n), s = biHighIndex(t), e, f, r = 0; r <= s; ++r) {\n        for (u = 0,\n                 f = r,\n                 j = 0; j <= o; ++j,\n                 ++f)\n            e = i.digits[f] + n.digits[j] * t.digits[r] + u,\n                i.digits[f] = e & maxDigitVal,\n                u = e >>> biRadixBits;\n        i.digits[r + o + 1] = u\n    }\n    return i.isNeg = n.isNeg != t.isNeg,\n        i\n}\n\nfunction biMultiplyDigit(n, t) {\n    var u, r, f, i;\n    for (result = new BigInt,\n             u = biHighIndex(n),\n             r = 0,\n             i = 0; i <= u; ++i)\n        f = result.digits[i] + n.digits[i] * t + r,\n            result.digits[i] = f & maxDigitVal,\n            r = f >>> biRadixBits;\n    return result.digits[1 + u] = r,\n        result\n}\n\nfunction arrayCopy(n, t, i, r, u) {\n    for (var o = Math.min(t + u, n.length), f = t, e = r; f < o; ++f,\n        ++e)\n        i[e] = n[f]\n}\n\nfunction biShiftLeft(n, t) {\n    var e = Math.floor(t / bitsPerDigit), i = new BigInt, u, o, r, f;\n    for (arrayCopy(n.digits, 0, i.digits, e, i.digits.length - e),\n             u = t % bitsPerDigit,\n             o = bitsPerDigit - u,\n             r = i.digits.length - 1,\n             f = r - 1; r > 0; --r,\n             --f)\n        i.digits[r] = i.digits[r] << u & maxDigitVal | (i.digits[f] & highBitMasks[u]) >>> o;\n    return i.digits[0] = i.digits[r] << u & maxDigitVal,\n        i.isNeg = n.isNeg,\n        i\n}\n\nfunction biShiftRight(n, t) {\n    var e = Math.floor(t / bitsPerDigit), i = new BigInt, u, o, r, f;\n    for (arrayCopy(n.digits, e, i.digits, 0, n.digits.length - e),\n             u = t % bitsPerDigit,\n             o = bitsPerDigit - u,\n             r = 0,\n             f = r + 1; r < i.digits.length - 1; ++r,\n             ++f)\n        i.digits[r] = i.digits[r] >>> u | (i.digits[f] & lowBitMasks[u]) << o;\n    return i.digits[i.digits.length - 1] >>>= u,\n        i.isNeg = n.isNeg,\n        i\n}\n\nfunction biMultiplyByRadixPower(n, t) {\n    var i = new BigInt;\n    return arrayCopy(n.digits, 0, i.digits, t, i.digits.length - t),\n        i\n}\n\nfunction biDivideByRadixPower(n, t) {\n    var i = new BigInt;\n    return arrayCopy(n.digits, t, i.digits, 0, i.digits.length - t),\n        i\n}\n\nfunction biModuloByRadixPower(n, t) {\n    var i = new BigInt;\n    return arrayCopy(n.digits, 0, i.digits, 0, t),\n        i\n}\n\nfunction biCompare(n, t) {\n    if (n.isNeg != t.isNeg)\n        return 1 - 2 * Number(n.isNeg);\n    for (var i = n.digits.length - 1; i >= 0; --i)\n        if (n.digits[i] != t.digits[i])\n            return n.isNeg ? 1 - 2 * Number(n.digits[i] > t.digits[i]) : 1 - 2 * Number(n.digits[i] < t.digits[i]);\n    return 0\n}\n\nfunction biDivideModulo(n, t) {\n    var a = biNumBits(n), s = biNumBits(t), v = t.isNeg, r, i, u, e, h, o, f, y, p;\n    if (a < s)\n        return n.isNeg ? (r = biCopy(bigOne),\n            r.isNeg = !t.isNeg,\n            n.isNeg = !1,\n            t.isNeg = !1,\n            i = biSubtract(t, n),\n            n.isNeg = !0,\n            t.isNeg = v) : (r = new BigInt,\n            i = biCopy(n)),\n            [r, i];\n    for (r = new BigInt,\n             i = n,\n             u = Math.ceil(s / bitsPerDigit) - 1,\n             e = 0; t.digits[u] < biHalfRadix;)\n        t = biShiftLeft(t, 1),\n            ++e,\n            ++s,\n            u = Math.ceil(s / bitsPerDigit) - 1;\n    for (i = biShiftLeft(i, e),\n             a += e,\n             h = Math.ceil(a / bitsPerDigit) - 1,\n             o = biMultiplyByRadixPower(t, h - u); biCompare(i, o) != -1;)\n        ++r.digits[h - u],\n            i = biSubtract(i, o);\n    for (f = h; f > u; --f) {\n        var c = f >= i.digits.length ? 0 : i.digits[f]\n            , w = f - 1 >= i.digits.length ? 0 : i.digits[f - 1]\n            , b = f - 2 >= i.digits.length ? 0 : i.digits[f - 2]\n            , l = u >= t.digits.length ? 0 : t.digits[u]\n            , k = u - 1 >= t.digits.length ? 0 : t.digits[u - 1];\n        for (r.digits[f - u - 1] = c == l ? maxDigitVal : Math.floor((c * biRadix + w) / l),\n                 y = r.digits[f - u - 1] * (l * biRadix + k),\n                 p = c * biRadixSquared + (w * biRadix + b); y > p;)\n            --r.digits[f - u - 1],\n                y = r.digits[f - u - 1] * (l * biRadix | k),\n                p = c * biRadix * biRadix + (w * biRadix + b);\n        o = biMultiplyByRadixPower(t, f - u - 1);\n        i = biSubtract(i, biMultiplyDigit(o, r.digits[f - u - 1]));\n        i.isNeg && (i = biAdd(i, o),\n            --r.digits[f - u - 1])\n    }\n    return i = biShiftRight(i, e),\n        r.isNeg = n.isNeg != v,\n    n.isNeg && (r = v ? biAdd(r, bigOne) : biSubtract(r, bigOne),\n        t = biShiftRight(t, e),\n        i = biSubtract(t, i)),\n    i.digits[0] == 0 && biHighIndex(i) == 0 && (i.isNeg = !1),\n        [r, i]\n}\n\nfunction biDivide(n, t) {\n    return biDivideModulo(n, t)[0]\n}\n\nfunction biModulo(n, t) {\n    return biDivideModulo(n, t)[1]\n}\n\nfunction biMultiplyMod(n, t, i) {\n    return biModulo(biMultiply(n, t), i)\n}\n\nfunction biPow(n, t) {\n    for (var r = bigOne, i = n; ;) {\n        if ((t & 1) != 0 && (r = biMultiply(r, i)),\n            t >>= 1,\n        t == 0)\n            break;\n        i = biMultiply(i, i)\n    }\n    return r\n}\n\nfunction biPowMod(n, t, i) {\n    for (var f = bigOne, u = n, r = t; ;) {\n        if ((r.digits[0] & 1) != 0 && (f = biMultiplyMod(f, u, i)),\n            r = biShiftRight(r, 1),\n        r.digits[0] == 0 && biHighIndex(r) == 0)\n            break;\n        u = biMultiplyMod(u, u, i)\n    }\n    return f\n}\n\nfunction BarrettMu(n) {\n    this.modulus = biCopy(n);\n    this.k = biHighIndex(this.modulus) + 1;\n    var t = new BigInt;\n    t.digits[2 * this.k] = 1;\n    this.mu = biDivide(t, this.modulus);\n    this.bkplus1 = new BigInt;\n    this.bkplus1.digits[this.k + 1] = 1;\n    this.modulo = BarrettMu_modulo;\n    this.multiplyMod = BarrettMu_multiplyMod;\n    this.powMod = BarrettMu_powMod\n}\n\nfunction BarrettMu_modulo(n) {\n    var r = biDivideByRadixPower(n, this.k - 1), u = biMultiply(r, this.mu), f = biDivideByRadixPower(u, this.k + 1),\n        e = biModuloByRadixPower(n, this.k + 1), o = biMultiply(f, this.modulus),\n        s = biModuloByRadixPower(o, this.k + 1), t = biSubtract(e, s), i;\n    for (t.isNeg && (t = biAdd(t, this.bkplus1)),\n             i = biCompare(t, this.modulus) >= 0; i;)\n        t = biSubtract(t, this.modulus),\n            i = biCompare(t, this.modulus) >= 0;\n    return t\n}\n\nfunction BarrettMu_multiplyMod(n, t) {\n    var i = biMultiply(n, t);\n    return this.modulo(i)\n}\n\nfunction BarrettMu_powMod(n, t) {\n    var u = new BigInt, r, i;\n    for (u.digits[0] = 1,\n             r = n,\n             i = t; ;) {\n        if ((i.digits[0] & 1) != 0 && (u = this.multiplyMod(u, r)),\n            i = biShiftRight(i, 1),\n        i.digits[0] == 0 && biHighIndex(i) == 0)\n            break;\n        r = this.multiplyMod(r, r)\n    }\n    return u\n}\n\nfunction RSAKeyPair(n, t, i) {\n    this.e = biFromHex(n);\n    this.d = biFromHex(t);\n    this.m = biFromHex(i);\n    this.digitSize = 2 * biHighIndex(this.m) + 2;\n    this.chunkSize = this.digitSize - 11;\n    this.radix = 16;\n    this.barrett = new BarrettMu(this.m)\n}\n\nfunction twoDigit(n) {\n    return (n < 10 ? \"0\" : \"\") + String(n)\n}\n\nfunction encryptedString(n, t) {\n    var e, o, s, h, c, i, f, u, v, l, y;\n    if (n.chunkSize > n.digitSize - 11)\n        return \"Error\";\n    for (var a = [], p = t.length, r = 0; r < p;)\n        a[r] = t.charCodeAt(r),\n            r++;\n    for (e = a.length,\n             o = \"\",\n             r = 0; r < e; r += n.chunkSize) {\n        for (c = new BigInt,\n                 s = 0,\n                 f = r + n.chunkSize > e ? e % n.chunkSize : n.chunkSize,\n                 u = [],\n                 i = 0; i < f; i++)\n            u[i] = a[r + f - 1 - i];\n        for (u[f] = 0,\n                 v = Math.max(8, n.digitSize - 3 - f),\n                 i = 0; i < v; i++)\n            u[f + 1 + i] = Math.floor(Math.random() * 254) + 1;\n        for (u[n.digitSize - 2] = 2,\n                 u[n.digitSize - 1] = 0,\n                 h = 0; h < n.digitSize; ++s)\n            c.digits[s] = u[h++],\n                c.digits[s] += u[h++] << 8;\n        l = n.barrett.powMod(c, n.e);\n        y = n.radix == 16 ? biToHex(l) : biToString(l, n.radix);\n        o += y + \" \"\n    }\n    return o.substring(0, o.length - 1)\n}\n\nfunction decryptedString(n, t) {\n    for (var e = t.split(\" \"), i = \"\", r, u, o, f = 0; f < e.length; ++f)\n        for (o = n.radix == 16 ? biFromHex(e[f]) : biFromString(e[f], n.radix),\n                 u = n.barrett.powMod(o, n.d),\n                 r = 0; r <= biHighIndex(u); ++r)\n            i += String.fromCharCode(u.digits[r] & 255, u.digits[r] >> 8);\n    return i.charCodeAt(i.length - 1) == 0 && (i = i.substring(0, i.length - 1)),\n        i\n}\n\nvar biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1,\n    biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998, maxDigits, ZERO_ARRAY,\n    bigZero, bigOne, dpl10, lr10, hexatrigesimalToChar, hexToChar, highBitMasks, lowBitMasks;\nsetMaxDigits(20);\ndpl10 = 15;\nlr10 = biFromNumber(1e15);\nhexatrigesimalToChar = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\"];\nhexToChar = [\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\"];\nhighBitMasks = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535];\nlowBitMasks = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535];\nsetMaxDigits(129);\n\n\nfunction getPwd(pwd) {\n    setMaxDigits(129);\n    var key_to_encode = new RSAKeyPair(\"010001\", \"\", \"978C0A92D2173439707498F0944AA476B1B62595877DD6FA87F6E2AC6DCB3D0BF0B82857439C99B5091192BC134889DFF60C562EC54EFBA4FF2F9D55ADBCCEA4A2FBA80CB398ED501280A007C83AF30C3D1A142D6133C63012B90AB26AC60C898FB66EDC3192C3EC4FF66925A64003B72496099F4F09A9FB72A2CF9E4D770C41\");\n    return encryptedString(key_to_encode, pwd)\n}"
  },
  {
    "path": "其他实战/【房天下】自动登录/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-26  Python: 3.7\n\nimport execjs.runtime_names\nimport requests\n\n\nclass Fang:\n    \"\"\"\n    房天下自动登陆\n    https://passport.fang.com/\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.js = None\n        self.api = 'https://passport.fang.com/login.api'\n        self.js_init()\n\n    def js_init(self):\n        print('引擎', execjs.get().name)\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def login(self):\n        data = {\n            'uid': self.user,\n            'pwd': self.js.call('getPwd', self.pwd),\n            'Service': 'soufun-passport-web',\n            'AutoLogin': '1'\n        }\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',\n            'Origin': 'https://passport.fang.com',\n            'Referer': 'https://passport.fang.com/',\n        }\n        response = requests.post(self.api, data=data, headers=headers)\n        print(response.text)\n        print(response.cookies)\n\n\nif __name__ == '__main__':\n    username = input('输入房天下账号')\n    password = input('输入密码')\n    f = Fang(username, password)\n    f.login()\n"
  },
  {
    "path": "其他实战/【新浪微博】密码解密/execute.js",
    "content": "var navigator = {};\r\nvar sinaSSOEncoder = sinaSSOEncoder || {};\r\n\t\t\t(function() {\r\n\t\t\t\tvar a = 0,\r\n\t\t\t\t\tb = 8;\r\n\t\t\t\tthis.hex_sha1 = function(a) {\r\n\t\t\t\t\treturn i(c(h(a), a.length * b))\r\n\t\t\t\t};\r\n\t\t\t\tvar c = function(a, b) {\r\n\t\t\t\t\t\ta[b >> 5] |= 128 << 24 - b % 32;\r\n\t\t\t\t\t\ta[(b + 64 >> 9 << 4) + 15] = b;\r\n\t\t\t\t\t\tvar c = Array(80),\r\n\t\t\t\t\t\t\th = 1732584193,\r\n\t\t\t\t\t\t\ti = -271733879,\r\n\t\t\t\t\t\t\tj = -1732584194,\r\n\t\t\t\t\t\t\tk = 271733878,\r\n\t\t\t\t\t\t\tl = -1009589776;\r\n\t\t\t\t\t\tfor (var m = 0; m < a.length; m += 16) {\r\n\t\t\t\t\t\t\tvar n = h,\r\n\t\t\t\t\t\t\t\to = i,\r\n\t\t\t\t\t\t\t\tp = j,\r\n\t\t\t\t\t\t\t\tq = k,\r\n\t\t\t\t\t\t\t\tr = l;\r\n\t\t\t\t\t\t\tfor (var s = 0; s < 80; s++) {\r\n\t\t\t\t\t\t\t\ts < 16 ? c[s] = a[m + s] : c[s] = g(c[s - 3] ^ c[s - 8] ^ c[s - 14] ^ c[s - 16], 1);\r\n\t\t\t\t\t\t\t\tvar t = f(f(g(h, 5), d(s, i, j, k)), f(f(l, c[s]), e(s)));\r\n\t\t\t\t\t\t\t\tl = k;\r\n\t\t\t\t\t\t\t\tk = j;\r\n\t\t\t\t\t\t\t\tj = g(i, 30);\r\n\t\t\t\t\t\t\t\ti = h;\r\n\t\t\t\t\t\t\t\th = t\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\th = f(h, n);\r\n\t\t\t\t\t\t\ti = f(i, o);\r\n\t\t\t\t\t\t\tj = f(j, p);\r\n\t\t\t\t\t\t\tk = f(k, q);\r\n\t\t\t\t\t\t\tl = f(l, r)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn [h, i, j, k, l]\r\n\t\t\t\t\t},\r\n\t\t\t\t\td = function(a, b, c, d) {\r\n\t\t\t\t\t\treturn a < 20 ? b & c | ~b & d : a < 40 ? b ^ c ^ d : a < 60 ? b & c | b & d | c & d : b ^ c ^ d\r\n\t\t\t\t\t},\r\n\t\t\t\t\te = function(a) {\r\n\t\t\t\t\t\treturn a < 20 ? 1518500249 : a < 40 ? 1859775393 : a < 60 ? -1894007588 : -899497514\r\n\t\t\t\t\t},\r\n\t\t\t\t\tf = function(a, b) {\r\n\t\t\t\t\t\tvar c = (a & 65535) + (b & 65535),\r\n\t\t\t\t\t\t\td = (a >> 16) + (b >> 16) + (c >> 16);\r\n\t\t\t\t\t\treturn d << 16 | c & 65535\r\n\t\t\t\t\t},\r\n\t\t\t\t\tg = function(a, b) {\r\n\t\t\t\t\t\treturn a << b | a >>> 32 - b\r\n\t\t\t\t\t},\r\n\t\t\t\t\th = function(a) {\r\n\t\t\t\t\t\tvar c = [],\r\n\t\t\t\t\t\t\td = (1 << b) - 1;\r\n\t\t\t\t\t\tfor (var e = 0; e < a.length * b; e += b)\r\n\t\t\t\t\t\t\tc[e >> 5] |= (a.charCodeAt(e / b) & d) << 24 - e % 32;\r\n\t\t\t\t\t\treturn c\r\n\t\t\t\t\t},\r\n\t\t\t\t\ti = function(b) {\r\n\t\t\t\t\t\tvar c = a ? \"0123456789ABCDEF\" : \"0123456789abcdef\",\r\n\t\t\t\t\t\t\td = \"\";\r\n\t\t\t\t\t\tfor (var e = 0; e < b.length * 4; e++)\r\n\t\t\t\t\t\t\td += c.charAt(b[e >> 2] >> (3 - e % 4) * 8 + 4 & 15) + c.charAt(b[e >> 2] >> (3 - e % 4) * 8 & 15);\r\n\t\t\t\t\t\treturn d\r\n\t\t\t\t\t},\r\n\t\t\t\t\tj = function(a) {\r\n\t\t\t\t\t\tvar b = \"\",\r\n\t\t\t\t\t\t\tc = 0;\r\n\t\t\t\t\t\tfor (; c < a.length; c++)\r\n\t\t\t\t\t\t\tb += \"%\" + k(a[c]);\r\n\t\t\t\t\t\treturn decodeURIComponent(b)\r\n\t\t\t\t\t},\r\n\t\t\t\t\tk = function(a) {\r\n\t\t\t\t\t\tvar b = \"0\" + a.toString(16);\r\n\t\t\t\t\t\treturn b.length <= 2 ? b : b.substr(1)\r\n\t\t\t\t\t};\r\n\t\t\t\tthis.base64 = {\r\n\t\t\t\t\tencode: function(a) {\r\n\t\t\t\t\t\ta = \"\" + a;\r\n\t\t\t\t\t\tif (a == \"\")\r\n\t\t\t\t\t\t\treturn \"\";\r\n\t\t\t\t\t\tvar b = \"\",\r\n\t\t\t\t\t\t\tc, d, e = \"\",\r\n\t\t\t\t\t\t\tf, g, h, i = \"\",\r\n\t\t\t\t\t\t\tj = 0;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tc = a.charCodeAt(j++);\r\n\t\t\t\t\t\t\td = a.charCodeAt(j++);\r\n\t\t\t\t\t\t\te = a.charCodeAt(j++);\r\n\t\t\t\t\t\t\tf = c >> 2;\r\n\t\t\t\t\t\t\tg = (c & 3) << 4 | d >> 4;\r\n\t\t\t\t\t\t\th = (d & 15) << 2 | e >> 6;\r\n\t\t\t\t\t\t\ti = e & 63;\r\n\t\t\t\t\t\t\tisNaN(d) ? h = i = 64 : isNaN(e) && (i = 64);\r\n\t\t\t\t\t\t\tb = b + this._keys.charAt(f) + this._keys.charAt(g) + this._keys.charAt(h) + this._keys.charAt(i);\r\n\t\t\t\t\t\t\tc = d = e = \"\";\r\n\t\t\t\t\t\t\tf = g = h = i = \"\"\r\n\t\t\t\t\t\t} while (j < a.length);\r\n\t\t\t\t\t\treturn b\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdecode: function(a, b, c) {\r\n\t\t\t\t\t\tvar d = function(a, b) {\r\n\t\t\t\t\t\t\tfor (var c = 0; c < a.length; c++)\r\n\t\t\t\t\t\t\t\tif (a[c] === b)\r\n\t\t\t\t\t\t\t\t\treturn c;\r\n\t\t\t\t\t\t\treturn -1\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\ttypeof a == \"string\" && (a = a.split(\"\"));\r\n\t\t\t\t\t\tvar e = [],\r\n\t\t\t\t\t\t\tf, g, h = \"\",\r\n\t\t\t\t\t\t\ti, j, k, l = \"\";\r\n\t\t\t\t\t\ta.length % 4 == 0;\r\n\t\t\t\t\t\tvar m = /[^A-Za-z0-9+\\/=]/,\r\n\t\t\t\t\t\t\tn = this._keys.split(\"\");\r\n\t\t\t\t\t\tif (b == \"urlsafe\") {\r\n\t\t\t\t\t\t\tm = /[^A-Za-z0-9-_=]/;\r\n\t\t\t\t\t\t\tn = this._keys_urlsafe.split(\"\")\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (b == \"subp_v2\") {\r\n\t\t\t\t\t\t\tm = /[^A-Za-z0-9_=-]/;\r\n\t\t\t\t\t\t\tn = this._subp_v2_keys.split(\"\")\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (b == \"subp_v3_3\") {\r\n\t\t\t\t\t\t\tm = /[^A-Za-z0-9-_.-]/;\r\n\t\t\t\t\t\t\tn = this._subp_v3_keys_3.split(\"\")\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar o = 0;\r\n\t\t\t\t\t\tif (b == \"binnary\") {\r\n\t\t\t\t\t\t\tn = [];\r\n\t\t\t\t\t\t\tfor (o = 0; o <= 64; o++)\r\n\t\t\t\t\t\t\t\tn[o] = o + 128\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (b != \"binnary\" && m.test(a.join(\"\")))\r\n\t\t\t\t\t\t\treturn c == \"array\" ? [] : \"\";\r\n\t\t\t\t\t\to = 0;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\ti = d(n, a[o++]);\r\n\t\t\t\t\t\t\tj = d(n, a[o++]);\r\n\t\t\t\t\t\t\tk = d(n, a[o++]);\r\n\t\t\t\t\t\t\tl = d(n, a[o++]);\r\n\t\t\t\t\t\t\tf = i << 2 | j >> 4;\r\n\t\t\t\t\t\t\tg = (j & 15) << 4 | k >> 2;\r\n\t\t\t\t\t\t\th = (k & 3) << 6 | l;\r\n\t\t\t\t\t\t\te.push(f);\r\n\t\t\t\t\t\t\tk != 64 && k != -1 && e.push(g);\r\n\t\t\t\t\t\t\tl != 64 && l != -1 && e.push(h);\r\n\t\t\t\t\t\t\tf = g = h = \"\";\r\n\t\t\t\t\t\t\ti = j = k = l = \"\"\r\n\t\t\t\t\t\t} while (o < a.length);\r\n\t\t\t\t\t\tif (c == \"array\")\r\n\t\t\t\t\t\t\treturn e;\r\n\t\t\t\t\t\tvar p = \"\",\r\n\t\t\t\t\t\t\tq = 0;\r\n\t\t\t\t\t\tfor (; q < e.lenth; q++)\r\n\t\t\t\t\t\t\tp += String.fromCharCode(e[q]);\r\n\t\t\t\t\t\treturn p\r\n\t\t\t\t\t},\r\n\t\t\t\t\t_keys: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\r\n\t\t\t\t\t_keys_urlsafe: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=\",\r\n\t\t\t\t\t_subp_v2_keys: \"uAL715W8e3jJCcNU0lT_FSXVgxpbEDdQ4vKaIOH2GBPtfzqsmYZo-wRM9i6hynrk=\",\r\n\t\t\t\t\t_subp_v3_keys_3: \"5WFh28sGziZTeS1lBxCK-HgPq9IdMUwknybo.LJrQD3uj_Va7pE0XfcNR4AOYvm6t\"\r\n\t\t\t\t};\r\n\t\t\t\tthis.Cookie = {\r\n\t\t\t\t\tdecode: function(a) {\r\n\t\t\t\t\t\tvar b = [],\r\n\t\t\t\t\t\t\tc = a.substr(0, 3),\r\n\t\t\t\t\t\t\td = a.substr(3);\r\n\t\t\t\t\t\tswitch (c) {\r\n\t\t\t\t\t\t\tcase \"v01\":\r\n\t\t\t\t\t\t\t\tfor (var e = 0; e < d.length; e += 2)\r\n\t\t\t\t\t\t\t\t\tb.push(parseInt(d.substr(e, 2), 16));\r\n\t\t\t\t\t\t\t\treturn decodeURIComponent(j(sinaSSOEncoder.base64.decode(b, \"binnary\", \"array\")));\r\n\t\t\t\t\t\t\tcase \"v02\":\r\n\t\t\t\t\t\t\t\td = d.replace(/\\./g, \"=\");\r\n\t\t\t\t\t\t\t\tb = sinaSSOEncoder.base64.decode(d, \"urlsafe\", \"array\");\r\n\t\t\t\t\t\t\t\treturn j(sinaSSOEncoder.base64.decode(b, \"binnary\", \"array\"));\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\treturn decodeURIComponent(a)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\tthis.getSUBPCookie = {\r\n\t\t\t\t\t__parse: function(a) {\r\n\t\t\t\t\t\tvar b, c, d, e, f, g = 0,\r\n\t\t\t\t\t\t\th, i = {},\r\n\t\t\t\t\t\t\tk = \"\",\r\n\t\t\t\t\t\t\tl = \"\";\r\n\t\t\t\t\t\tif (!a)\r\n\t\t\t\t\t\t\treturn i;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tc = a[g];\r\n\t\t\t\t\t\t\tb = ++g;\r\n\t\t\t\t\t\t\tfor (h = g; h < c + b; h++,\r\n\t\t\t\t\t\t\t\tg++)\r\n\t\t\t\t\t\t\t\tk += String.fromCharCode(a[h]);\r\n\t\t\t\t\t\t\te = a[g];\r\n\t\t\t\t\t\t\tb = ++g;\r\n\t\t\t\t\t\t\tif (k == \"status\" || k == \"flag\")\r\n\t\t\t\t\t\t\t\tfor (h = g; h < e + b; h++,\r\n\t\t\t\t\t\t\t\t\tg++)\r\n\t\t\t\t\t\t\t\t\tl += a[h];\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tl = a.slice(b, e + b);\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tl = j(l)\r\n\t\t\t\t\t\t\t\t} catch (m) {\r\n\t\t\t\t\t\t\t\t\tl = \"\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tg += e\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ti[k] = l;\r\n\t\t\t\t\t\t\tk = \"\";\r\n\t\t\t\t\t\t\tl = \"\"\r\n\t\t\t\t\t\t} while (g < a.length);\r\n\t\t\t\t\t\treturn i\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdecode: function(a) {\r\n\t\t\t\t\t\tvar b = [],\r\n\t\t\t\t\t\t\tc, d = a.substr(0, 3),\r\n\t\t\t\t\t\t\te = decodeURIComponent(a.substr(3));\r\n\t\t\t\t\t\tswitch (d) {\r\n\t\t\t\t\t\t\tcase \"002\":\r\n\t\t\t\t\t\t\t\tb = sinaSSOEncoder.base64.decode(e, \"subp_v2\", \"array\");\r\n\t\t\t\t\t\t\t\treturn sinaSSOEncoder.getSUBPCookie.__parse(b);\r\n\t\t\t\t\t\t\tcase \"003\":\r\n\t\t\t\t\t\t\t\tc = e.substr(0, 1);\r\n\t\t\t\t\t\t\t\te = e.substr(1);\r\n\t\t\t\t\t\t\t\tb = sinaSSOEncoder.base64.decode(e, \"subp_v3_\" + c, \"array\");\r\n\t\t\t\t\t\t\t\treturn sinaSSOEncoder.getSUBPCookie.__parse(b);\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\treturn decodeURIComponent(a)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}).call(sinaSSOEncoder);\r\n\t\t\t(function() {\r\n\t\t\t\tfunction bt(a) {\r\n\t\t\t\t\tvar b = bp(a, this.n.bitLength() + 7 >> 3);\r\n\t\t\t\t\tif (b == null)\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\tvar c = this.doPublic(b);\r\n\t\t\t\t\tif (c == null)\r\n\t\t\t\t\t\treturn null;\r\n\t\t\t\t\tvar d = c.toString(16);\r\n\t\t\t\t\treturn (d.length & 1) == 0 ? d : \"0\" + d\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bs(a) {\r\n\t\t\t\t\treturn a.modPowInt(this.e, this.n)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction br(a, b) {\r\n\t\t\t\t\tif (a != null && b != null && a.length > 0 && b.length > 0) {\r\n\t\t\t\t\t\tthis.n = bm(a, 16);\r\n\t\t\t\t\t\tthis.e = parseInt(b, 16)\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\talert(\"Invalid RSA public key\")\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bq() {\r\n\t\t\t\t\tthis.n = null;\r\n\t\t\t\t\tthis.e = 0;\r\n\t\t\t\t\tthis.d = null;\r\n\t\t\t\t\tthis.p = null;\r\n\t\t\t\t\tthis.q = null;\r\n\t\t\t\t\tthis.dmp1 = null;\r\n\t\t\t\t\tthis.dmq1 = null;\r\n\t\t\t\t\tthis.coeff = null\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bp(a, b) {\r\n\t\t\t\t\tif (b < a.length + 11) {\r\n\t\t\t\t\t\talert(\"Message too long for RSA\");\r\n\t\t\t\t\t\treturn null\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar c = [],\r\n\t\t\t\t\t\te = a.length - 1;\r\n\t\t\t\t\twhile (e >= 0 && b > 0) {\r\n\t\t\t\t\t\tvar f = a.charCodeAt(e--);\r\n\t\t\t\t\t\tif (f < 128)\r\n\t\t\t\t\t\t\tc[--b] = f;\r\n\t\t\t\t\t\telse if (f > 127 && f < 2048) {\r\n\t\t\t\t\t\t\tc[--b] = f & 63 | 128;\r\n\t\t\t\t\t\t\tc[--b] = f >> 6 | 192\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tc[--b] = f & 63 | 128;\r\n\t\t\t\t\t\t\tc[--b] = f >> 6 & 63 | 128;\r\n\t\t\t\t\t\t\tc[--b] = f >> 12 | 224\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc[--b] = 0;\r\n\t\t\t\t\tvar g = new bl,\r\n\t\t\t\t\t\th = [];\r\n\t\t\t\t\twhile (b > 2) {\r\n\t\t\t\t\t\th[0] = 0;\r\n\t\t\t\t\t\twhile (h[0] == 0)\r\n\t\t\t\t\t\t\tg.nextBytes(h);\r\n\t\t\t\t\t\tc[--b] = h[0]\r\n\t\t\t\t\t}\r\n\t\t\t\t\tc[--b] = 2;\r\n\t\t\t\t\tc[--b] = 0;\r\n\t\t\t\t\treturn new d(c)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bo(a) {\r\n\t\t\t\t\treturn a < 16 ? \"0\" + a.toString(16) : a.toString(16)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bn(a, b) {\r\n\t\t\t\t\tvar c = \"\",\r\n\t\t\t\t\t\td = 0;\r\n\t\t\t\t\twhile (d + b < a.length) {\r\n\t\t\t\t\t\tc += a.substring(d, d + b) + \"\\n\";\r\n\t\t\t\t\t\td += b\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn c + a.substring(d, a.length)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bm(a, b) {\r\n\t\t\t\t\treturn new d(a, b)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bl() {}\r\n\r\n\t\t\t\tfunction bk(a) {\r\n\t\t\t\t\tvar b;\r\n\t\t\t\t\tfor (b = 0; b < a.length; ++b)\r\n\t\t\t\t\t\ta[b] = bj()\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bj() {\r\n\t\t\t\t\tif (bc == null) {\r\n\t\t\t\t\t\tbg();\r\n\t\t\t\t\t\tbc = ba();\r\n\t\t\t\t\t\tbc.init(bd);\r\n\t\t\t\t\t\tfor (be = 0; be < bd.length; ++be)\r\n\t\t\t\t\t\t\tbd[be] = 0;\r\n\t\t\t\t\t\tbe = 0\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn bc.next()\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bg() {\r\n\t\t\t\t\tbf((new Date).getTime())\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction bf(a) {\r\n\t\t\t\t\tbd[be++] ^= a & 255;\r\n\t\t\t\t\tbd[be++] ^= a >> 8 & 255;\r\n\t\t\t\t\tbd[be++] ^= a >> 16 & 255;\r\n\t\t\t\t\tbd[be++] ^= a >> 24 & 255;\r\n\t\t\t\t\tbe >= bb && (be -= bb)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction ba() {\r\n\t\t\t\t\treturn new Z\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction _() {\r\n\t\t\t\t\tvar a;\r\n\t\t\t\t\tthis.i = this.i + 1 & 255;\r\n\t\t\t\t\tthis.j = this.j + this.S[this.i] & 255;\r\n\t\t\t\t\ta = this.S[this.i];\r\n\t\t\t\t\tthis.S[this.i] = this.S[this.j];\r\n\t\t\t\t\tthis.S[this.j] = a;\r\n\t\t\t\t\treturn this.S[a + this.S[this.i] & 255]\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction $(a) {\r\n\t\t\t\t\tvar b, c, d;\r\n\t\t\t\t\tfor (b = 0; b < 256; ++b)\r\n\t\t\t\t\t\tthis.S[b] = b;\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\t\tfor (b = 0; b < 256; ++b) {\r\n\t\t\t\t\t\tc = c + this.S[b] + a[b % a.length] & 255;\r\n\t\t\t\t\t\td = this.S[b];\r\n\t\t\t\t\t\tthis.S[b] = this.S[c];\r\n\t\t\t\t\t\tthis.S[c] = d\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.i = 0;\r\n\t\t\t\t\tthis.j = 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction Z() {\r\n\t\t\t\t\tthis.i = 0;\r\n\t\t\t\t\tthis.j = 0;\r\n\t\t\t\t\tthis.S = []\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction Y(a, b) {\r\n\t\t\t\t\tvar c;\r\n\t\t\t\t\ta < 256 || b.isEven() ? c = new J(b) : c = new Q(b);\r\n\t\t\t\t\treturn this.exp(a, c)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction X(a, b) {\r\n\t\t\t\t\tif (a > 4294967295 || a < 1)\r\n\t\t\t\t\t\treturn d.ONE;\r\n\t\t\t\t\tvar c = e(),\r\n\t\t\t\t\t\tf = e(),\r\n\t\t\t\t\t\tg = b.convert(this),\r\n\t\t\t\t\t\th = y(a) - 1;\r\n\t\t\t\t\tg.copyTo(c);\r\n\t\t\t\t\twhile (--h >= 0) {\r\n\t\t\t\t\t\tb.sqrTo(c, f);\r\n\t\t\t\t\t\tif ((a & 1 << h) > 0)\r\n\t\t\t\t\t\t\tb.mulTo(f, g, c);\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tvar i = c;\r\n\t\t\t\t\t\t\tc = f;\r\n\t\t\t\t\t\t\tf = i\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn b.revert(c)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction W() {\r\n\t\t\t\t\treturn (this.t > 0 ? this[0] & 1 : this.s) == 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction V(a, b, c) {\r\n\t\t\t\t\ta.multiplyTo(b, c);\r\n\t\t\t\t\tthis.reduce(c)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction U(a, b) {\r\n\t\t\t\t\ta.squareTo(b);\r\n\t\t\t\t\tthis.reduce(b)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction T(a) {\r\n\t\t\t\t\twhile (a.t <= this.mt2)\r\n\t\t\t\t\t\ta[a.t++] = 0;\r\n\t\t\t\t\tfor (var b = 0; b < this.m.t; ++b) {\r\n\t\t\t\t\t\tvar c = a[b] & 32767,\r\n\t\t\t\t\t\t\td = c * this.mpl + ((c * this.mph + (a[b] >> 15) * this.mpl & this.um) << 15) & a.DM;\r\n\t\t\t\t\t\tc = b + this.m.t;\r\n\t\t\t\t\t\ta[c] += this.m.am(0, d, a, b, 0, this.m.t);\r\n\t\t\t\t\t\twhile (a[c] >= a.DV) {\r\n\t\t\t\t\t\t\ta[c] -= a.DV;\r\n\t\t\t\t\t\t\ta[++c]++\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ta.clamp();\r\n\t\t\t\t\ta.drShiftTo(this.m.t, a);\r\n\t\t\t\t\ta.compareTo(this.m) >= 0 && a.subTo(this.m, a)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction S(a) {\r\n\t\t\t\t\tvar b = e();\r\n\t\t\t\t\ta.copyTo(b);\r\n\t\t\t\t\tthis.reduce(b);\r\n\t\t\t\t\treturn b\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction R(a) {\r\n\t\t\t\t\tvar b = e();\r\n\t\t\t\t\ta.abs().dlShiftTo(this.m.t, b);\r\n\t\t\t\t\tb.divRemTo(this.m, null, b);\r\n\t\t\t\t\ta.s < 0 && b.compareTo(d.ZERO) > 0 && this.m.subTo(b, b);\r\n\t\t\t\t\treturn b\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction Q(a) {\r\n\t\t\t\t\tthis.m = a;\r\n\t\t\t\t\tthis.mp = a.invDigit();\r\n\t\t\t\t\tthis.mpl = this.mp & 32767;\r\n\t\t\t\t\tthis.mph = this.mp >> 15;\r\n\t\t\t\t\tthis.um = (1 << a.DB - 15) - 1;\r\n\t\t\t\t\tthis.mt2 = 2 * a.t\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction P() {\r\n\t\t\t\t\tif (this.t < 1)\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\tvar a = this[0];\r\n\t\t\t\t\tif ((a & 1) == 0)\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\tvar b = a & 3;\r\n\t\t\t\t\tb = b * (2 - (a & 15) * b) & 15;\r\n\t\t\t\t\tb = b * (2 - (a & 255) * b) & 255;\r\n\t\t\t\t\tb = b * (2 - ((a & 65535) * b & 65535)) & 65535;\r\n\t\t\t\t\tb = b * (2 - a * b % this.DV) % this.DV;\r\n\t\t\t\t\treturn b > 0 ? this.DV - b : -b\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction O(a, b) {\r\n\t\t\t\t\ta.squareTo(b);\r\n\t\t\t\t\tthis.reduce(b)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction N(a, b, c) {\r\n\t\t\t\t\ta.multiplyTo(b, c);\r\n\t\t\t\t\tthis.reduce(c)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction M(a) {\r\n\t\t\t\t\ta.divRemTo(this.m, null, a)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction L(a) {\r\n\t\t\t\t\treturn a\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction K(a) {\r\n\t\t\t\t\treturn a.s < 0 || a.compareTo(this.m) >= 0 ? a.mod(this.m) : a\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction J(a) {\r\n\t\t\t\t\tthis.m = a\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction I(a) {\r\n\t\t\t\t\tvar b = e();\r\n\t\t\t\t\tthis.abs().divRemTo(a, null, b);\r\n\t\t\t\t\tthis.s < 0 && b.compareTo(d.ZERO) > 0 && a.subTo(b, b);\r\n\t\t\t\t\treturn b\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction H(a, b, c) {\r\n\t\t\t\t\tvar f = a.abs();\r\n\t\t\t\t\tif (!(f.t <= 0)) {\r\n\t\t\t\t\t\tvar g = this.abs();\r\n\t\t\t\t\t\tif (g.t < f.t) {\r\n\t\t\t\t\t\t\tb != null && b.fromInt(0);\r\n\t\t\t\t\t\t\tc != null && this.copyTo(c);\r\n\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tc == null && (c = e());\r\n\t\t\t\t\t\tvar h = e(),\r\n\t\t\t\t\t\t\ti = this.s,\r\n\t\t\t\t\t\t\tj = a.s,\r\n\t\t\t\t\t\t\tk = this.DB - y(f[f.t - 1]);\r\n\t\t\t\t\t\tif (k > 0) {\r\n\t\t\t\t\t\t\tf.lShiftTo(k, h);\r\n\t\t\t\t\t\t\tg.lShiftTo(k, c)\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tf.copyTo(h);\r\n\t\t\t\t\t\t\tg.copyTo(c)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvar l = h.t,\r\n\t\t\t\t\t\t\tm = h[l - 1];\r\n\t\t\t\t\t\tif (m == 0)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tvar n = m * (1 << this.F1) + (l > 1 ? h[l - 2] >> this.F2 : 0),\r\n\t\t\t\t\t\t\to = this.FV / n,\r\n\t\t\t\t\t\t\tp = (1 << this.F1) / n,\r\n\t\t\t\t\t\t\tq = 1 << this.F2,\r\n\t\t\t\t\t\t\tr = c.t,\r\n\t\t\t\t\t\t\ts = r - l,\r\n\t\t\t\t\t\t\tt = b == null ? e() : b;\r\n\t\t\t\t\t\th.dlShiftTo(s, t);\r\n\t\t\t\t\t\tif (c.compareTo(t) >= 0) {\r\n\t\t\t\t\t\t\tc[c.t++] = 1;\r\n\t\t\t\t\t\t\tc.subTo(t, c)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\td.ONE.dlShiftTo(l, t);\r\n\t\t\t\t\t\tt.subTo(h, h);\r\n\t\t\t\t\t\twhile (h.t < l)\r\n\t\t\t\t\t\t\th[h.t++] = 0;\r\n\t\t\t\t\t\twhile (--s >= 0) {\r\n\t\t\t\t\t\t\tvar u = c[--r] == m ? this.DM : Math.floor(c[r] * o + (c[r - 1] + q) * p);\r\n\t\t\t\t\t\t\tif ((c[r] += h.am(0, u, c, s, 0, l)) < u) {\r\n\t\t\t\t\t\t\t\th.dlShiftTo(s, t);\r\n\t\t\t\t\t\t\t\tc.subTo(t, c);\r\n\t\t\t\t\t\t\t\twhile (c[r] < --u)\r\n\t\t\t\t\t\t\t\t\tc.subTo(t, c)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (b != null) {\r\n\t\t\t\t\t\t\tc.drShiftTo(l, b);\r\n\t\t\t\t\t\t\ti != j && d.ZERO.subTo(b, b)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tc.t = l;\r\n\t\t\t\t\t\tc.clamp();\r\n\t\t\t\t\t\tk > 0 && c.rShiftTo(k, c);\r\n\t\t\t\t\t\ti < 0 && d.ZERO.subTo(c, c)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction G(a) {\r\n\t\t\t\t\tvar b = this.abs(),\r\n\t\t\t\t\t\tc = a.t = 2 * b.t;\r\n\t\t\t\t\twhile (--c >= 0)\r\n\t\t\t\t\t\ta[c] = 0;\r\n\t\t\t\t\tfor (c = 0; c < b.t - 1; ++c) {\r\n\t\t\t\t\t\tvar d = b.am(c, b[c], a, 2 * c, 0, 1);\r\n\t\t\t\t\t\tif ((a[c + b.t] += b.am(c + 1, 2 * b[c], a, 2 * c + 1, d, b.t - c - 1)) >= b.DV) {\r\n\t\t\t\t\t\t\ta[c + b.t] -= b.DV;\r\n\t\t\t\t\t\t\ta[c + b.t + 1] = 1\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ta.t > 0 && (a[a.t - 1] += b.am(c, b[c], a, 2 * c, 0, 1));\r\n\t\t\t\t\ta.s = 0;\r\n\t\t\t\t\ta.clamp()\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction F(a, b) {\r\n\t\t\t\t\tvar c = this.abs(),\r\n\t\t\t\t\t\te = a.abs(),\r\n\t\t\t\t\t\tf = c.t;\r\n\t\t\t\t\tb.t = f + e.t;\r\n\t\t\t\t\twhile (--f >= 0)\r\n\t\t\t\t\t\tb[f] = 0;\r\n\t\t\t\t\tfor (f = 0; f < e.t; ++f)\r\n\t\t\t\t\t\tb[f + c.t] = c.am(0, e[f], b, f, 0, c.t);\r\n\t\t\t\t\tb.s = 0;\r\n\t\t\t\t\tb.clamp();\r\n\t\t\t\t\tthis.s != a.s && d.ZERO.subTo(b, b)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction E(a, b) {\r\n\t\t\t\t\tvar c = 0,\r\n\t\t\t\t\t\td = 0,\r\n\t\t\t\t\t\te = Math.min(a.t, this.t);\r\n\t\t\t\t\twhile (c < e) {\r\n\t\t\t\t\t\td += this[c] - a[c];\r\n\t\t\t\t\t\tb[c++] = d & this.DM;\r\n\t\t\t\t\t\td >>= this.DB\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (a.t < this.t) {\r\n\t\t\t\t\t\td -= a.s;\r\n\t\t\t\t\t\twhile (c < this.t) {\r\n\t\t\t\t\t\t\td += this[c];\r\n\t\t\t\t\t\t\tb[c++] = d & this.DM;\r\n\t\t\t\t\t\t\td >>= this.DB\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\td += this.s\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\td += this.s;\r\n\t\t\t\t\t\twhile (c < a.t) {\r\n\t\t\t\t\t\t\td -= a[c];\r\n\t\t\t\t\t\t\tb[c++] = d & this.DM;\r\n\t\t\t\t\t\t\td >>= this.DB\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\td -= a.s\r\n\t\t\t\t\t}\r\n\t\t\t\t\tb.s = d < 0 ? -1 : 0;\r\n\t\t\t\t\td < -1 ? b[c++] = this.DV + d : d > 0 && (b[c++] = d);\r\n\t\t\t\t\tb.t = c;\r\n\t\t\t\t\tb.clamp()\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction D(a, b) {\r\n\t\t\t\t\tb.s = this.s;\r\n\t\t\t\t\tvar c = Math.floor(a / this.DB);\r\n\t\t\t\t\tif (c >= this.t)\r\n\t\t\t\t\t\tb.t = 0;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvar d = a % this.DB,\r\n\t\t\t\t\t\t\te = this.DB - d,\r\n\t\t\t\t\t\t\tf = (1 << d) - 1;\r\n\t\t\t\t\t\tb[0] = this[c] >> d;\r\n\t\t\t\t\t\tfor (var g = c + 1; g < this.t; ++g) {\r\n\t\t\t\t\t\t\tb[g - c - 1] |= (this[g] & f) << e;\r\n\t\t\t\t\t\t\tb[g - c] = this[g] >> d\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\td > 0 && (b[this.t - c - 1] |= (this.s & f) << e);\r\n\t\t\t\t\t\tb.t = this.t - c;\r\n\t\t\t\t\t\tb.clamp()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction C(a, b) {\r\n\t\t\t\t\tvar c = a % this.DB,\r\n\t\t\t\t\t\td = this.DB - c,\r\n\t\t\t\t\t\te = (1 << d) - 1,\r\n\t\t\t\t\t\tf = Math.floor(a / this.DB),\r\n\t\t\t\t\t\tg = this.s << c & this.DM,\r\n\t\t\t\t\t\th;\r\n\t\t\t\t\tfor (h = this.t - 1; h >= 0; --h) {\r\n\t\t\t\t\t\tb[h + f + 1] = this[h] >> d | g;\r\n\t\t\t\t\t\tg = (this[h] & e) << c\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (h = f - 1; h >= 0; --h)\r\n\t\t\t\t\t\tb[h] = 0;\r\n\t\t\t\t\tb[f] = g;\r\n\t\t\t\t\tb.t = this.t + f + 1;\r\n\t\t\t\t\tb.s = this.s;\r\n\t\t\t\t\tb.clamp()\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction B(a, b) {\r\n\t\t\t\t\tfor (var c = a; c < this.t; ++c)\r\n\t\t\t\t\t\tb[c - a] = this[c];\r\n\t\t\t\t\tb.t = Math.max(this.t - a, 0);\r\n\t\t\t\t\tb.s = this.s\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction A(a, b) {\r\n\t\t\t\t\tvar c;\r\n\t\t\t\t\tfor (c = this.t - 1; c >= 0; --c)\r\n\t\t\t\t\t\tb[c + a] = this[c];\r\n\t\t\t\t\tfor (c = a - 1; c >= 0; --c)\r\n\t\t\t\t\t\tb[c] = 0;\r\n\t\t\t\t\tb.t = this.t + a;\r\n\t\t\t\t\tb.s = this.s\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction z() {\r\n\t\t\t\t\treturn this.t <= 0 ? 0 : this.DB * (this.t - 1) + y(this[this.t - 1] ^ this.s & this.DM)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction y(a) {\r\n\t\t\t\t\tvar b = 1,\r\n\t\t\t\t\t\tc;\r\n\t\t\t\t\tif ((c = a >>> 16) != 0) {\r\n\t\t\t\t\t\ta = c;\r\n\t\t\t\t\t\tb += 16\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((c = a >> 8) != 0) {\r\n\t\t\t\t\t\ta = c;\r\n\t\t\t\t\t\tb += 8\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((c = a >> 4) != 0) {\r\n\t\t\t\t\t\ta = c;\r\n\t\t\t\t\t\tb += 4\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((c = a >> 2) != 0) {\r\n\t\t\t\t\t\ta = c;\r\n\t\t\t\t\t\tb += 2\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((c = a >> 1) != 0) {\r\n\t\t\t\t\t\ta = c;\r\n\t\t\t\t\t\tb += 1\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn b\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction x(a) {\r\n\t\t\t\t\tvar b = this.s - a.s;\r\n\t\t\t\t\tif (b != 0)\r\n\t\t\t\t\t\treturn b;\r\n\t\t\t\t\tvar c = this.t;\r\n\t\t\t\t\tb = c - a.t;\r\n\t\t\t\t\tif (b != 0)\r\n\t\t\t\t\t\treturn b;\r\n\t\t\t\t\twhile (--c >= 0)\r\n\t\t\t\t\t\tif ((b = this[c] - a[c]) != 0)\r\n\t\t\t\t\t\t\treturn b;\r\n\t\t\t\t\treturn 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction w() {\r\n\t\t\t\t\treturn this.s < 0 ? this.negate() : this\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction v() {\r\n\t\t\t\t\tvar a = e();\r\n\t\t\t\t\td.ZERO.subTo(this, a);\r\n\t\t\t\t\treturn a\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction u(a) {\r\n\t\t\t\t\tif (this.s < 0)\r\n\t\t\t\t\t\treturn \"-\" + this.negate().toString(a);\r\n\t\t\t\t\tvar b;\r\n\t\t\t\t\tif (a == 16)\r\n\t\t\t\t\t\tb = 4;\r\n\t\t\t\t\telse if (a == 8)\r\n\t\t\t\t\t\tb = 3;\r\n\t\t\t\t\telse if (a == 2)\r\n\t\t\t\t\t\tb = 1;\r\n\t\t\t\t\telse if (a == 32)\r\n\t\t\t\t\t\tb = 5;\r\n\t\t\t\t\telse if (a == 4)\r\n\t\t\t\t\t\tb = 2;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treturn this.toRadix(a);\r\n\t\t\t\t\tvar c = (1 << b) - 1,\r\n\t\t\t\t\t\td, e = !1,\r\n\t\t\t\t\t\tf = \"\",\r\n\t\t\t\t\t\tg = this.t,\r\n\t\t\t\t\t\th = this.DB - g * this.DB % b;\r\n\t\t\t\t\tif (g-- > 0) {\r\n\t\t\t\t\t\tif (h < this.DB && (d = this[g] >> h) > 0) {\r\n\t\t\t\t\t\t\te = !0;\r\n\t\t\t\t\t\t\tf = n(d)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twhile (g >= 0) {\r\n\t\t\t\t\t\t\tif (h < b) {\r\n\t\t\t\t\t\t\t\td = (this[g] & (1 << h) - 1) << b - h;\r\n\t\t\t\t\t\t\t\td |= this[--g] >> (h += this.DB - b)\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\td = this[g] >> (h -= b) & c;\r\n\t\t\t\t\t\t\t\tif (h <= 0) {\r\n\t\t\t\t\t\t\t\t\th += this.DB;\r\n\t\t\t\t\t\t\t\t\t--g\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\td > 0 && (e = !0);\r\n\t\t\t\t\t\t\te && (f += n(d))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn e ? f : \"0\"\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction t() {\r\n\t\t\t\t\tvar a = this.s & this.DM;\r\n\t\t\t\t\twhile (this.t > 0 && this[this.t - 1] == a)\r\n\t\t\t\t\t\t--this.t\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction s(a, b) {\r\n\t\t\t\t\tvar c;\r\n\t\t\t\t\tif (b == 16)\r\n\t\t\t\t\t\tc = 4;\r\n\t\t\t\t\telse if (b == 8)\r\n\t\t\t\t\t\tc = 3;\r\n\t\t\t\t\telse if (b == 256)\r\n\t\t\t\t\t\tc = 8;\r\n\t\t\t\t\telse if (b == 2)\r\n\t\t\t\t\t\tc = 1;\r\n\t\t\t\t\telse if (b == 32)\r\n\t\t\t\t\t\tc = 5;\r\n\t\t\t\t\telse if (b == 4)\r\n\t\t\t\t\t\tc = 2;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis.fromRadix(a, b);\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.t = 0;\r\n\t\t\t\t\tthis.s = 0;\r\n\t\t\t\t\tvar e = a.length,\r\n\t\t\t\t\t\tf = !1,\r\n\t\t\t\t\t\tg = 0;\r\n\t\t\t\t\twhile (--e >= 0) {\r\n\t\t\t\t\t\tvar h = c == 8 ? a[e] & 255 : o(a, e);\r\n\t\t\t\t\t\tif (h < 0) {\r\n\t\t\t\t\t\t\ta.charAt(e) == \"-\" && (f = !0);\r\n\t\t\t\t\t\t\tcontinue\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tf = !1;\r\n\t\t\t\t\t\tif (g == 0)\r\n\t\t\t\t\t\t\tthis[this.t++] = h;\r\n\t\t\t\t\t\telse if (g + c > this.DB) {\r\n\t\t\t\t\t\t\tthis[this.t - 1] |= (h & (1 << this.DB - g) - 1) << g;\r\n\t\t\t\t\t\t\tthis[this.t++] = h >> this.DB - g\r\n\t\t\t\t\t\t} else\r\n\t\t\t\t\t\t\tthis[this.t - 1] |= h << g;\r\n\t\t\t\t\t\tg += c;\r\n\t\t\t\t\t\tg >= this.DB && (g -= this.DB)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (c == 8 && (a[0] & 128) != 0) {\r\n\t\t\t\t\t\tthis.s = -1;\r\n\t\t\t\t\t\tg > 0 && (this[this.t - 1] |= (1 << this.DB - g) - 1 << g)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.clamp();\r\n\t\t\t\t\tf && d.ZERO.subTo(this, this)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction r(a) {\r\n\t\t\t\t\tvar b = e();\r\n\t\t\t\t\tb.fromInt(a);\r\n\t\t\t\t\treturn b\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction q(a) {\r\n\t\t\t\t\tthis.t = 1;\r\n\t\t\t\t\tthis.s = a < 0 ? -1 : 0;\r\n\t\t\t\t\ta > 0 ? this[0] = a : a < -1 ? this[0] = a + DV : this.t = 0\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction p(a) {\r\n\t\t\t\t\tfor (var b = this.t - 1; b >= 0; --b)\r\n\t\t\t\t\t\ta[b] = this[b];\r\n\t\t\t\t\ta.t = this.t;\r\n\t\t\t\t\ta.s = this.s\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction o(a, b) {\r\n\t\t\t\t\tvar c = k[a.charCodeAt(b)];\r\n\t\t\t\t\treturn c == null ? -1 : c\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction n(a) {\r\n\t\t\t\t\treturn j.charAt(a)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction h(a, b, c, d, e, f) {\r\n\t\t\t\t\tvar g = b & 16383,\r\n\t\t\t\t\t\th = b >> 14;\r\n\t\t\t\t\twhile (--f >= 0) {\r\n\t\t\t\t\t\tvar i = this[a] & 16383,\r\n\t\t\t\t\t\t\tj = this[a++] >> 14,\r\n\t\t\t\t\t\t\tk = h * i + j * g;\r\n\t\t\t\t\t\ti = g * i + ((k & 16383) << 14) + c[d] + e;\r\n\t\t\t\t\t\te = (i >> 28) + (k >> 14) + h * j;\r\n\t\t\t\t\t\tc[d++] = i & 268435455\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn e\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction g(a, b, c, d, e, f) {\r\n\t\t\t\t\tvar g = b & 32767,\r\n\t\t\t\t\t\th = b >> 15;\r\n\t\t\t\t\twhile (--f >= 0) {\r\n\t\t\t\t\t\tvar i = this[a] & 32767,\r\n\t\t\t\t\t\t\tj = this[a++] >> 15,\r\n\t\t\t\t\t\t\tk = h * i + j * g;\r\n\t\t\t\t\t\ti = g * i + ((k & 32767) << 15) + c[d] + (e & 1073741823);\r\n\t\t\t\t\t\te = (i >>> 30) + (k >>> 15) + h * j + (e >>> 30);\r\n\t\t\t\t\t\tc[d++] = i & 1073741823\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn e\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction f(a, b, c, d, e, f) {\r\n\t\t\t\t\twhile (--f >= 0) {\r\n\t\t\t\t\t\tvar g = b * this[a++] + c[d] + e;\r\n\t\t\t\t\t\te = Math.floor(g / 67108864);\r\n\t\t\t\t\t\tc[d++] = g & 67108863\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn e\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction e() {\r\n\t\t\t\t\treturn new d(null)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction d(a, b, c) {\r\n\t\t\t\t\ta != null && (\"number\" == typeof a ? this.fromNumber(a, b, c) : b == null && \"string\" != typeof a ? this.fromString(\r\n\t\t\t\t\t\ta, 256) : this.fromString(a, b))\r\n\t\t\t\t}\r\n\t\t\t\tvar a, b = 0xdeadbeefcafe,\r\n\t\t\t\t\tc = (b & 16777215) == 15715070;\r\n\t\t\t\tif (c && navigator.appName == \"Microsoft Internet Explorer\") {\r\n\t\t\t\t\td.prototype.am = g;\r\n\t\t\t\t\ta = 30\r\n\t\t\t\t} else if (c && navigator.appName != \"Netscape\") {\r\n\t\t\t\t\td.prototype.am = f;\r\n\t\t\t\t\ta = 26\r\n\t\t\t\t} else {\r\n\t\t\t\t\td.prototype.am = h;\r\n\t\t\t\t\ta = 28\r\n\t\t\t\t}\r\n\t\t\t\td.prototype.DB = a;\r\n\t\t\t\td.prototype.DM = (1 << a) - 1;\r\n\t\t\t\td.prototype.DV = 1 << a;\r\n\t\t\t\tvar i = 52;\r\n\t\t\t\td.prototype.FV = Math.pow(2, i);\r\n\t\t\t\td.prototype.F1 = i - a;\r\n\t\t\t\td.prototype.F2 = 2 * a - i;\r\n\t\t\t\tvar j = \"0123456789abcdefghijklmnopqrstuvwxyz\",\r\n\t\t\t\t\tk = [],\r\n\t\t\t\t\tl, m;\r\n\t\t\t\tl = \"0\".charCodeAt(0);\r\n\t\t\t\tfor (m = 0; m <= 9; ++m)\r\n\t\t\t\t\tk[l++] = m;\r\n\t\t\t\tl = \"a\".charCodeAt(0);\r\n\t\t\t\tfor (m = 10; m < 36; ++m)\r\n\t\t\t\t\tk[l++] = m;\r\n\t\t\t\tl = \"A\".charCodeAt(0);\r\n\t\t\t\tfor (m = 10; m < 36; ++m)\r\n\t\t\t\t\tk[l++] = m;\r\n\t\t\t\tJ.prototype.convert = K;\r\n\t\t\t\tJ.prototype.revert = L;\r\n\t\t\t\tJ.prototype.reduce = M;\r\n\t\t\t\tJ.prototype.mulTo = N;\r\n\t\t\t\tJ.prototype.sqrTo = O;\r\n\t\t\t\tQ.prototype.convert = R;\r\n\t\t\t\tQ.prototype.revert = S;\r\n\t\t\t\tQ.prototype.reduce = T;\r\n\t\t\t\tQ.prototype.mulTo = V;\r\n\t\t\t\tQ.prototype.sqrTo = U;\r\n\t\t\t\td.prototype.copyTo = p;\r\n\t\t\t\td.prototype.fromInt = q;\r\n\t\t\t\td.prototype.fromString = s;\r\n\t\t\t\td.prototype.clamp = t;\r\n\t\t\t\td.prototype.dlShiftTo = A;\r\n\t\t\t\td.prototype.drShiftTo = B;\r\n\t\t\t\td.prototype.lShiftTo = C;\r\n\t\t\t\td.prototype.rShiftTo = D;\r\n\t\t\t\td.prototype.subTo = E;\r\n\t\t\t\td.prototype.multiplyTo = F;\r\n\t\t\t\td.prototype.squareTo = G;\r\n\t\t\t\td.prototype.divRemTo = H;\r\n\t\t\t\td.prototype.invDigit = P;\r\n\t\t\t\td.prototype.isEven = W;\r\n\t\t\t\td.prototype.exp = X;\r\n\t\t\t\td.prototype.toString = u;\r\n\t\t\t\td.prototype.negate = v;\r\n\t\t\t\td.prototype.abs = w;\r\n\t\t\t\td.prototype.compareTo = x;\r\n\t\t\t\td.prototype.bitLength = z;\r\n\t\t\t\td.prototype.mod = I;\r\n\t\t\t\td.prototype.modPowInt = Y;\r\n\t\t\t\td.ZERO = r(0);\r\n\t\t\t\td.ONE = r(1);\r\n\t\t\t\tZ.prototype.init = $;\r\n\t\t\t\tZ.prototype.next = _;\r\n\t\t\t\tvar bb = 256,\r\n\t\t\t\t\tbc, bd, be;\r\n\t\t\t\tif (bd == null) {\r\n\t\t\t\t\tbd = [];\r\n\t\t\t\t\tbe = 0;\r\n\t\t\t\t\tvar bh;\r\n\t\t\t\t\tif (navigator.appName == \"Netscape\" && navigator.appVersion < \"5\" && window.crypto && typeof window.crypto.random ==\r\n\t\t\t\t\t\t\"function\") {\r\n\t\t\t\t\t\tvar bi = window.crypto.random(32);\r\n\t\t\t\t\t\tfor (bh = 0; bh < bi.length; ++bh)\r\n\t\t\t\t\t\t\tbd[be++] = bi.charCodeAt(bh) & 255\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile (be < bb) {\r\n\t\t\t\t\t\tbh = Math.floor(65536 * Math.random());\r\n\t\t\t\t\t\tbd[be++] = bh >>> 8;\r\n\t\t\t\t\t\tbd[be++] = bh & 255\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbe = 0;\r\n\t\t\t\t\tbg()\r\n\t\t\t\t}\r\n\t\t\t\tbl.prototype.nextBytes = bk;\r\n\t\t\t\tbq.prototype.doPublic = bs;\r\n\t\t\t\tbq.prototype.setPublic = br;\r\n\t\t\t\tbq.prototype.encrypt = bt;\r\n\t\t\t\tthis.RSAKey = bq\r\n\t\t\t}).call(sinaSSOEncoder);\r\n\t\t\tvar me = {};\r\n\r\n\t\t\tfunction get_up(pwd,publickey,time,nonce) {\r\n\t\t\t\tvar f = new sinaSSOEncoder.RSAKey;\r\n\t\t\t\t// f.setPublic(\"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443\", \"10001\");\r\n\t\t\t\t// b = f.encrypt([1574248301, \"PN9UV0\"].join(\"\\t\") + \"\\n\" + '123456')\r\n                f.setPublic(publickey, \"10001\");\r\n\t\t\t    b = f.encrypt([time, nonce].join(\"\\t\") + \"\\n\" + pwd)\r\n\t\t\t\treturn b\r\n\t\t\t}"
  },
  {
    "path": "其他实战/【新浪微博】密码解密/main.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-09-26  Python: 3.7\r\n\r\n\r\nimport execjs\r\nimport requests\r\nimport json\r\nimport re\r\n\r\n\r\ndef Get_parameters():\r\n    \"\"\"微博加密参数有两个   用户名和密码\r\n    用户名为 base64加密\r\n    此处只解决了密码加密问题   其他的请自行拓展\r\n    pubkey,time,nonce\r\n    :return pubkey,time,nonce\r\n    \"\"\"\r\n    try:\r\n        url = \"https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTc3MjM1NzI1OTA%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1574300620782\"\r\n\r\n        headers = {\r\n            'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',\r\n            'Host': 'login.sina.com.cn',\r\n            'Referer': 'https://www.weibo.com/login.php',\r\n        }\r\n\r\n        res = requests.get(url=url, headers=headers)\r\n        data = re.findall('sinaSSOController.preloginCallBack\\((.*?)\\)', res.text, re.S)[0]\r\n        new_data = json.loads(data)\r\n        time = new_data.get('servertime')\r\n        nonce = new_data.get('nonce')\r\n        pubkey = new_data.get('pubkey')\r\n        return pubkey, time, nonce\r\n    except Exception as err:\r\n        print('访问失败', err)\r\n\r\n\r\ndef main(pwd):\r\n    \"\"\"\r\n    :param pwd:\r\n    :return:\r\n    \"\"\"\r\n    with open('execute.js', 'r', encoding='utf-8') as f:\r\n        js = execjs.compile(f.read())\r\n\r\n        print('引擎', execjs.get().name)\r\n        publickey, time, nonce = Get_parameters()\r\n        sign = js.call('get_up', pwd, publickey, time, nonce)\r\n        return sign\r\n\r\n\r\nif __name__ == '__main__':\r\n    pwd = input('请输入密码：')\r\n    sign = main(pwd)\r\n    print(sign)\r\n"
  },
  {
    "path": "其他实战/【时光网】登陆参数生成/encryp.js",
    "content": "var CryptoJS = CryptoJS || function (g, w) {\n    var m = {}\n        , q = m.lib = {}\n        , j = q.Base = function () {\n        function a() {\n        }\n\n        return {\n            extend: function (e) {\n                a.prototype = this;\n                var c = new a;\n                return e && c.mixIn(e),\n                    c.$super = this,\n                    c\n            },\n            create: function () {\n                var c = this.extend();\n                return c.init.apply(c, arguments),\n                    c\n            },\n            init: function () {\n            },\n            mixIn: function (c) {\n                for (var f in c) {\n                    c.hasOwnProperty(f) && (this[f] = c[f])\n                }\n                c.hasOwnProperty(\"toString\") && (this.toString = c.toString)\n            },\n            clone: function () {\n                return this.$super.extend(this)\n            }\n        }\n    }()\n        , v = q.WordArray = j.extend({\n        init: function (a, c) {\n            a = this.words = a || [],\n                this.sigBytes = c != w ? c : 4 * a.length\n        },\n        toString: function (a) {\n            return (a || x).stringify(this)\n        },\n        concat: function (a) {\n            var o = this.words\n                , f = a.words\n                , l = this.sigBytes\n                , a = a.sigBytes;\n            this.clamp();\n            if (l % 4) {\n                for (var c = 0; c < a; c++) {\n                    o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4)\n                }\n            } else {\n                if (65535 < f.length) {\n                    for (c = 0; c < a; c += 4) {\n                        o[l + c >>> 2] = f[c >>> 2]\n                    }\n                } else {\n                    o.push.apply(o, f)\n                }\n            }\n            return this.sigBytes += a,\n                this\n        },\n        clamp: function () {\n            var c = this.words\n                , a = this.sigBytes;\n            c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4),\n                c.length = g.ceil(a / 4)\n        },\n        clone: function () {\n            var a = j.clone.call(this);\n            return a.words = this.words.slice(0),\n                a\n        },\n        random: function (e) {\n            for (var a = [], c = 0; c < e; c += 4) {\n                a.push(4294967296 * g.random() | 0)\n            }\n            return v.create(a, e)\n        }\n    })\n        , p = m.enc = {}\n        , x = p.Hex = {\n        stringify: function (a) {\n            for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) {\n                var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255;\n                f.push((c >>> 4).toString(16)),\n                    f.push((c & 15).toString(16))\n            }\n            return f.join(\"\")\n        },\n        parse: function (a) {\n            for (var i = a.length, c = [], f = 0; f < i; f += 2) {\n                c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8)\n            }\n            return v.create(c, i / 2)\n        }\n    }\n        , b = p.Latin1 = {\n        stringify: function (a) {\n            for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) {\n                c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255))\n            }\n            return c.join(\"\")\n        },\n        parse: function (a) {\n            for (var i = a.length, c = [], f = 0; f < i; f++) {\n                c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4)\n            }\n            return v.create(c, i)\n        }\n    }\n        , h = p.Utf8 = {\n        stringify: function (a) {\n            try {\n                return decodeURIComponent(escape(b.stringify(a)))\n            } catch (c) {\n                throw Error(\"Malformed UTF-8 data\")\n            }\n        },\n        parse: function (a) {\n            return b.parse(unescape(encodeURIComponent(a)))\n        }\n    }\n        , k = q.BufferedBlockAlgorithm = j.extend({\n        reset: function () {\n            this._data = v.create(),\n                this._nDataBytes = 0\n        },\n        _append: function (a) {\n            \"string\" == typeof a && (a = h.parse(a)),\n                this._data.concat(a),\n                this._nDataBytes += a.sigBytes\n        },\n        _process: function (y) {\n            var f = this._data\n                , s = f.words\n                , e = f.sigBytes\n                , l = this.blockSize\n                , z = e / (4 * l)\n                , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0)\n                , y = z * l\n                , e = g.min(4 * y, e);\n            if (y) {\n                for (var c = 0; c < y; c += l) {\n                    this._doProcessBlock(s, c)\n                }\n                c = s.splice(0, y),\n                    f.sigBytes -= e\n            }\n            return v.create(c, e)\n        },\n        clone: function () {\n            var a = j.clone.call(this);\n            return a._data = this._data.clone(),\n                a\n        },\n        _minBufferSize: 0\n    });\n    q.Hasher = k.extend({\n        init: function () {\n            this.reset()\n        },\n        reset: function () {\n            k.reset.call(this),\n                this._doReset()\n        },\n        update: function (a) {\n            return this._append(a),\n                this._process(),\n                this\n        },\n        finalize: function (a) {\n            return a && this._append(a),\n                this._doFinalize(),\n                this._hash\n        },\n        clone: function () {\n            var a = k.clone.call(this);\n            return a._hash = this._hash.clone(),\n                a\n        },\n        blockSize: 16,\n        _createHelper: function (a) {\n            return function (e, c) {\n                return a.create(c).finalize(e)\n            }\n        },\n        _createHmacHelper: function (a) {\n            return function (e, c) {\n                return d.HMAC.create(a, c).finalize(e)\n            }\n        }\n    });\n    var d = m.algo = {};\n    return m\n}(Math)\n    , CryptoJS = CryptoJS || function (g, w) {\n    var m = {}\n        , q = m.lib = {}\n        , j = q.Base = function () {\n        function a() {\n        }\n\n        return {\n            extend: function (e) {\n                a.prototype = this;\n                var c = new a;\n                return e && c.mixIn(e),\n                    c.$super = this,\n                    c\n            },\n            create: function () {\n                var c = this.extend();\n                return c.init.apply(c, arguments),\n                    c\n            },\n            init: function () {\n            },\n            mixIn: function (c) {\n                for (var f in c) {\n                    c.hasOwnProperty(f) && (this[f] = c[f])\n                }\n                c.hasOwnProperty(\"toString\") && (this.toString = c.toString)\n            },\n            clone: function () {\n                return this.$super.extend(this)\n            }\n        }\n    }()\n        , v = q.WordArray = j.extend({\n        init: function (a, c) {\n            a = this.words = a || [],\n                this.sigBytes = c != w ? c : 4 * a.length\n        },\n        toString: function (a) {\n            return (a || x).stringify(this)\n        },\n        concat: function (a) {\n            var o = this.words\n                , f = a.words\n                , l = this.sigBytes\n                , a = a.sigBytes;\n            this.clamp();\n            if (l % 4) {\n                for (var c = 0; c < a; c++) {\n                    o[l + c >>> 2] |= (f[c >>> 2] >>> 24 - 8 * (c % 4) & 255) << 24 - 8 * ((l + c) % 4)\n                }\n            } else {\n                if (65535 < f.length) {\n                    for (c = 0; c < a; c += 4) {\n                        o[l + c >>> 2] = f[c >>> 2]\n                    }\n                } else {\n                    o.push.apply(o, f)\n                }\n            }\n            return this.sigBytes += a,\n                this\n        },\n        clamp: function () {\n            var c = this.words\n                , a = this.sigBytes;\n            c[a >>> 2] &= 4294967295 << 32 - 8 * (a % 4),\n                c.length = g.ceil(a / 4)\n        },\n        clone: function () {\n            var a = j.clone.call(this);\n            return a.words = this.words.slice(0),\n                a\n        },\n        random: function (e) {\n            for (var a = [], c = 0; c < e; c += 4) {\n                a.push(4294967296 * g.random() | 0)\n            }\n            return v.create(a, e)\n        }\n    })\n        , p = m.enc = {}\n        , x = p.Hex = {\n        stringify: function (a) {\n            for (var o = a.words, a = a.sigBytes, f = [], l = 0; l < a; l++) {\n                var c = o[l >>> 2] >>> 24 - 8 * (l % 4) & 255;\n                f.push((c >>> 4).toString(16)),\n                    f.push((c & 15).toString(16))\n            }\n            return f.join(\"\")\n        },\n        parse: function (a) {\n            for (var i = a.length, c = [], f = 0; f < i; f += 2) {\n                c[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8)\n            }\n            return v.create(c, i / 2)\n        }\n    }\n        , b = p.Latin1 = {\n        stringify: function (a) {\n            for (var i = a.words, a = a.sigBytes, c = [], f = 0; f < a; f++) {\n                c.push(String.fromCharCode(i[f >>> 2] >>> 24 - 8 * (f % 4) & 255))\n            }\n            return c.join(\"\")\n        },\n        parse: function (a) {\n            for (var i = a.length, c = [], f = 0; f < i; f++) {\n                c[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4)\n            }\n            return v.create(c, i)\n        }\n    }\n        , h = p.Utf8 = {\n        stringify: function (a) {\n            try {\n                return decodeURIComponent(escape(b.stringify(a)))\n            } catch (c) {\n                throw Error(\"Malformed UTF-8 data\")\n            }\n        },\n        parse: function (a) {\n            return b.parse(unescape(encodeURIComponent(a)))\n        }\n    }\n        , k = q.BufferedBlockAlgorithm = j.extend({\n        reset: function () {\n            this._data = v.create(),\n                this._nDataBytes = 0\n        },\n        _append: function (a) {\n            \"string\" == typeof a && (a = h.parse(a)),\n                this._data.concat(a),\n                this._nDataBytes += a.sigBytes\n        },\n        _process: function (y) {\n            var f = this._data\n                , s = f.words\n                , e = f.sigBytes\n                , l = this.blockSize\n                , z = e / (4 * l)\n                , z = y ? g.ceil(z) : g.max((z | 0) - this._minBufferSize, 0)\n                , y = z * l\n                , e = g.min(4 * y, e);\n            if (y) {\n                for (var c = 0; c < y; c += l) {\n                    this._doProcessBlock(s, c)\n                }\n                c = s.splice(0, y),\n                    f.sigBytes -= e\n            }\n            return v.create(c, e)\n        },\n        clone: function () {\n            var a = j.clone.call(this);\n            return a._data = this._data.clone(),\n                a\n        },\n        _minBufferSize: 0\n    });\n    q.Hasher = k.extend({\n        init: function () {\n            this.reset()\n        },\n        reset: function () {\n            k.reset.call(this),\n                this._doReset()\n        },\n        update: function (a) {\n            return this._append(a),\n                this._process(),\n                this\n        },\n        finalize: function (a) {\n            return a && this._append(a),\n                this._doFinalize(),\n                this._hash\n        },\n        clone: function () {\n            var a = k.clone.call(this);\n            return a._hash = this._hash.clone(),\n                a\n        },\n        blockSize: 16,\n        _createHelper: function (a) {\n            return function (e, c) {\n                return a.create(c).finalize(e)\n            }\n        },\n        _createHmacHelper: function (a) {\n            return function (e, c) {\n                return d.HMAC.create(a, c).finalize(e)\n            }\n        }\n    });\n    var d = m.algo = {};\n    return m\n}(Math);\n(function () {\n        var a = CryptoJS\n            , b = a.lib.WordArray;\n        a.enc.Base64 = {\n            stringify: function (c) {\n                var k = c.words\n                    , f = c.sigBytes\n                    , h = this._map;\n                c.clamp();\n                for (var c = [], d = 0; d < f; d += 3) {\n                    for (var j = (k[d >>> 2] >>> 24 - 8 * (d % 4) & 255) << 16 | (k[d + 1 >>> 2] >>> 24 - 8 * ((d + 1) % 4) & 255) << 8 | k[d + 2 >>> 2] >>> 24 - 8 * ((d + 2) % 4) & 255, g = 0; 4 > g && d + 0.75 * g < f; g++) {\n                        c.push(h.charAt(j >>> 6 * (3 - g) & 63))\n                    }\n                }\n                if (k = h.charAt(64)) {\n                    for (; c.length % 4;) {\n                        c.push(k)\n                    }\n                }\n                return c.join(\"\")\n            },\n            parse: function (d) {\n                var d = d.replace(/\\s/g, \"\")\n                    , h = d.length\n                    , j = this._map\n                    , k = j.charAt(64);\n                k && (k = d.indexOf(k),\n                -1 != k && (h = k));\n                for (var k = [], i = 0, l = 0; l < h; l++) {\n                    if (l % 4) {\n                        var c = j.indexOf(d.charAt(l - 1)) << 2 * (l % 4)\n                            , g = j.indexOf(d.charAt(l)) >>> 6 - 2 * (l % 4);\n                        k[i >>> 2] |= (c | g) << 24 - 8 * (i % 4),\n                            i++\n                    }\n                }\n                return b.create(k, i)\n            },\n            _map: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n        }\n    }\n)(),\n    function (c) {\n        function m(a, x, q, v, f, w, u) {\n            return a = a + (x & q | ~x & v) + f + u,\n            (a << w | a >>> 32 - w) + x\n        }\n\n        function h(a, x, q, v, f, w, u) {\n            return a = a + (x & v | q & ~v) + f + u,\n            (a << w | a >>> 32 - w) + x\n        }\n\n        function k(a, x, q, v, f, w, u) {\n            return a = a + (x ^ q ^ v) + f + u,\n            (a << w | a >>> 32 - w) + x\n        }\n\n        function g(a, x, q, v, f, w, u) {\n            return a = a + (q ^ (x | ~v)) + f + u,\n            (a << w | a >>> 32 - w) + x\n        }\n\n        var l = CryptoJS\n            , j = l.lib\n            , p = j.WordArray\n            , j = j.Hasher\n            , b = l.algo\n            , d = [];\n        (function () {\n                for (var a = 0; 64 > a; a++) {\n                    d[a] = 4294967296 * c.abs(c.sin(a + 1)) | 0\n                }\n            }\n        )(),\n            b = b.MD5 = j.extend({\n                _doReset: function () {\n                    this._hash = p.create([1732584193, 4023233417, 2562383102, 271733878])\n                },\n                _doProcessBlock: function (q, v) {\n                    for (var t = 0; 16 > t; t++) {\n                        var w = v + t\n                            , f = q[w];\n                        q[w] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360\n                    }\n                    for (var w = this._hash.words, f = w[0], r = w[1], i = w[2], n = w[3], t = 0; 64 > t; t += 4) {\n                        16 > t ? (f = m(f, r, i, n, q[v + t], 7, d[t]),\n                            n = m(n, f, r, i, q[v + t + 1], 12, d[t + 1]),\n                            i = m(i, n, f, r, q[v + t + 2], 17, d[t + 2]),\n                            r = m(r, i, n, f, q[v + t + 3], 22, d[t + 3])) : 32 > t ? (f = h(f, r, i, n, q[v + (t + 1) % 16], 5, d[t]),\n                            n = h(n, f, r, i, q[v + (t + 6) % 16], 9, d[t + 1]),\n                            i = h(i, n, f, r, q[v + (t + 11) % 16], 14, d[t + 2]),\n                            r = h(r, i, n, f, q[v + t % 16], 20, d[t + 3])) : 48 > t ? (f = k(f, r, i, n, q[v + (3 * t + 5) % 16], 4, d[t]),\n                            n = k(n, f, r, i, q[v + (3 * t + 8) % 16], 11, d[t + 1]),\n                            i = k(i, n, f, r, q[v + (3 * t + 11) % 16], 16, d[t + 2]),\n                            r = k(r, i, n, f, q[v + (3 * t + 14) % 16], 23, d[t + 3])) : (f = g(f, r, i, n, q[v + 3 * t % 16], 6, d[t]),\n                            n = g(n, f, r, i, q[v + (3 * t + 7) % 16], 10, d[t + 1]),\n                            i = g(i, n, f, r, q[v + (3 * t + 14) % 16], 15, d[t + 2]),\n                            r = g(r, i, n, f, q[v + (3 * t + 5) % 16], 21, d[t + 3]))\n                    }\n                    w[0] = w[0] + f | 0,\n                        w[1] = w[1] + r | 0,\n                        w[2] = w[2] + i | 0,\n                        w[3] = w[3] + n | 0\n                },\n                _doFinalize: function () {\n                    var a = this._data\n                        , o = a.words\n                        , f = 8 * this._nDataBytes\n                        , i = 8 * a.sigBytes;\n                    o[i >>> 5] |= 128 << 24 - i % 32,\n                        o[(i + 64 >>> 9 << 4) + 14] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360,\n                        a.sigBytes = 4 * (o.length + 1),\n                        this._process(),\n                        a = this._hash.words;\n                    for (o = 0; 4 > o; o++) {\n                        f = a[o],\n                            a[o] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360\n                    }\n                }\n            }),\n            l.MD5 = j._createHelper(b),\n            l.HmacMD5 = j._createHmacHelper(b)\n    }(Math),\n    function () {\n        var a = CryptoJS\n            , f = a.lib\n            , c = f.Base\n            , d = f.WordArray\n            , f = a.algo\n            , b = f.EvpKDF = c.extend({\n            cfg: c.extend({\n                keySize: 4,\n                hasher: f.MD5,\n                iterations: 1\n            }),\n            init: function (g) {\n                this.cfg = this.cfg.extend(g)\n            },\n            compute: function (h, q) {\n                for (var l = this.cfg, k = l.hasher.create(), p = d.create(), m = p.words, r = l.keySize, l = l.iterations; m.length < r;) {\n                    g && k.update(g);\n                    var g = k.update(h).finalize(q);\n                    k.reset();\n                    for (var j = 1; j < l; j++) {\n                        g = k.finalize(g),\n                            k.reset()\n                    }\n                    p.concat(g)\n                }\n                return p.sigBytes = 4 * r,\n                    p\n            }\n        });\n        a.EvpKDF = function (g, i, h) {\n            return b.create(h).compute(g, i)\n        }\n    }(),\nCryptoJS.lib.Cipher || function (k) {\n    var C = CryptoJS\n        , x = C.lib\n        , A = x.Base\n        , v = x.WordArray\n        , B = x.BufferedBlockAlgorithm\n        , y = C.enc.Base64\n        , D = C.algo.EvpKDF\n        , b = x.Cipher = B.extend({\n        cfg: A.extend(),\n        createEncryptor: function (a, c) {\n            return this.create(this._ENC_XFORM_MODE, a, c)\n        },\n        createDecryptor: function (a, c) {\n            return this.create(this._DEC_XFORM_MODE, a, c)\n        },\n        init: function (a, d, c) {\n            this.cfg = this.cfg.extend(c),\n                this._xformMode = a,\n                this._key = d,\n                this.reset()\n        },\n        reset: function () {\n            B.reset.call(this),\n                this._doReset()\n        },\n        process: function (a) {\n            return this._append(a),\n                this._process()\n        },\n        finalize: function (a) {\n            return a && this._append(a),\n                this._doFinalize()\n        },\n        keySize: 4,\n        ivSize: 4,\n        _ENC_XFORM_MODE: 1,\n        _DEC_XFORM_MODE: 2,\n        _createHelper: function () {\n            return function (a) {\n                return {\n                    encrypt: function (e, c, d) {\n                        return (\"string\" == typeof c ? j : z).encrypt(a, e, c, d)\n                    },\n                    decrypt: function (e, c, d) {\n                        return (\"string\" == typeof c ? j : z).decrypt(a, e, c, d)\n                    }\n                }\n            }\n        }()\n    });\n    x.StreamCipher = b.extend({\n        _doFinalize: function () {\n            return this._process(!0)\n        },\n        blockSize: 1\n    });\n    var m = C.mode = {}\n        , w = x.BlockCipherMode = A.extend({\n        createEncryptor: function (a, c) {\n            return this.Encryptor.create(a, c)\n        },\n        createDecryptor: function (a, c) {\n            return this.Decryptor.create(a, c)\n        },\n        init: function (a, c) {\n            this._cipher = a,\n                this._iv = c\n        }\n    })\n        , m = m.CBC = function () {\n        function c(l, e, f) {\n            var d = this._iv;\n            d ? this._iv = k : d = this._prevBlock;\n            for (var h = 0; h < f; h++) {\n                l[e + h] ^= d[h]\n            }\n        }\n\n        var a = w.extend();\n        return a.Encryptor = a.extend({\n            processBlock: function (d, h) {\n                var l = this._cipher\n                    , f = l.blockSize;\n                c.call(this, d, h, f),\n                    l.encryptBlock(d, h),\n                    this._prevBlock = d.slice(h, h + f)\n            }\n        }),\n            a.Decryptor = a.extend({\n                processBlock: function (d, h) {\n                    var l = this._cipher\n                        , f = l.blockSize\n                        , o = d.slice(h, h + f);\n                    l.decryptBlock(d, h),\n                        c.call(this, d, h, f),\n                        this._prevBlock = o\n                }\n            }),\n            a\n    }()\n        , g = (C.pad = {}).Pkcs7 = {\n        pad: function (a, i) {\n            for (var c = 4 * i, c = c - a.sigBytes % c, f = c << 24 | c << 16 | c << 8 | c, h = [], d = 0; d < c; d += 4) {\n                h.push(f)\n            }\n            c = v.create(h, c),\n                a.concat(c)\n        },\n        unpad: function (a) {\n            a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255\n        }\n    };\n    x.BlockCipher = b.extend({\n        cfg: b.cfg.extend({\n            mode: m,\n            padding: g\n        }),\n        reset: function () {\n            b.reset.call(this);\n            var a = this.cfg\n                , d = a.iv\n                , a = a.mode;\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                var c = a.createEncryptor\n            } else {\n                c = a.createDecryptor,\n                    this._minBufferSize = 1\n            }\n            this._mode = c.call(a, this, d && d.words)\n        },\n        _doProcessBlock: function (a, c) {\n            this._mode.processBlock(a, c)\n        },\n        _doFinalize: function () {\n            var a = this.cfg.padding;\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                a.pad(this._data, this.blockSize);\n                var c = this._process(!0)\n            } else {\n                c = this._process(!0),\n                    a.unpad(c)\n            }\n            return c\n        },\n        blockSize: 4\n    });\n    var q = x.CipherParams = A.extend({\n        init: function (a) {\n            this.mixIn(a)\n        },\n        toString: function (a) {\n            return (a || this.formatter).stringify(this)\n        }\n    })\n        , m = (C.format = {}).OpenSSL = {\n        stringify: function (a) {\n            var c = a.ciphertext\n                , a = a.salt\n                , c = (a ? v.create([1398893684, 1701076831]).concat(a).concat(c) : c).toString(y);\n            return c = c.replace(/(.{64})/g, \"$1\\n\")\n        },\n        parse: function (a) {\n            var a = y.parse(a)\n                , d = a.words;\n            if (1398893684 == d[0] && 1701076831 == d[1]) {\n                var c = v.create(d.slice(2, 4));\n                d.splice(0, 4),\n                    a.sigBytes -= 16\n            }\n            return q.create({\n                ciphertext: a,\n                salt: c\n            })\n        }\n    }\n        , z = x.SerializableCipher = A.extend({\n        cfg: A.extend({\n            format: m\n        }),\n        encrypt: function (a, h, d, f) {\n            var f = this.cfg.extend(f)\n                , c = a.createEncryptor(d, f)\n                , h = c.finalize(h)\n                , c = c.cfg;\n            return q.create({\n                ciphertext: h,\n                key: d,\n                iv: c.iv,\n                algorithm: a,\n                mode: c.mode,\n                padding: c.padding,\n                blockSize: a.blockSize,\n                formatter: f.format\n            })\n        },\n        decrypt: function (a, f, c, d) {\n            return d = this.cfg.extend(d),\n                f = this._parse(f, d.format),\n                a.createDecryptor(c, d).finalize(f.ciphertext)\n        },\n        _parse: function (a, c) {\n            return \"string\" == typeof a ? c.parse(a) : a\n        }\n    })\n        , C = (C.kdf = {}).OpenSSL = {\n        compute: function (a, f, c, d) {\n            return d || (d = v.random(8)),\n                a = D.create({\n                    keySize: f + c\n                }).compute(a, d),\n                c = v.create(a.words.slice(f), 4 * c),\n                a.sigBytes = 4 * f,\n                q.create({\n                    key: a,\n                    iv: c,\n                    salt: d\n                })\n        }\n    }\n        , j = x.PasswordBasedCipher = z.extend({\n        cfg: z.cfg.extend({\n            kdf: C\n        }),\n        encrypt: function (a, f, c, d) {\n            return d = this.cfg.extend(d),\n                c = d.kdf.compute(c, a.keySize, a.ivSize),\n                d.iv = c.iv,\n                a = z.encrypt.call(this, a, f, c.key, d),\n                a.mixIn(c),\n                a\n        },\n        decrypt: function (a, f, c, d) {\n            return d = this.cfg.extend(d),\n                f = this._parse(f, d.format),\n                c = d.kdf.compute(c, a.keySize, a.ivSize, f.salt),\n                d.iv = c.iv,\n                z.decrypt.call(this, a, f, c.key, d)\n        }\n    })\n}(),\n    function () {\n        function g(a, f) {\n            var c = (this._lBlock >>> a ^ this._rBlock) & f;\n            this._rBlock ^= c,\n                this._lBlock ^= c << a\n        }\n\n        function w(a, f) {\n            var c = (this._rBlock >>> a ^ this._lBlock) & f;\n            this._lBlock ^= c,\n                this._rBlock ^= c << a\n        }\n\n        var m = CryptoJS\n            , q = m.lib\n            , j = q.WordArray\n            , q = q.BlockCipher\n            , v = m.algo\n            ,\n            p = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]\n            ,\n            x = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]\n            , b = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]\n            , h = [{\n                0: 8421888,\n                268435456: 32768,\n                536870912: 8421378,\n                805306368: 2,\n                1073741824: 512,\n                1342177280: 8421890,\n                1610612736: 8389122,\n                1879048192: 8388608,\n                2147483648: 514,\n                2415919104: 8389120,\n                2684354560: 33280,\n                2952790016: 8421376,\n                3221225472: 32770,\n                3489660928: 8388610,\n                3758096384: 0,\n                4026531840: 33282,\n                134217728: 0,\n                402653184: 8421890,\n                671088640: 33282,\n                939524096: 32768,\n                1207959552: 8421888,\n                1476395008: 512,\n                1744830464: 8421378,\n                2013265920: 2,\n                2281701376: 8389120,\n                2550136832: 33280,\n                2818572288: 8421376,\n                3087007744: 8389122,\n                3355443200: 8388610,\n                3623878656: 32770,\n                3892314112: 514,\n                4160749568: 8388608,\n                1: 32768,\n                268435457: 2,\n                536870913: 8421888,\n                805306369: 8388608,\n                1073741825: 8421378,\n                1342177281: 33280,\n                1610612737: 512,\n                1879048193: 8389122,\n                2147483649: 8421890,\n                2415919105: 8421376,\n                2684354561: 8388610,\n                2952790017: 33282,\n                3221225473: 514,\n                3489660929: 8389120,\n                3758096385: 32770,\n                4026531841: 0,\n                134217729: 8421890,\n                402653185: 8421376,\n                671088641: 8388608,\n                939524097: 512,\n                1207959553: 32768,\n                1476395009: 8388610,\n                1744830465: 2,\n                2013265921: 33282,\n                2281701377: 32770,\n                2550136833: 8389122,\n                2818572289: 514,\n                3087007745: 8421888,\n                3355443201: 8389120,\n                3623878657: 0,\n                3892314113: 33280,\n                4160749569: 8421378\n            }, {\n                0: 1074282512,\n                16777216: 16384,\n                33554432: 524288,\n                50331648: 1074266128,\n                67108864: 1073741840,\n                83886080: 1074282496,\n                100663296: 1073758208,\n                117440512: 16,\n                134217728: 540672,\n                150994944: 1073758224,\n                167772160: 1073741824,\n                184549376: 540688,\n                201326592: 524304,\n                218103808: 0,\n                234881024: 16400,\n                251658240: 1074266112,\n                8388608: 1073758208,\n                25165824: 540688,\n                41943040: 16,\n                58720256: 1073758224,\n                75497472: 1074282512,\n                92274688: 1073741824,\n                109051904: 524288,\n                125829120: 1074266128,\n                142606336: 524304,\n                159383552: 0,\n                176160768: 16384,\n                192937984: 1074266112,\n                209715200: 1073741840,\n                226492416: 540672,\n                243269632: 1074282496,\n                260046848: 16400,\n                268435456: 0,\n                285212672: 1074266128,\n                301989888: 1073758224,\n                318767104: 1074282496,\n                335544320: 1074266112,\n                352321536: 16,\n                369098752: 540688,\n                385875968: 16384,\n                402653184: 16400,\n                419430400: 524288,\n                436207616: 524304,\n                452984832: 1073741840,\n                469762048: 540672,\n                486539264: 1073758208,\n                503316480: 1073741824,\n                520093696: 1074282512,\n                276824064: 540688,\n                293601280: 524288,\n                310378496: 1074266112,\n                327155712: 16384,\n                343932928: 1073758208,\n                360710144: 1074282512,\n                377487360: 16,\n                394264576: 1073741824,\n                411041792: 1074282496,\n                427819008: 1073741840,\n                444596224: 1073758224,\n                461373440: 524304,\n                478150656: 0,\n                494927872: 16400,\n                511705088: 1074266128,\n                528482304: 540672\n            }, {\n                0: 260,\n                1048576: 0,\n                2097152: 67109120,\n                3145728: 65796,\n                4194304: 65540,\n                5242880: 67108868,\n                6291456: 67174660,\n                7340032: 67174400,\n                8388608: 67108864,\n                9437184: 67174656,\n                10485760: 65792,\n                11534336: 67174404,\n                12582912: 67109124,\n                13631488: 65536,\n                14680064: 4,\n                15728640: 256,\n                524288: 67174656,\n                1572864: 67174404,\n                2621440: 0,\n                3670016: 67109120,\n                4718592: 67108868,\n                5767168: 65536,\n                6815744: 65540,\n                7864320: 260,\n                8912896: 4,\n                9961472: 256,\n                11010048: 67174400,\n                12058624: 65796,\n                13107200: 65792,\n                14155776: 67109124,\n                15204352: 67174660,\n                16252928: 67108864,\n                16777216: 67174656,\n                17825792: 65540,\n                18874368: 65536,\n                19922944: 67109120,\n                20971520: 256,\n                22020096: 67174660,\n                23068672: 67108868,\n                24117248: 0,\n                25165824: 67109124,\n                26214400: 67108864,\n                27262976: 4,\n                28311552: 65792,\n                29360128: 67174400,\n                30408704: 260,\n                31457280: 65796,\n                32505856: 67174404,\n                17301504: 67108864,\n                18350080: 260,\n                19398656: 67174656,\n                20447232: 0,\n                21495808: 65540,\n                22544384: 67109120,\n                23592960: 256,\n                24641536: 67174404,\n                25690112: 65536,\n                26738688: 67174660,\n                27787264: 65796,\n                28835840: 67108868,\n                29884416: 67109124,\n                30932992: 67174400,\n                31981568: 4,\n                33030144: 65792\n            }, {\n                0: 2151682048,\n                65536: 2147487808,\n                131072: 4198464,\n                196608: 2151677952,\n                262144: 0,\n                327680: 4198400,\n                393216: 2147483712,\n                458752: 4194368,\n                524288: 2147483648,\n                589824: 4194304,\n                655360: 64,\n                720896: 2147487744,\n                786432: 2151678016,\n                851968: 4160,\n                917504: 4096,\n                983040: 2151682112,\n                32768: 2147487808,\n                98304: 64,\n                163840: 2151678016,\n                229376: 2147487744,\n                294912: 4198400,\n                360448: 2151682112,\n                425984: 0,\n                491520: 2151677952,\n                557056: 4096,\n                622592: 2151682048,\n                688128: 4194304,\n                753664: 4160,\n                819200: 2147483648,\n                884736: 4194368,\n                950272: 4198464,\n                1015808: 2147483712,\n                1048576: 4194368,\n                1114112: 4198400,\n                1179648: 2147483712,\n                1245184: 0,\n                1310720: 4160,\n                1376256: 2151678016,\n                1441792: 2151682048,\n                1507328: 2147487808,\n                1572864: 2151682112,\n                1638400: 2147483648,\n                1703936: 2151677952,\n                1769472: 4198464,\n                1835008: 2147487744,\n                1900544: 4194304,\n                1966080: 64,\n                2031616: 4096,\n                1081344: 2151677952,\n                1146880: 2151682112,\n                1212416: 0,\n                1277952: 4198400,\n                1343488: 4194368,\n                1409024: 2147483648,\n                1474560: 2147487808,\n                1540096: 64,\n                1605632: 2147483712,\n                1671168: 4096,\n                1736704: 2147487744,\n                1802240: 2151678016,\n                1867776: 4160,\n                1933312: 2151682048,\n                1998848: 4194304,\n                2064384: 4198464\n            }, {\n                0: 128,\n                4096: 17039360,\n                8192: 262144,\n                12288: 536870912,\n                16384: 537133184,\n                20480: 16777344,\n                24576: 553648256,\n                28672: 262272,\n                32768: 16777216,\n                36864: 537133056,\n                40960: 536871040,\n                45056: 553910400,\n                49152: 553910272,\n                53248: 0,\n                57344: 17039488,\n                61440: 553648128,\n                2048: 17039488,\n                6144: 553648256,\n                10240: 128,\n                14336: 17039360,\n                18432: 262144,\n                22528: 537133184,\n                26624: 553910272,\n                30720: 536870912,\n                34816: 537133056,\n                38912: 0,\n                43008: 553910400,\n                47104: 16777344,\n                51200: 536871040,\n                55296: 553648128,\n                59392: 16777216,\n                63488: 262272,\n                65536: 262144,\n                69632: 128,\n                73728: 536870912,\n                77824: 553648256,\n                81920: 16777344,\n                86016: 553910272,\n                90112: 537133184,\n                94208: 16777216,\n                98304: 553910400,\n                102400: 553648128,\n                106496: 17039360,\n                110592: 537133056,\n                114688: 262272,\n                118784: 536871040,\n                122880: 0,\n                126976: 17039488,\n                67584: 553648256,\n                71680: 16777216,\n                75776: 17039360,\n                79872: 537133184,\n                83968: 536870912,\n                88064: 17039488,\n                92160: 128,\n                96256: 553910272,\n                100352: 262272,\n                104448: 553910400,\n                108544: 0,\n                112640: 553648128,\n                116736: 16777344,\n                120832: 262144,\n                124928: 537133056,\n                129024: 536871040\n            }, {\n                0: 268435464,\n                256: 8192,\n                512: 270532608,\n                768: 270540808,\n                1024: 268443648,\n                1280: 2097152,\n                1536: 2097160,\n                1792: 268435456,\n                2048: 0,\n                2304: 268443656,\n                2560: 2105344,\n                2816: 8,\n                3072: 270532616,\n                3328: 2105352,\n                3584: 8200,\n                3840: 270540800,\n                128: 270532608,\n                384: 270540808,\n                640: 8,\n                896: 2097152,\n                1152: 2105352,\n                1408: 268435464,\n                1664: 268443648,\n                1920: 8200,\n                2176: 2097160,\n                2432: 8192,\n                2688: 268443656,\n                2944: 270532616,\n                3200: 0,\n                3456: 270540800,\n                3712: 2105344,\n                3968: 268435456,\n                4096: 268443648,\n                4352: 270532616,\n                4608: 270540808,\n                4864: 8200,\n                5120: 2097152,\n                5376: 268435456,\n                5632: 268435464,\n                5888: 2105344,\n                6144: 2105352,\n                6400: 0,\n                6656: 8,\n                6912: 270532608,\n                7168: 8192,\n                7424: 268443656,\n                7680: 270540800,\n                7936: 2097160,\n                4224: 8,\n                4480: 2105344,\n                4736: 2097152,\n                4992: 268435464,\n                5248: 268443648,\n                5504: 8200,\n                5760: 270540808,\n                6016: 270532608,\n                6272: 270540800,\n                6528: 270532616,\n                6784: 8192,\n                7040: 2105352,\n                7296: 2097160,\n                7552: 0,\n                7808: 268435456,\n                8064: 268443656\n            }, {\n                0: 1048576,\n                16: 33555457,\n                32: 1024,\n                48: 1049601,\n                64: 34604033,\n                80: 0,\n                96: 1,\n                112: 34603009,\n                128: 33555456,\n                144: 1048577,\n                160: 33554433,\n                176: 34604032,\n                192: 34603008,\n                208: 1025,\n                224: 1049600,\n                240: 33554432,\n                8: 34603009,\n                24: 0,\n                40: 33555457,\n                56: 34604032,\n                72: 1048576,\n                88: 33554433,\n                104: 33554432,\n                120: 1025,\n                136: 1049601,\n                152: 33555456,\n                168: 34603008,\n                184: 1048577,\n                200: 1024,\n                216: 34604033,\n                232: 1,\n                248: 1049600,\n                256: 33554432,\n                272: 1048576,\n                288: 33555457,\n                304: 34603009,\n                320: 1048577,\n                336: 33555456,\n                352: 34604032,\n                368: 1049601,\n                384: 1025,\n                400: 34604033,\n                416: 1049600,\n                432: 1,\n                448: 0,\n                464: 34603008,\n                480: 33554433,\n                496: 1024,\n                264: 1049600,\n                280: 33555457,\n                296: 34603009,\n                312: 1,\n                328: 33554432,\n                344: 1048576,\n                360: 1025,\n                376: 34604032,\n                392: 33554433,\n                408: 34603008,\n                424: 0,\n                440: 34604033,\n                456: 1049601,\n                472: 1024,\n                488: 33555456,\n                504: 1048577\n            }, {\n                0: 134219808,\n                1: 131072,\n                2: 134217728,\n                3: 32,\n                4: 131104,\n                5: 134350880,\n                6: 134350848,\n                7: 2048,\n                8: 134348800,\n                9: 134219776,\n                10: 133120,\n                11: 134348832,\n                12: 2080,\n                13: 0,\n                14: 134217760,\n                15: 133152,\n                2147483648: 2048,\n                2147483649: 134350880,\n                2147483650: 134219808,\n                2147483651: 134217728,\n                2147483652: 134348800,\n                2147483653: 133120,\n                2147483654: 133152,\n                2147483655: 32,\n                2147483656: 134217760,\n                2147483657: 2080,\n                2147483658: 131104,\n                2147483659: 134350848,\n                2147483660: 0,\n                2147483661: 134348832,\n                2147483662: 134219776,\n                2147483663: 131072,\n                16: 133152,\n                17: 134350848,\n                18: 32,\n                19: 2048,\n                20: 134219776,\n                21: 134217760,\n                22: 134348832,\n                23: 131072,\n                24: 0,\n                25: 131104,\n                26: 134348800,\n                27: 134219808,\n                28: 134350880,\n                29: 133120,\n                30: 2080,\n                31: 134217728,\n                2147483664: 131072,\n                2147483665: 2048,\n                2147483666: 134348832,\n                2147483667: 133152,\n                2147483668: 32,\n                2147483669: 134348800,\n                2147483670: 134217728,\n                2147483671: 134219808,\n                2147483672: 134350880,\n                2147483673: 134217760,\n                2147483674: 134219776,\n                2147483675: 0,\n                2147483676: 133120,\n                2147483677: 2080,\n                2147483678: 131104,\n                2147483679: 134350848\n            }]\n            , k = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679]\n            , d = v.DES = q.extend({\n                _doReset: function () {\n                    for (var a = this._key.words, u = [], f = 0; 56 > f; f++) {\n                        var l = p[f] - 1;\n                        u[f] = a[l >>> 5] >>> 31 - l % 32 & 1\n                    }\n                    a = this._subKeys = [];\n                    for (l = 0; 16 > l; l++) {\n                        for (var c = a[l] = [], o = b[l], f = 0; 24 > f; f++) {\n                            c[f / 6 | 0] |= u[(x[f] - 1 + o) % 28] << 31 - f % 6,\n                                c[4 + (f / 6 | 0)] |= u[28 + (x[f + 24] - 1 + o) % 28] << 31 - f % 6\n                        }\n                        c[0] = c[0] << 1 | c[0] >>> 31;\n                        for (f = 1; 7 > f; f++) {\n                            c[f] >>>= 4 * (f - 1) + 3\n                        }\n                        c[7] = c[7] << 5 | c[7] >>> 27\n                    }\n                    u = this._invSubKeys = [];\n                    for (f = 0; 16 > f; f++) {\n                        u[f] = a[15 - f]\n                    }\n                },\n                encryptBlock: function (a, c) {\n                    this._doCryptBlock(a, c, this._subKeys)\n                },\n                decryptBlock: function (a, c) {\n                    this._doCryptBlock(a, c, this._invSubKeys)\n                },\n                _doCryptBlock: function (y, A, t) {\n                    this._lBlock = y[A],\n                        this._rBlock = y[A + 1],\n                        g.call(this, 4, 252645135),\n                        g.call(this, 16, 65535),\n                        w.call(this, 2, 858993459),\n                        w.call(this, 8, 16711935),\n                        g.call(this, 1, 1431655765);\n                    for (var B = 0; 16 > B; B++) {\n                        for (var z = t[B], C = this._lBlock, e = this._rBlock, f = 0, l = 0; 8 > l; l++) {\n                            f |= h[l][((e ^ z[l]) & k[l]) >>> 0]\n                        }\n                        this._lBlock = e,\n                            this._rBlock = C ^ f\n                    }\n                    t = this._lBlock,\n                        this._lBlock = this._rBlock,\n                        this._rBlock = t,\n                        g.call(this, 1, 1431655765),\n                        w.call(this, 8, 16711935),\n                        w.call(this, 2, 858993459),\n                        g.call(this, 16, 65535),\n                        g.call(this, 4, 252645135),\n                        y[A] = this._lBlock,\n                        y[A + 1] = this._rBlock\n                },\n                keySize: 2,\n                ivSize: 2,\n                blockSize: 2\n            });\n        m.DES = q._createHelper(d),\n            v = v.TripleDES = q.extend({\n                _doReset: function () {\n                    var a = this._key.words;\n                    this._des1 = d.createEncryptor(j.create(a.slice(0, 2))),\n                        this._des2 = d.createEncryptor(j.create(a.slice(2, 4))),\n                        this._des3 = d.createEncryptor(j.create(a.slice(4, 6)))\n                },\n                encryptBlock: function (a, c) {\n                    this._des1.encryptBlock(a, c),\n                        this._des2.decryptBlock(a, c),\n                        this._des3.encryptBlock(a, c)\n                },\n                decryptBlock: function (a, c) {\n                    this._des3.decryptBlock(a, c),\n                        this._des2.encryptBlock(a, c),\n                        this._des1.decryptBlock(a, c)\n                },\n                keySize: 6,\n                ivSize: 2,\n                blockSize: 2\n            }),\n            m.TripleDES = q._createHelper(v)\n    }(),\n    CryptoJS.mode.ECB = function () {\n        var a = CryptoJS.lib.BlockCipherMode.extend();\n        return a.Encryptor = a.extend({\n            processBlock: function (b, c) {\n                this._cipher.encryptBlock(b, c)\n            }\n        }),\n            a.Decryptor = a.extend({\n                processBlock: function (b, c) {\n                    this._cipher.decryptBlock(b, c)\n                }\n            }),\n            a\n    }();\n\nfunction get_pwd(a) {\n    var c = CryptoJS.enc.Utf8.parse(\"20161216\")\n        , b = CryptoJS.DES.encrypt(a, c, {\n        mode: CryptoJS.mode.ECB,\n        padding: CryptoJS.pad.Pkcs7\n    });\n    return b.ciphertext.toString()\n}"
  },
  {
    "path": "其他实战/【时光网】登陆参数生成/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-11  Python: 3.7\nimport execjs.runtime_names\n\n\nclass MTime:\n    \"\"\"\n    时光网登陆，password 加密解析\n    https://m.mtime.cn/#!/member/signin\n    \"\"\"\n    def __init__(self, name, pwd):\n        self.name = name\n        self.pwd = pwd\n        self.url = 'https://m.mtime.cn/Service/callback-comm.mi/user/login.api'\n        self.js = None\n        self.init_js()\n\n    def init_js(self):\n        print('引擎', execjs.get().name)\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def make_pwd(self):\n        print(self.js.call('get_pwd', self.pwd))\n\n\nif __name__ == '__main__':\n    username = input('请输入用户名')\n    password = input('输入密码')\n    mt = MTime(username, password)\n    mt.make_pwd()\n"
  },
  {
    "path": "其他实战/【易通贷】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【易通贷】自动登录/auto_login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-26  Python: 3.7\n\nimport requests\nimport execjs.runtime_names\n\n\nclass YDT(object):\n    \"\"\"\n    易通贷自动登陆\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.url = 'https://app.etongdai.com/login/verifylogin'\n        print('引擎', execjs.get().name)\n\n    @staticmethod\n    def make_pwd(pwd):\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            ctx = execjs.compile(f.read())\n        return ctx.call(\"make_js\", pwd)\n\n    def make_data(self):\n        data = {\n            'loginName': self.user,\n            'check': 'on',\n            'next': 'null',\n            'password': self.make_pwd(self.pwd),\n        }\n\n        return data\n\n    def login(self):\n        data = self.make_data()\n        response = requests.post(self.url, data=data)\n        data = response.content.decode('utf-8')\n        print(data)\n\n\nif __name__ == '__main__':\n    username = input('请输入 易通贷账号')\n    password = input('请输入 易通贷密码')\n    ydt = YDT(username, password)\n    ydt.login()\n\n\n"
  },
  {
    "path": "其他实战/【易通贷】自动登录/encryp.js",
    "content": "var hexcase = 0;\nvar b64pad = \"\";\nvar chrsz = 8;\n\nfunction hex_md5(s) {\n    return binl2hex(core_md5(str2binl(s), s.length * chrsz));\n}\n\nfunction b64_md5(s) {\n    return binl2b64(core_md5(str2binl(s), s.length * chrsz));\n}\n\nfunction hex_hmac_md5(key, data) {\n    return binl2hex(core_hmac_md5(key, data));\n}\n\nfunction b64_hmac_md5(key, data) {\n    return binl2b64(core_hmac_md5(key, data));\n}\n\nfunction calcMD5(s) {\n    return binl2hex(core_md5(str2binl(s), s.length * chrsz));\n}\n\nfunction md5_vm_test() {\n    return hex_md5(\"abc\") == \"900150983cd24fb0d6963f7d28e17f72\";\n}\n\nfunction core_md5(x, len) {\n\n    x[len >> 5] |= 0x80 << ((len) % 32);\n    x[(((len + 64) >>> 9) << 4) + 14] = len;\n    var a = 1732584193;\n    var b = -271733879;\n    var c = -1732584194;\n    var d = 271733878;\n    for (var i = 0; i < x.length; i += 16) {\n        var olda = a;\n        var oldb = b;\n        var oldc = c;\n        var oldd = d;\n\n        a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);\n        d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);\n        c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);\n        b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);\n        a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);\n        d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);\n        c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);\n        b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);\n        a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);\n        d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);\n        c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);\n        b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);\n        a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);\n        d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);\n        c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);\n        b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);\n        a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);\n        d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);\n        c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);\n        b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);\n        a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);\n        d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);\n        c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);\n        b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);\n        a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);\n        d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);\n        c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);\n        b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);\n        a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);\n        d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);\n        c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);\n        b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);\n        a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);\n        d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);\n        c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);\n        b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);\n        a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);\n        d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);\n        c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);\n        b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);\n        a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);\n        d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);\n        c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);\n        b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);\n        a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);\n        d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);\n        c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);\n        b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);\n        a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);\n        d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);\n        c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);\n        b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);\n        a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);\n        d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);\n        c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);\n        b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);\n        a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);\n        d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);\n        c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);\n        b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);\n        a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);\n        d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);\n        c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);\n        b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);\n\n        a = safe_add(a, olda);\n        b = safe_add(b, oldb);\n        c = safe_add(c, oldc);\n        d = safe_add(d, oldd);\n    }\n    return Array(a, b, c, d);\n\n}\n\nfunction md5_cmn(q, a, b, x, s, t) {\n    return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);\n}\n\nfunction md5_ff(a, b, c, d, x, s, t) {\n    return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);\n}\n\nfunction md5_gg(a, b, c, d, x, s, t) {\n    return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);\n}\n\nfunction md5_hh(a, b, c, d, x, s, t) {\n    return md5_cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5_ii(a, b, c, d, x, s, t) {\n    return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);\n}\n\nfunction core_hmac_md5(key, data) {\n    var bkey = str2binl(key);\n    if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);\n\n    var ipad = Array(16),\n        opad = Array(16);\n    for (var i = 0; i < 16; i++) {\n        ipad[i] = bkey[i] ^ 0x36363636;\n        opad[i] = bkey[i] ^ 0x5C5C5C5C;\n    }\n\n    var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);\n    return core_md5(opad.concat(hash), 512 + 128);\n}\n\nfunction safe_add(x, y) {\n    var lsw = (x & 0xFFFF) + (y & 0xFFFF);\n    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n    return (msw << 16) | (lsw & 0xFFFF);\n}\n\nfunction bit_rol(num, cnt) {\n    return (num << cnt) | (num >>> (32 - cnt));\n}\n\nfunction str2binl(str) {\n    var bin = Array();\n    var mask = (1 << chrsz) - 1;\n    for (var i = 0; i < str.length * chrsz; i += chrsz)\n        bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);\n    return bin;\n}\n\nfunction binl2hex(binarray) {\n    var hex_tab = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\n    var str = \"\";\n    for (var i = 0; i < binarray.length * 4; i++) {\n        str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +\n            hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);\n    }\n    return str;\n}\n\nfunction binl2b64(binarray) {\n    var tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var str = \"\";\n    for (var i = 0; i < binarray.length * 4; i += 3) {\n        var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) |\n            (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) |\n            ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);\n        for (var j = 0; j < 4; j++) {\n            if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;\n            else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);\n        }\n    }\n    return str;\n}\n\nfunction make_js(pwd) {\n    var passwd = hex_md5(pwd + 's^H8').toUpperCase();\n    return hex_md5(passwd.substring(0, 5) + passwd).toUpperCase();\n}"
  },
  {
    "path": "其他实战/【汽车之家】参数解密/execute.js",
    "content": "var hexcase = 0;\r\nvar b64pad = \"\";\r\nvar chrsz = 8;\r\nfunction hex_md5(a) {\r\n    return binl2hex(core_md5(str2binl(a), a.length * chrsz))\r\n}\r\nfunction b64_md5(a) {\r\n    return binl2b64(core_md5(str2binl(a), a.length * chrsz))\r\n}\r\nfunction hex_hmac_md5(a, b) {\r\n    return binl2hex(core_hmac_md5(a, b))\r\n}\r\nfunction b64_hmac_md5(a, b) {\r\n    return binl2b64(core_hmac_md5(a, b))\r\n}\r\nfunction calcMD5(a) {\r\n    return binl2hex(core_md5(str2binl(a), a.length * chrsz))\r\n}\r\nfunction md5_vm_test() {\r\n    return hex_md5(\"abc\") == \"900150983cd24fb0d6963f7d28e17f72\"\r\n}\r\nfunction core_md5(p, k) {\r\n    p[k >> 5] |= 128 << ((k) % 32);\r\n    p[(((k + 64) >>> 9) << 4) + 14] = k;\r\n    var o = 1732584193;\r\n    var n = -271733879;\r\n    var m = -1732584194;\r\n    var l = 271733878;\r\n    for (var g = 0; g < p.length; g += 16) {\r\n        var j = o;\r\n        var h = n;\r\n        var f = m;\r\n        var e = l;\r\n        o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936);\r\n        l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);\r\n        m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);\r\n        n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);\r\n        o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);\r\n        l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);\r\n        m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);\r\n        n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);\r\n        o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);\r\n        l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);\r\n        m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);\r\n        n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);\r\n        o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682);\r\n        l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);\r\n        m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);\r\n        n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);\r\n        o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);\r\n        l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);\r\n        m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);\r\n        n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);\r\n        o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);\r\n        l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);\r\n        m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);\r\n        n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);\r\n        o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);\r\n        l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);\r\n        m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);\r\n        n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);\r\n        o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);\r\n        l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);\r\n        m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);\r\n        n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734);\r\n        o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);\r\n        l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);\r\n        m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);\r\n        n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);\r\n        o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);\r\n        l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);\r\n        m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);\r\n        n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);\r\n        o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);\r\n        l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);\r\n        m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979);\r\n        n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);\r\n        o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);\r\n        l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);\r\n        m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);\r\n        n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);\r\n        o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);\r\n        l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415);\r\n        m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);\r\n        n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);\r\n        o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);\r\n        l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606);\r\n        m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);\r\n        n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);\r\n        o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);\r\n        l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);\r\n        m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);\r\n        n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);\r\n        o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);\r\n        l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);\r\n        m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);\r\n        n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);\r\n        o = safe_add(o, j);\r\n        n = safe_add(n, h);\r\n        m = safe_add(m, f);\r\n        l = safe_add(l, e)\r\n    }\r\n    return Array(o, n, m, l)\r\n}\r\nfunction md5_cmn(h, e, d, c, g, f) {\r\n    return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)\r\n}\r\nfunction md5_ff(g, f, k, j, e, i, h) {\r\n    return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)\r\n}\r\nfunction md5_gg(g, f, k, j, e, i, h) {\r\n    return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)\r\n}\r\nfunction md5_hh(g, f, k, j, e, i, h) {\r\n    return md5_cmn(f ^ k ^ j, g, f, e, i, h)\r\n}\r\nfunction md5_ii(g, f, k, j, e, i, h) {\r\n    return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)\r\n}\r\nfunction core_hmac_md5(c, f) {\r\n    var e = str2binl(c);\r\n    if (e.length > 16) {\r\n        e = core_md5(e, c.length * chrsz)\r\n    }\r\n    var a = Array(16)\r\n      , d = Array(16);\r\n    for (var b = 0; b < 16; b++) {\r\n        a[b] = e[b] ^ 909522486;\r\n        d[b] = e[b] ^ 1549556828\r\n    }\r\n    var g = core_md5(a.concat(str2binl(f)), 512 + f.length * chrsz);\r\n    return core_md5(d.concat(g), 512 + 128)\r\n}\r\nfunction safe_add(a, d) {\r\n    var c = (a & 65535) + (d & 65535);\r\n    var b = (a >> 16) + (d >> 16) + (c >> 16);\r\n    return (b << 16) | (c & 65535)\r\n}\r\nfunction bit_rol(a, b) {\r\n    return (a << b) | (a >>> (32 - b))\r\n}\r\nfunction str2binl(d) {\r\n    var c = Array();\r\n    var a = (1 << chrsz) - 1;\r\n    for (var b = 0; b < d.length * chrsz; b += chrsz) {\r\n        c[b >> 5] |= (d.charCodeAt(b / chrsz) & a) << (b % 32)\r\n    }\r\n    return c\r\n}\r\nfunction binl2hex(c) {\r\n    var b = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\r\n    var d = \"\";\r\n    for (var a = 0; a < c.length * 4; a++) {\r\n        d += b.charAt((c[a >> 2] >> ((a % 4) * 8 + 4)) & 15) + b.charAt((c[a >> 2] >> ((a % 4) * 8)) & 15)\r\n    }\r\n    return d\r\n}\r\nfunction binl2b64(d) {\r\n    var c = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\r\n    var f = \"\";\r\n    for (var b = 0; b < d.length * 4; b += 3) {\r\n        var e = (((d[b >> 2] >> 8 * (b % 4)) & 255) << 16) | (((d[b + 1 >> 2] >> 8 * ((b + 1) % 4)) & 255) << 8) | ((d[b + 2 >> 2] >> 8 * ((b + 2) % 4)) & 255);\r\n        for (var a = 0; a < 4; a++) {\r\n            if (b * 8 + a * 6 > d.length * 32) {\r\n                f += b64pad\r\n            } else {\r\n                f += c.charAt((e >> 6 * (3 - a)) & 63)\r\n            }\r\n        }\r\n    }\r\n    return f\r\n}"
  },
  {
    "path": "其他实战/【汽车之家】参数解密/main.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-08-26  Python: 3.7\r\n\r\nimport execjs\r\n\r\n\r\ndef main(pwd):\r\n    \"\"\"只解决了pwd的加密，其他请自行拓展\r\n    :param pwd:\r\n    :return:\r\n    \"\"\"\r\n    with open('execute.js', 'r', encoding='utf-8') as f:\r\n        js = execjs.compile(f.read())\r\n\r\n    print('引擎', execjs.get().name)\r\n\r\n    sign = js.call('hex_md5', pwd)\r\n    return sign\r\n\r\n\r\nif __name__ == '__main__':\r\n    pwd = input('请输入你的密码：')\r\n    print(main(pwd))\r\n"
  },
  {
    "path": "其他实战/【满级网】自动登录/auto_login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-26  Python: 3.7\n\nimport requests\nimport base64\nfrom Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5\nfrom Crypto.PublicKey import RSA\n\n\nclass YX(object):\n    \"\"\"\n    满级网自动登陆 官网 www.manjiwang.com\n    http://www.manjiwang.com/Logins/BuyerLogin\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.user = user\n        self.pwd = pwd\n        self.url = 'http://www.manjiwang.com/Logins/BuyerLogin'\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',\n            'Host': 'www.manjiwang.com',\n        }\n        self.public_key = \"\"\"-----BEGIN PUBLIC KEY-----\n        MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4wHerJc4BSst20Zb07lY9LeZss4OEEhe+SrnLyYy8hGquX/aTQNn+5wnV/+8ierKPgqPGIXPf1ZRww5/6yON+O7dAfJ7BRx85HneIWqwPCZToLck8DN8UXsBuXLMcG7tfMunnnZKenrPsAslN0eKvkYkvz4EPGdvmPwz0NCKXQIDAQAB\n        -----END PUBLIC KEY-----\n        \"\"\"\n\n    def make_pwd(self):\n        rsa_key = RSA.importKey(self.public_key)\n        cipher = Cipher_pksc1_v1_5.new(rsa_key)\n        cipher_text = base64.b64encode(cipher.encrypt(self.pwd.encode()))\n        return cipher_text.decode()\n\n    def make_data(self):\n        data = {\n            'account': self.user,\n            'password': self.make_pwd(),\n            'returnUrl': '/'\n        }\n        return data\n\n    def login(self):\n        \"\"\"start\n        \"\"\"\n        data = self.make_data()\n        response = requests.post(self.url, data=data)\n        print(response.text)\n        print(response.cookies)\n\n\nif __name__ == '__main__':\n    username = input('请输入账号')\n    password = input('密码')\n    yx = YX(username, password)\n    yx.login()\n\n\n\n"
  },
  {
    "path": "其他实战/【满级网】自动登录/encryp.js",
    "content": "var pubKey = \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC4wHerJc4BSst20Zb07lY9LeZss4OEEhe+SrnLyYy8hGquX/aTQNn+5wnV/+8ierKPgqPGIXPf1ZRww5/6yON+O7dAfJ7BRx85HneIWqwPCZToLck8DN8UXsBuXLMcG7tfMunnnZKenrPsAslN0eKvkYkvz4EPGdvmPwz0NCKXQIDAQAB\";\nvar window = {};\nvar navigator = {};\nvar ASN1 = {};\n\n\n/*! JSEncrypt v2.3.1 | https://npmcdn.com/jsencrypt@2.3.1/LICENSE.txt */\n!function(t, e) {\n    \"function\" == typeof define && define.amd ? define([\"exports\"], e) : e(\"object\" == typeof exports && \"string\" != typeof exports.nodeName ? module.exports : t)\n}(this, function(t) {\n    function e(t, e, i) {\n        null != t && (\"number\" == typeof t ? this.fromNumber(t, e, i) : null == e && \"string\" != typeof t ? this.fromString(t, 256) : this.fromString(t, e))\n    }\n    function i() {\n        return new e(null)\n    }\n    function r(t, e, i, r, s, n) {\n        for (; --n >= 0; ) {\n            var o = e * this[t++] + i[r] + s;\n            s = Math.floor(o / 67108864),\n            i[r++] = 67108863 & o\n        }\n        return s\n    }\n    function s(t, e, i, r, s, n) {\n        for (var o = 32767 & e, h = e >> 15; --n >= 0; ) {\n            var a = 32767 & this[t]\n              , u = this[t++] >> 15\n              , c = h * a + u * o;\n            a = o * a + ((32767 & c) << 15) + i[r] + (1073741823 & s),\n            s = (a >>> 30) + (c >>> 15) + h * u + (s >>> 30),\n            i[r++] = 1073741823 & a\n        }\n        return s\n    }\n    function n(t, e, i, r, s, n) {\n        for (var o = 16383 & e, h = e >> 14; --n >= 0; ) {\n            var a = 16383 & this[t]\n              , u = this[t++] >> 14\n              , c = h * a + u * o;\n            a = o * a + ((16383 & c) << 14) + i[r] + s,\n            s = (a >> 28) + (c >> 14) + h * u,\n            i[r++] = 268435455 & a\n        }\n        return s\n    }\n    function o(t) {\n        return Be.charAt(t)\n    }\n    function h(t, e) {\n        var i = Ke[t.charCodeAt(e)];\n        return null == i ? -1 : i\n    }\n    function a(t) {\n        for (var e = this.t - 1; e >= 0; --e)\n            t[e] = this[e];\n        t.t = this.t,\n        t.s = this.s\n    }\n    function u(t) {\n        this.t = 1,\n        this.s = 0 > t ? -1 : 0,\n        t > 0 ? this[0] = t : -1 > t ? this[0] = t + this.DV : this.t = 0\n    }\n    function c(t) {\n        var e = i();\n        return e.fromInt(t),\n        e\n    }\n    function f(t, i) {\n        var r;\n        if (16 == i)\n            r = 4;\n        else if (8 == i)\n            r = 3;\n        else if (256 == i)\n            r = 8;\n        else if (2 == i)\n            r = 1;\n        else if (32 == i)\n            r = 5;\n        else {\n            if (4 != i)\n                return void this.fromRadix(t, i);\n            r = 2\n        }\n        this.t = 0,\n        this.s = 0;\n        for (var s = t.length, n = !1, o = 0; --s >= 0; ) {\n            var a = 8 == r ? 255 & t[s] : h(t, s);\n            0 > a ? \"-\" == t.charAt(s) && (n = !0) : (n = !1,\n            0 == o ? this[this.t++] = a : o + r > this.DB ? (this[this.t - 1] |= (a & (1 << this.DB - o) - 1) << o,\n            this[this.t++] = a >> this.DB - o) : this[this.t - 1] |= a << o,\n            o += r,\n            o >= this.DB && (o -= this.DB))\n        }\n        8 == r && 0 != (128 & t[0]) && (this.s = -1,\n        o > 0 && (this[this.t - 1] |= (1 << this.DB - o) - 1 << o)),\n        this.clamp(),\n        n && e.ZERO.subTo(this, this)\n    }\n    function p() {\n        for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t; )\n            --this.t\n    }\n    function l(t) {\n        if (this.s < 0)\n            return \"-\" + this.negate().toString(t);\n        var e;\n        if (16 == t)\n            e = 4;\n        else if (8 == t)\n            e = 3;\n        else if (2 == t)\n            e = 1;\n        else if (32 == t)\n            e = 5;\n        else {\n            if (4 != t)\n                return this.toRadix(t);\n            e = 2\n        }\n        var i, r = (1 << e) - 1, s = !1, n = \"\", h = this.t, a = this.DB - h * this.DB % e;\n        if (h-- > 0)\n            for (a < this.DB && (i = this[h] >> a) > 0 && (s = !0,\n            n = o(i)); h >= 0; )\n                e > a ? (i = (this[h] & (1 << a) - 1) << e - a,\n                i |= this[--h] >> (a += this.DB - e)) : (i = this[h] >> (a -= e) & r,\n                0 >= a && (a += this.DB,\n                --h)),\n                i > 0 && (s = !0),\n                s && (n += o(i));\n        return s ? n : \"0\"\n    }\n    function d() {\n        var t = i();\n        return e.ZERO.subTo(this, t),\n        t\n    }\n    function g() {\n        return this.s < 0 ? this.negate() : this\n    }\n    function m(t) {\n        var e = this.s - t.s;\n        if (0 != e)\n            return e;\n        var i = this.t;\n        if (e = i - t.t,\n        0 != e)\n            return this.s < 0 ? -e : e;\n        for (; --i >= 0; )\n            if (0 != (e = this[i] - t[i]))\n                return e;\n        return 0\n    }\n    function y(t) {\n        var e, i = 1;\n        return 0 != (e = t >>> 16) && (t = e,\n        i += 16),\n        0 != (e = t >> 8) && (t = e,\n        i += 8),\n        0 != (e = t >> 4) && (t = e,\n        i += 4),\n        0 != (e = t >> 2) && (t = e,\n        i += 2),\n        0 != (e = t >> 1) && (t = e,\n        i += 1),\n        i\n    }\n    function b() {\n        return this.t <= 0 ? 0 : this.DB * (this.t - 1) + y(this[this.t - 1] ^ this.s & this.DM)\n    }\n    function T(t, e) {\n        var i;\n        for (i = this.t - 1; i >= 0; --i)\n            e[i + t] = this[i];\n        for (i = t - 1; i >= 0; --i)\n            e[i] = 0;\n        e.t = this.t + t,\n        e.s = this.s\n    }\n    function S(t, e) {\n        for (var i = t; i < this.t; ++i)\n            e[i - t] = this[i];\n        e.t = Math.max(this.t - t, 0),\n        e.s = this.s\n    }\n    function R(t, e) {\n        var i, r = t % this.DB, s = this.DB - r, n = (1 << s) - 1, o = Math.floor(t / this.DB), h = this.s << r & this.DM;\n        for (i = this.t - 1; i >= 0; --i)\n            e[i + o + 1] = this[i] >> s | h,\n            h = (this[i] & n) << r;\n        for (i = o - 1; i >= 0; --i)\n            e[i] = 0;\n        e[o] = h,\n        e.t = this.t + o + 1,\n        e.s = this.s,\n        e.clamp()\n    }\n    function E(t, e) {\n        e.s = this.s;\n        var i = Math.floor(t / this.DB);\n        if (i >= this.t)\n            return void (e.t = 0);\n        var r = t % this.DB\n          , s = this.DB - r\n          , n = (1 << r) - 1;\n        e[0] = this[i] >> r;\n        for (var o = i + 1; o < this.t; ++o)\n            e[o - i - 1] |= (this[o] & n) << s,\n            e[o - i] = this[o] >> r;\n        r > 0 && (e[this.t - i - 1] |= (this.s & n) << s),\n        e.t = this.t - i,\n        e.clamp()\n    }\n    function D(t, e) {\n        for (var i = 0, r = 0, s = Math.min(t.t, this.t); s > i; )\n            r += this[i] - t[i],\n            e[i++] = r & this.DM,\n            r >>= this.DB;\n        if (t.t < this.t) {\n            for (r -= t.s; i < this.t; )\n                r += this[i],\n                e[i++] = r & this.DM,\n                r >>= this.DB;\n            r += this.s\n        } else {\n            for (r += this.s; i < t.t; )\n                r -= t[i],\n                e[i++] = r & this.DM,\n                r >>= this.DB;\n            r -= t.s\n        }\n        e.s = 0 > r ? -1 : 0,\n        -1 > r ? e[i++] = this.DV + r : r > 0 && (e[i++] = r),\n        e.t = i,\n        e.clamp()\n    }\n    function w(t, i) {\n        var r = this.abs()\n          , s = t.abs()\n          , n = r.t;\n        for (i.t = n + s.t; --n >= 0; )\n            i[n] = 0;\n        for (n = 0; n < s.t; ++n)\n            i[n + r.t] = r.am(0, s[n], i, n, 0, r.t);\n        i.s = 0,\n        i.clamp(),\n        this.s != t.s && e.ZERO.subTo(i, i)\n    }\n    function x(t) {\n        for (var e = this.abs(), i = t.t = 2 * e.t; --i >= 0; )\n            t[i] = 0;\n        for (i = 0; i < e.t - 1; ++i) {\n            var r = e.am(i, e[i], t, 2 * i, 0, 1);\n            (t[i + e.t] += e.am(i + 1, 2 * e[i], t, 2 * i + 1, r, e.t - i - 1)) >= e.DV && (t[i + e.t] -= e.DV,\n            t[i + e.t + 1] = 1)\n        }\n        t.t > 0 && (t[t.t - 1] += e.am(i, e[i], t, 2 * i, 0, 1)),\n        t.s = 0,\n        t.clamp()\n    }\n    function B(t, r, s) {\n        var n = t.abs();\n        if (!(n.t <= 0)) {\n            var o = this.abs();\n            if (o.t < n.t)\n                return null != r && r.fromInt(0),\n                void (null != s && this.copyTo(s));\n            null == s && (s = i());\n            var h = i()\n              , a = this.s\n              , u = t.s\n              , c = this.DB - y(n[n.t - 1]);\n            c > 0 ? (n.lShiftTo(c, h),\n            o.lShiftTo(c, s)) : (n.copyTo(h),\n            o.copyTo(s));\n            var f = h.t\n              , p = h[f - 1];\n            if (0 != p) {\n                var l = p * (1 << this.F1) + (f > 1 ? h[f - 2] >> this.F2 : 0)\n                  , d = this.FV / l\n                  , g = (1 << this.F1) / l\n                  , m = 1 << this.F2\n                  , v = s.t\n                  , b = v - f\n                  , T = null == r ? i() : r;\n                for (h.dlShiftTo(b, T),\n                s.compareTo(T) >= 0 && (s[s.t++] = 1,\n                s.subTo(T, s)),\n                e.ONE.dlShiftTo(f, T),\n                T.subTo(h, h); h.t < f; )\n                    h[h.t++] = 0;\n                for (; --b >= 0; ) {\n                    var S = s[--v] == p ? this.DM : Math.floor(s[v] * d + (s[v - 1] + m) * g);\n                    if ((s[v] += h.am(0, S, s, b, 0, f)) < S)\n                        for (h.dlShiftTo(b, T),\n                        s.subTo(T, s); s[v] < --S; )\n                            s.subTo(T, s)\n                }\n                null != r && (s.drShiftTo(f, r),\n                a != u && e.ZERO.subTo(r, r)),\n                s.t = f,\n                s.clamp(),\n                c > 0 && s.rShiftTo(c, s),\n                0 > a && e.ZERO.subTo(s, s)\n            }\n        }\n    }\n    function K(t) {\n        var r = i();\n        return this.abs().divRemTo(t, null, r),\n        this.s < 0 && r.compareTo(e.ZERO) > 0 && t.subTo(r, r),\n        r\n    }\n    function A(t) {\n        this.m = t\n    }\n    function U(t) {\n        return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t\n    }\n    function O(t) {\n        return t\n    }\n    function V(t) {\n        t.divRemTo(this.m, null, t)\n    }\n    function N(t, e, i) {\n        t.multiplyTo(e, i),\n        this.reduce(i)\n    }\n    function J(t, e) {\n        t.squareTo(e),\n        this.reduce(e)\n    }\n    function I() {\n        if (this.t < 1)\n            return 0;\n        var t = this[0];\n        if (0 == (1 & t))\n            return 0;\n        var e = 3 & t;\n        return e = e * (2 - (15 & t) * e) & 15,\n        e = e * (2 - (255 & t) * e) & 255,\n        e = e * (2 - ((65535 & t) * e & 65535)) & 65535,\n        e = e * (2 - t * e % this.DV) % this.DV,\n        e > 0 ? this.DV - e : -e\n    }\n    function P(t) {\n        this.m = t,\n        this.mp = t.invDigit(),\n        this.mpl = 32767 & this.mp,\n        this.mph = this.mp >> 15,\n        this.um = (1 << t.DB - 15) - 1,\n        this.mt2 = 2 * t.t\n    }\n    function M(t) {\n        var r = i();\n        return t.abs().dlShiftTo(this.m.t, r),\n        r.divRemTo(this.m, null, r),\n        t.s < 0 && r.compareTo(e.ZERO) > 0 && this.m.subTo(r, r),\n        r\n    }\n    function L(t) {\n        var e = i();\n        return t.copyTo(e),\n        this.reduce(e),\n        e\n    }\n    function q(t) {\n        for (; t.t <= this.mt2; )\n            t[t.t++] = 0;\n        for (var e = 0; e < this.m.t; ++e) {\n            var i = 32767 & t[e]\n              , r = i * this.mpl + ((i * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;\n            for (i = e + this.m.t,\n            t[i] += this.m.am(0, r, t, e, 0, this.m.t); t[i] >= t.DV; )\n                t[i] -= t.DV,\n                t[++i]++\n        }\n        t.clamp(),\n        t.drShiftTo(this.m.t, t),\n        t.compareTo(this.m) >= 0 && t.subTo(this.m, t)\n    }\n    function C(t, e) {\n        t.squareTo(e),\n        this.reduce(e)\n    }\n    function H(t, e, i) {\n        t.multiplyTo(e, i),\n        this.reduce(i)\n    }\n    function j() {\n        return 0 == (this.t > 0 ? 1 & this[0] : this.s)\n    }\n    function k(t, r) {\n        if (t > 4294967295 || 1 > t)\n            return e.ONE;\n        var s = i()\n          , n = i()\n          , o = r.convert(this)\n          , h = y(t) - 1;\n        for (o.copyTo(s); --h >= 0; )\n            if (r.sqrTo(s, n),\n            (t & 1 << h) > 0)\n                r.mulTo(n, o, s);\n            else {\n                var a = s;\n                s = n,\n                n = a\n            }\n        return r.revert(s)\n    }\n    function F(t, e) {\n        var i;\n        return i = 256 > t || e.isEven() ? new A(e) : new P(e),\n        this.exp(t, i)\n    }\n    // Copyright (c) 2005-2009  Tom Wu\n    // All Rights Reserved.\n    // See \"LICENSE\" for details.\n    function _() {\n        var t = i();\n        return this.copyTo(t),\n        t\n    }\n    function z() {\n        if (this.s < 0) {\n            if (1 == this.t)\n                return this[0] - this.DV;\n            if (0 == this.t)\n                return -1\n        } else {\n            if (1 == this.t)\n                return this[0];\n            if (0 == this.t)\n                return 0\n        }\n        return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]\n    }\n    function Z() {\n        return 0 == this.t ? this.s : this[0] << 24 >> 24\n    }\n    function G() {\n        return 0 == this.t ? this.s : this[0] << 16 >> 16\n    }\n    function $(t) {\n        return Math.floor(Math.LN2 * this.DB / Math.log(t))\n    }\n    function Y() {\n        return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1\n    }\n    function W(t) {\n        if (null == t && (t = 10),\n        0 == this.signum() || 2 > t || t > 36)\n            return \"0\";\n        var e = this.chunkSize(t)\n          , r = Math.pow(t, e)\n          , s = c(r)\n          , n = i()\n          , o = i()\n          , h = \"\";\n        for (this.divRemTo(s, n, o); n.signum() > 0; )\n            h = (r + o.intValue()).toString(t).substr(1) + h,\n            n.divRemTo(s, n, o);\n        return o.intValue().toString(t) + h\n    }\n    function Q(t, i) {\n        this.fromInt(0),\n        null == i && (i = 10);\n        for (var r = this.chunkSize(i), s = Math.pow(i, r), n = !1, o = 0, a = 0, u = 0; u < t.length; ++u) {\n            var c = h(t, u);\n            0 > c ? \"-\" == t.charAt(u) && 0 == this.signum() && (n = !0) : (a = i * a + c,\n            ++o >= r && (this.dMultiply(s),\n            this.dAddOffset(a, 0),\n            o = 0,\n            a = 0))\n        }\n        o > 0 && (this.dMultiply(Math.pow(i, o)),\n        this.dAddOffset(a, 0)),\n        n && e.ZERO.subTo(this, this)\n    }\n    function X(t, i, r) {\n        if (\"number\" == typeof i)\n            if (2 > t)\n                this.fromInt(1);\n            else\n                for (this.fromNumber(t, r),\n                this.testBit(t - 1) || this.bitwiseTo(e.ONE.shiftLeft(t - 1), ht, this),\n                this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(i); )\n                    this.dAddOffset(2, 0),\n                    this.bitLength() > t && this.subTo(e.ONE.shiftLeft(t - 1), this);\n        else {\n            var s = new Array\n              , n = 7 & t;\n            s.length = (t >> 3) + 1,\n            i.nextBytes(s),\n            n > 0 ? s[0] &= (1 << n) - 1 : s[0] = 0,\n            this.fromString(s, 256)\n        }\n    }\n    function tt() {\n        var t = this.t\n          , e = new Array;\n        e[0] = this.s;\n        var i, r = this.DB - t * this.DB % 8, s = 0;\n        if (t-- > 0)\n            for (r < this.DB && (i = this[t] >> r) != (this.s & this.DM) >> r && (e[s++] = i | this.s << this.DB - r); t >= 0; )\n                8 > r ? (i = (this[t] & (1 << r) - 1) << 8 - r,\n                i |= this[--t] >> (r += this.DB - 8)) : (i = this[t] >> (r -= 8) & 255,\n                0 >= r && (r += this.DB,\n                --t)),\n                0 != (128 & i) && (i |= -256),\n                0 == s && (128 & this.s) != (128 & i) && ++s,\n                (s > 0 || i != this.s) && (e[s++] = i);\n        return e\n    }\n    function et(t) {\n        return 0 == this.compareTo(t)\n    }\n    function it(t) {\n        return this.compareTo(t) < 0 ? this : t\n    }\n    function rt(t) {\n        return this.compareTo(t) > 0 ? this : t\n    }\n    function st(t, e, i) {\n        var r, s, n = Math.min(t.t, this.t);\n        for (r = 0; n > r; ++r)\n            i[r] = e(this[r], t[r]);\n        if (t.t < this.t) {\n            for (s = t.s & this.DM,\n            r = n; r < this.t; ++r)\n                i[r] = e(this[r], s);\n            i.t = this.t\n        } else {\n            for (s = this.s & this.DM,\n            r = n; r < t.t; ++r)\n                i[r] = e(s, t[r]);\n            i.t = t.t\n        }\n        i.s = e(this.s, t.s),\n        i.clamp()\n    }\n    function nt(t, e) {\n        return t & e\n    }\n    function ot(t) {\n        var e = i();\n        return this.bitwiseTo(t, nt, e),\n        e\n    }\n    function ht(t, e) {\n        return t | e\n    }\n    function at(t) {\n        var e = i();\n        return this.bitwiseTo(t, ht, e),\n        e\n    }\n    function ut(t, e) {\n        return t ^ e\n    }\n    function ct(t) {\n        var e = i();\n        return this.bitwiseTo(t, ut, e),\n        e\n    }\n    function ft(t, e) {\n        return t & ~e\n    }\n    function pt(t) {\n        var e = i();\n        return this.bitwiseTo(t, ft, e),\n        e\n    }\n    function lt() {\n        for (var t = i(), e = 0; e < this.t; ++e)\n            t[e] = this.DM & ~this[e];\n        return t.t = this.t,\n        t.s = ~this.s,\n        t\n    }\n    function dt(t) {\n        var e = i();\n        return 0 > t ? this.rShiftTo(-t, e) : this.lShiftTo(t, e),\n        e\n    }\n    function gt(t) {\n        var e = i();\n        return 0 > t ? this.lShiftTo(-t, e) : this.rShiftTo(t, e),\n        e\n    }\n    function mt(t) {\n        if (0 == t)\n            return -1;\n        var e = 0;\n        return 0 == (65535 & t) && (t >>= 16,\n        e += 16),\n        0 == (255 & t) && (t >>= 8,\n        e += 8),\n        0 == (15 & t) && (t >>= 4,\n        e += 4),\n        0 == (3 & t) && (t >>= 2,\n        e += 2),\n        0 == (1 & t) && ++e,\n        e\n    }\n    function yt() {\n        for (var t = 0; t < this.t; ++t)\n            if (0 != this[t])\n                return t * this.DB + mt(this[t]);\n        return this.s < 0 ? this.t * this.DB : -1\n    }\n    function vt(t) {\n        for (var e = 0; 0 != t; )\n            t &= t - 1,\n            ++e;\n        return e\n    }\n    function bt() {\n        for (var t = 0, e = this.s & this.DM, i = 0; i < this.t; ++i)\n            t += vt(this[i] ^ e);\n        return t\n    }\n    function Tt(t) {\n        var e = Math.floor(t / this.DB);\n        return e >= this.t ? 0 != this.s : 0 != (this[e] & 1 << t % this.DB)\n    }\n    function St(t, i) {\n        var r = e.ONE.shiftLeft(t);\n        return this.bitwiseTo(r, i, r),\n        r\n    }\n    function Rt(t) {\n        return this.changeBit(t, ht)\n    }\n    function Et(t) {\n        return this.changeBit(t, ft)\n    }\n    function Dt(t) {\n        return this.changeBit(t, ut)\n    }\n    function wt(t, e) {\n        for (var i = 0, r = 0, s = Math.min(t.t, this.t); s > i; )\n            r += this[i] + t[i],\n            e[i++] = r & this.DM,\n            r >>= this.DB;\n        if (t.t < this.t) {\n            for (r += t.s; i < this.t; )\n                r += this[i],\n                e[i++] = r & this.DM,\n                r >>= this.DB;\n            r += this.s\n        } else {\n            for (r += this.s; i < t.t; )\n                r += t[i],\n                e[i++] = r & this.DM,\n                r >>= this.DB;\n            r += t.s\n        }\n        e.s = 0 > r ? -1 : 0,\n        r > 0 ? e[i++] = r : -1 > r && (e[i++] = this.DV + r),\n        e.t = i,\n        e.clamp()\n    }\n    function xt(t) {\n        var e = i();\n        return this.addTo(t, e),\n        e\n    }\n    function Bt(t) {\n        var e = i();\n        return this.subTo(t, e),\n        e\n    }\n    function Kt(t) {\n        var e = i();\n        return this.multiplyTo(t, e),\n        e\n    }\n    function At() {\n        var t = i();\n        return this.squareTo(t),\n        t\n    }\n    function Ut(t) {\n        var e = i();\n        return this.divRemTo(t, e, null),\n        e\n    }\n    function Ot(t) {\n        var e = i();\n        return this.divRemTo(t, null, e),\n        e\n    }\n    function Vt(t) {\n        var e = i()\n          , r = i();\n        return this.divRemTo(t, e, r),\n        new Array(e,r)\n    }\n    function Nt(t) {\n        this[this.t] = this.am(0, t - 1, this, 0, 0, this.t),\n        ++this.t,\n        this.clamp()\n    }\n    function Jt(t, e) {\n        if (0 != t) {\n            for (; this.t <= e; )\n                this[this.t++] = 0;\n            for (this[e] += t; this[e] >= this.DV; )\n                this[e] -= this.DV,\n                ++e >= this.t && (this[this.t++] = 0),\n                ++this[e]\n        }\n    }\n    function It() {}\n    function Pt(t) {\n        return t\n    }\n    function Mt(t, e, i) {\n        t.multiplyTo(e, i)\n    }\n    function Lt(t, e) {\n        t.squareTo(e)\n    }\n    function qt(t) {\n        return this.exp(t, new It)\n    }\n    function Ct(t, e, i) {\n        var r = Math.min(this.t + t.t, e);\n        for (i.s = 0,\n        i.t = r; r > 0; )\n            i[--r] = 0;\n        var s;\n        for (s = i.t - this.t; s > r; ++r)\n            i[r + this.t] = this.am(0, t[r], i, r, 0, this.t);\n        for (s = Math.min(t.t, e); s > r; ++r)\n            this.am(0, t[r], i, r, 0, e - r);\n        i.clamp()\n    }\n    function Ht(t, e, i) {\n        --e;\n        var r = i.t = this.t + t.t - e;\n        for (i.s = 0; --r >= 0; )\n            i[r] = 0;\n        for (r = Math.max(e - this.t, 0); r < t.t; ++r)\n            i[this.t + r - e] = this.am(e - r, t[r], i, 0, 0, this.t + r - e);\n        i.clamp(),\n        i.drShiftTo(1, i)\n    }\n    function jt(t) {\n        this.r2 = i(),\n        this.q3 = i(),\n        e.ONE.dlShiftTo(2 * t.t, this.r2),\n        this.mu = this.r2.divide(t),\n        this.m = t\n    }\n    function kt(t) {\n        if (t.s < 0 || t.t > 2 * this.m.t)\n            return t.mod(this.m);\n        if (t.compareTo(this.m) < 0)\n            return t;\n        var e = i();\n        return t.copyTo(e),\n        this.reduce(e),\n        e\n    }\n    function Ft(t) {\n        return t\n    }\n    function _t(t) {\n        for (t.drShiftTo(this.m.t - 1, this.r2),\n        t.t > this.m.t + 1 && (t.t = this.m.t + 1,\n        t.clamp()),\n        this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3),\n        this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0; )\n            t.dAddOffset(1, this.m.t + 1);\n        for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0; )\n            t.subTo(this.m, t)\n    }\n    function zt(t, e) {\n        t.squareTo(e),\n        this.reduce(e)\n    }\n    function Zt(t, e, i) {\n        t.multiplyTo(e, i),\n        this.reduce(i)\n    }\n    function Gt(t, e) {\n        var r, s, n = t.bitLength(), o = c(1);\n        if (0 >= n)\n            return o;\n        r = 18 > n ? 1 : 48 > n ? 3 : 144 > n ? 4 : 768 > n ? 5 : 6,\n        s = 8 > n ? new A(e) : e.isEven() ? new jt(e) : new P(e);\n        var h = new Array\n          , a = 3\n          , u = r - 1\n          , f = (1 << r) - 1;\n        if (h[1] = s.convert(this),\n        r > 1) {\n            var p = i();\n            for (s.sqrTo(h[1], p); f >= a; )\n                h[a] = i(),\n                s.mulTo(p, h[a - 2], h[a]),\n                a += 2\n        }\n        var l, d, g = t.t - 1, m = !0, v = i();\n        for (n = y(t[g]) - 1; g >= 0; ) {\n            for (n >= u ? l = t[g] >> n - u & f : (l = (t[g] & (1 << n + 1) - 1) << u - n,\n            g > 0 && (l |= t[g - 1] >> this.DB + n - u)),\n            a = r; 0 == (1 & l); )\n                l >>= 1,\n                --a;\n            if ((n -= a) < 0 && (n += this.DB,\n            --g),\n            m)\n                h[l].copyTo(o),\n                m = !1;\n            else {\n                for (; a > 1; )\n                    s.sqrTo(o, v),\n                    s.sqrTo(v, o),\n                    a -= 2;\n                a > 0 ? s.sqrTo(o, v) : (d = o,\n                o = v,\n                v = d),\n                s.mulTo(v, h[l], o)\n            }\n            for (; g >= 0 && 0 == (t[g] & 1 << n); )\n                s.sqrTo(o, v),\n                d = o,\n                o = v,\n                v = d,\n                --n < 0 && (n = this.DB - 1,\n                --g)\n        }\n        return s.revert(o)\n    }\n    function $t(t) {\n        var e = this.s < 0 ? this.negate() : this.clone()\n          , i = t.s < 0 ? t.negate() : t.clone();\n        if (e.compareTo(i) < 0) {\n            var r = e;\n            e = i,\n            i = r\n        }\n        var s = e.getLowestSetBit()\n          , n = i.getLowestSetBit();\n        if (0 > n)\n            return e;\n        for (n > s && (n = s),\n        n > 0 && (e.rShiftTo(n, e),\n        i.rShiftTo(n, i)); e.signum() > 0; )\n            (s = e.getLowestSetBit()) > 0 && e.rShiftTo(s, e),\n            (s = i.getLowestSetBit()) > 0 && i.rShiftTo(s, i),\n            e.compareTo(i) >= 0 ? (e.subTo(i, e),\n            e.rShiftTo(1, e)) : (i.subTo(e, i),\n            i.rShiftTo(1, i));\n        return n > 0 && i.lShiftTo(n, i),\n        i\n    }\n    function Yt(t) {\n        if (0 >= t)\n            return 0;\n        var e = this.DV % t\n          , i = this.s < 0 ? t - 1 : 0;\n        if (this.t > 0)\n            if (0 == e)\n                i = this[0] % t;\n            else\n                for (var r = this.t - 1; r >= 0; --r)\n                    i = (e * i + this[r]) % t;\n        return i\n    }\n    function Wt(t) {\n        var i = t.isEven();\n        if (this.isEven() && i || 0 == t.signum())\n            return e.ZERO;\n        for (var r = t.clone(), s = this.clone(), n = c(1), o = c(0), h = c(0), a = c(1); 0 != r.signum(); ) {\n            for (; r.isEven(); )\n                r.rShiftTo(1, r),\n                i ? (n.isEven() && o.isEven() || (n.addTo(this, n),\n                o.subTo(t, o)),\n                n.rShiftTo(1, n)) : o.isEven() || o.subTo(t, o),\n                o.rShiftTo(1, o);\n            for (; s.isEven(); )\n                s.rShiftTo(1, s),\n                i ? (h.isEven() && a.isEven() || (h.addTo(this, h),\n                a.subTo(t, a)),\n                h.rShiftTo(1, h)) : a.isEven() || a.subTo(t, a),\n                a.rShiftTo(1, a);\n            r.compareTo(s) >= 0 ? (r.subTo(s, r),\n            i && n.subTo(h, n),\n            o.subTo(a, o)) : (s.subTo(r, s),\n            i && h.subTo(n, h),\n            a.subTo(o, a))\n        }\n        return 0 != s.compareTo(e.ONE) ? e.ZERO : a.compareTo(t) >= 0 ? a.subtract(t) : a.signum() < 0 ? (a.addTo(t, a),\n        a.signum() < 0 ? a.add(t) : a) : a\n    }\n    function Qt(t) {\n        var e, i = this.abs();\n        if (1 == i.t && i[0] <= Ae[Ae.length - 1]) {\n            for (e = 0; e < Ae.length; ++e)\n                if (i[0] == Ae[e])\n                    return !0;\n            return !1\n        }\n        if (i.isEven())\n            return !1;\n        for (e = 1; e < Ae.length; ) {\n            for (var r = Ae[e], s = e + 1; s < Ae.length && Ue > r; )\n                r *= Ae[s++];\n            for (r = i.modInt(r); s > e; )\n                if (r % Ae[e++] == 0)\n                    return !1\n        }\n        return i.millerRabin(t)\n    }\n    function Xt(t) {\n        var r = this.subtract(e.ONE)\n          , s = r.getLowestSetBit();\n        if (0 >= s)\n            return !1;\n        var n = r.shiftRight(s);\n        t = t + 1 >> 1,\n        t > Ae.length && (t = Ae.length);\n        for (var o = i(), h = 0; t > h; ++h) {\n            o.fromInt(Ae[Math.floor(Math.random() * Ae.length)]);\n            var a = o.modPow(n, this);\n            if (0 != a.compareTo(e.ONE) && 0 != a.compareTo(r)) {\n                for (var u = 1; u++ < s && 0 != a.compareTo(r); )\n                    if (a = a.modPowInt(2, this),\n                    0 == a.compareTo(e.ONE))\n                        return !1;\n                if (0 != a.compareTo(r))\n                    return !1\n            }\n        }\n        return !0\n    }\n    function te() {\n        this.i = 0,\n        this.j = 0,\n        this.S = new Array\n    }\n    function ee(t) {\n        var e, i, r;\n        for (e = 0; 256 > e; ++e)\n            this.S[e] = e;\n        for (i = 0,\n        e = 0; 256 > e; ++e)\n            i = i + this.S[e] + t[e % t.length] & 255,\n            r = this.S[e],\n            this.S[e] = this.S[i],\n            this.S[i] = r;\n        this.i = 0,\n        this.j = 0\n    }\n    function ie() {\n        var t;\n        return this.i = this.i + 1 & 255,\n        this.j = this.j + this.S[this.i] & 255,\n        t = this.S[this.i],\n        this.S[this.i] = this.S[this.j],\n        this.S[this.j] = t,\n        this.S[t + this.S[this.i] & 255]\n    }\n    function re() {\n        return new te\n    }\n    function se() {\n        if (null == Oe) {\n            for (Oe = re(); Je > Ne; ) {\n                var t = Math.floor(65536 * Math.random());\n                Ve[Ne++] = 255 & t\n            }\n            for (Oe.init(Ve),\n            Ne = 0; Ne < Ve.length; ++Ne)\n                Ve[Ne] = 0;\n            Ne = 0\n        }\n        return Oe.next()\n    }\n    function ne(t) {\n        var e;\n        for (e = 0; e < t.length; ++e)\n            t[e] = se()\n    }\n    function oe() {}\n    function he(t, i) {\n        return new e(t,i)\n    }\n    function ae(t, i) {\n        if (i < t.length + 11)\n            return console.error(\"Message too long for RSA\"),\n            null;\n        for (var r = new Array, s = t.length - 1; s >= 0 && i > 0; ) {\n            var n = t.charCodeAt(s--);\n            128 > n ? r[--i] = n : n > 127 && 2048 > n ? (r[--i] = 63 & n | 128,\n            r[--i] = n >> 6 | 192) : (r[--i] = 63 & n | 128,\n            r[--i] = n >> 6 & 63 | 128,\n            r[--i] = n >> 12 | 224)\n        }\n        r[--i] = 0;\n        for (var o = new oe, h = new Array; i > 2; ) {\n            for (h[0] = 0; 0 == h[0]; )\n                o.nextBytes(h);\n            r[--i] = h[0]\n        }\n        return r[--i] = 2,\n        r[--i] = 0,\n        new e(r)\n    }\n    function ue() {\n        this.n = null,\n        this.e = 0,\n        this.d = null,\n        this.p = null,\n        this.q = null,\n        this.dmp1 = null,\n        this.dmq1 = null,\n        this.coeff = null\n    }\n    function ce(t, e) {\n        null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = he(t, 16),\n        this.e = parseInt(e, 16)) : console.error(\"Invalid RSA public key\")\n    }\n    function fe(t) {\n        return t.modPowInt(this.e, this.n)\n    }\n    function pe(t) {\n        var e = ae(t, this.n.bitLength() + 7 >> 3);\n        if (null == e)\n            return null;\n        var i = this.doPublic(e);\n        if (null == i)\n            return null;\n        var r = i.toString(16);\n        return 0 == (1 & r.length) ? r : \"0\" + r\n    }\n    function le(t, e) {\n        for (var i = t.toByteArray(), r = 0; r < i.length && 0 == i[r]; )\n            ++r;\n        if (i.length - r != e - 1 || 2 != i[r])\n            return null;\n        for (++r; 0 != i[r]; )\n            if (++r >= i.length)\n                return null;\n        for (var s = \"\"; ++r < i.length; ) {\n            var n = 255 & i[r];\n            128 > n ? s += String.fromCharCode(n) : n > 191 && 224 > n ? (s += String.fromCharCode((31 & n) << 6 | 63 & i[r + 1]),\n            ++r) : (s += String.fromCharCode((15 & n) << 12 | (63 & i[r + 1]) << 6 | 63 & i[r + 2]),\n            r += 2)\n        }\n        return s\n    }\n    function de(t, e, i) {\n        null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = he(t, 16),\n        this.e = parseInt(e, 16),\n        this.d = he(i, 16)) : console.error(\"Invalid RSA private key\")\n    }\n    function ge(t, e, i, r, s, n, o, h) {\n        null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = he(t, 16),\n        this.e = parseInt(e, 16),\n        this.d = he(i, 16),\n        this.p = he(r, 16),\n        this.q = he(s, 16),\n        this.dmp1 = he(n, 16),\n        this.dmq1 = he(o, 16),\n        this.coeff = he(h, 16)) : console.error(\"Invalid RSA private key\")\n    }\n    function me(t, i) {\n        var r = new oe\n          , s = t >> 1;\n        this.e = parseInt(i, 16);\n        for (var n = new e(i,16); ; ) {\n            for (; this.p = new e(t - s,1,r),\n            0 != this.p.subtract(e.ONE).gcd(n).compareTo(e.ONE) || !this.p.isProbablePrime(10); )\n                ;\n            for (; this.q = new e(s,1,r),\n            0 != this.q.subtract(e.ONE).gcd(n).compareTo(e.ONE) || !this.q.isProbablePrime(10); )\n                ;\n            if (this.p.compareTo(this.q) <= 0) {\n                var o = this.p;\n                this.p = this.q,\n                this.q = o\n            }\n            var h = this.p.subtract(e.ONE)\n              , a = this.q.subtract(e.ONE)\n              , u = h.multiply(a);\n            if (0 == u.gcd(n).compareTo(e.ONE)) {\n                this.n = this.p.multiply(this.q),\n                this.d = n.modInverse(u),\n                this.dmp1 = this.d.mod(h),\n                this.dmq1 = this.d.mod(a),\n                this.coeff = this.q.modInverse(this.p);\n                break\n            }\n        }\n    }\n    function ye(t) {\n        if (null == this.p || null == this.q)\n            return t.modPow(this.d, this.n);\n        for (var e = t.mod(this.p).modPow(this.dmp1, this.p), i = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(i) < 0; )\n            e = e.add(this.p);\n        return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i)\n    }\n    function ve(t) {\n        var e = he(t, 16)\n          , i = this.doPrivate(e);\n        return null == i ? null : le(i, this.n.bitLength() + 7 >> 3)\n    }\n    function be(t) {\n        var e, i, r = \"\";\n        for (e = 0; e + 3 <= t.length; e += 3)\n            i = parseInt(t.substring(e, e + 3), 16),\n            r += Le.charAt(i >> 6) + Le.charAt(63 & i);\n        for (e + 1 == t.length ? (i = parseInt(t.substring(e, e + 1), 16),\n        r += Le.charAt(i << 2)) : e + 2 == t.length && (i = parseInt(t.substring(e, e + 2), 16),\n        r += Le.charAt(i >> 2) + Le.charAt((3 & i) << 4)); (3 & r.length) > 0; )\n            r += qe;\n        return r\n    }\n    function Te(t) {\n        var e, i, r = \"\", s = 0;\n        for (e = 0; e < t.length && t.charAt(e) != qe; ++e)\n            v = Le.indexOf(t.charAt(e)),\n            v < 0 || (0 == s ? (r += o(v >> 2),\n            i = 3 & v,\n            s = 1) : 1 == s ? (r += o(i << 2 | v >> 4),\n            i = 15 & v,\n            s = 2) : 2 == s ? (r += o(i),\n            r += o(v >> 2),\n            i = 3 & v,\n            s = 3) : (r += o(i << 2 | v >> 4),\n            r += o(15 & v),\n            s = 0));\n        return 1 == s && (r += o(i << 2)),\n        r\n    }\n    // Copyright (c) 2005  Tom Wu\n    // All Rights Reserved.\n    // See \"LICENSE\" for details.\n    var Se, Re = 0xdeadbeefcafe, Ee = 15715070 == (16777215 & Re);\n    Ee && \"Microsoft Internet Explorer\" == navigator.appName ? (e.prototype.am = s,\n    Se = 30) : Ee && \"Netscape\" != navigator.appName ? (e.prototype.am = r,\n    Se = 26) : (e.prototype.am = n,\n    Se = 28),\n    e.prototype.DB = Se,\n    e.prototype.DM = (1 << Se) - 1,\n    e.prototype.DV = 1 << Se;\n    var De = 52;\n    e.prototype.FV = Math.pow(2, De),\n    e.prototype.F1 = De - Se,\n    e.prototype.F2 = 2 * Se - De;\n    var we, xe, Be = \"0123456789abcdefghijklmnopqrstuvwxyz\", Ke = new Array;\n    for (we = \"0\".charCodeAt(0),\n    xe = 0; 9 >= xe; ++xe)\n        Ke[we++] = xe;\n    for (we = \"a\".charCodeAt(0),\n    xe = 10; 36 > xe; ++xe)\n        Ke[we++] = xe;\n    for (we = \"A\".charCodeAt(0),\n    xe = 10; 36 > xe; ++xe)\n        Ke[we++] = xe;\n    A.prototype.convert = U,\n    A.prototype.revert = O,\n    A.prototype.reduce = V,\n    A.prototype.mulTo = N,\n    A.prototype.sqrTo = J,\n    P.prototype.convert = M,\n    P.prototype.revert = L,\n    P.prototype.reduce = q,\n    P.prototype.mulTo = H,\n    P.prototype.sqrTo = C,\n    e.prototype.copyTo = a,\n    e.prototype.fromInt = u,\n    e.prototype.fromString = f,\n    e.prototype.clamp = p,\n    e.prototype.dlShiftTo = T,\n    e.prototype.drShiftTo = S,\n    e.prototype.lShiftTo = R,\n    e.prototype.rShiftTo = E,\n    e.prototype.subTo = D,\n    e.prototype.multiplyTo = w,\n    e.prototype.squareTo = x,\n    e.prototype.divRemTo = B,\n    e.prototype.invDigit = I,\n    e.prototype.isEven = j,\n    e.prototype.exp = k,\n    e.prototype.toString = l,\n    e.prototype.negate = d,\n    e.prototype.abs = g,\n    e.prototype.compareTo = m,\n    e.prototype.bitLength = b,\n    e.prototype.mod = K,\n    e.prototype.modPowInt = F,\n    e.ZERO = c(0),\n    e.ONE = c(1),\n    It.prototype.convert = Pt,\n    It.prototype.revert = Pt,\n    It.prototype.mulTo = Mt,\n    It.prototype.sqrTo = Lt,\n    jt.prototype.convert = kt,\n    jt.prototype.revert = Ft,\n    jt.prototype.reduce = _t,\n    jt.prototype.mulTo = Zt,\n    jt.prototype.sqrTo = zt;\n    var Ae = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]\n      , Ue = (1 << 26) / Ae[Ae.length - 1];\n    e.prototype.chunkSize = $,\n    e.prototype.toRadix = W,\n    e.prototype.fromRadix = Q,\n    e.prototype.fromNumber = X,\n    e.prototype.bitwiseTo = st,\n    e.prototype.changeBit = St,\n    e.prototype.addTo = wt,\n    e.prototype.dMultiply = Nt,\n    e.prototype.dAddOffset = Jt,\n    e.prototype.multiplyLowerTo = Ct,\n    e.prototype.multiplyUpperTo = Ht,\n    e.prototype.modInt = Yt,\n    e.prototype.millerRabin = Xt,\n    e.prototype.clone = _,\n    e.prototype.intValue = z,\n    e.prototype.byteValue = Z,\n    e.prototype.shortValue = G,\n    e.prototype.signum = Y,\n    e.prototype.toByteArray = tt,\n    e.prototype.equals = et,\n    e.prototype.min = it,\n    e.prototype.max = rt,\n    e.prototype.and = ot,\n    e.prototype.or = at,\n    e.prototype.xor = ct,\n    e.prototype.andNot = pt,\n    e.prototype.not = lt,\n    e.prototype.shiftLeft = dt,\n    e.prototype.shiftRight = gt,\n    e.prototype.getLowestSetBit = yt,\n    e.prototype.bitCount = bt,\n    e.prototype.testBit = Tt,\n    e.prototype.setBit = Rt,\n    e.prototype.clearBit = Et,\n    e.prototype.flipBit = Dt,\n    e.prototype.add = xt,\n    e.prototype.subtract = Bt,\n    e.prototype.multiply = Kt,\n    e.prototype.divide = Ut,\n    e.prototype.remainder = Ot,\n    e.prototype.divideAndRemainder = Vt,\n    e.prototype.modPow = Gt,\n    e.prototype.modInverse = Wt,\n    e.prototype.pow = qt,\n    e.prototype.gcd = $t,\n    e.prototype.isProbablePrime = Qt,\n    e.prototype.square = At,\n    te.prototype.init = ee,\n    te.prototype.next = ie;\n    var Oe, Ve, Ne, Je = 256;\n    if (null == Ve) {\n        Ve = new Array,\n        Ne = 0;\n        var Ie;\n        if (window.crypto && window.crypto.getRandomValues) {\n            var Pe = new Uint32Array(256);\n            for (window.crypto.getRandomValues(Pe),\n            Ie = 0; Ie < Pe.length; ++Ie)\n                Ve[Ne++] = 255 & Pe[Ie]\n        }\n        var Me = function(t) {\n            if (this.count = this.count || 0,\n            this.count >= 256 || Ne >= Je)\n                return void (window.removeEventListener ? window.removeEventListener(\"mousemove\", Me, !1) : window.detachEvent && window.detachEvent(\"onmousemove\", Me));\n            try {\n                var e = t.x + t.y;\n                Ve[Ne++] = 255 & e,\n                this.count += 1\n            } catch (i) {}\n        };\n        window.addEventListener ? window.addEventListener(\"mousemove\", Me, !1) : window.attachEvent && window.attachEvent(\"onmousemove\", Me)\n    }\n    oe.prototype.nextBytes = ne,\n    ue.prototype.doPublic = fe,\n    ue.prototype.setPublic = ce,\n    ue.prototype.encrypt = pe,\n    ue.prototype.doPrivate = ye,\n    ue.prototype.setPrivate = de,\n    ue.prototype.setPrivateEx = ge,\n    ue.prototype.generate = me,\n    ue.prototype.decrypt = ve,\n    // Copyright (c) 2011  Kevin M Burns Jr.\n    // All Rights Reserved.\n    // See \"LICENSE\" for details.\n    //\n    // Extension to jsbn which adds facilities for asynchronous RSA key generation\n    // Primarily created to avoid execution timeout on mobile devices\n    //\n    // http://www-cs-students.stanford.edu/~tjw/jsbn/\n    //\n    // ---\n    function() {\n        var t = function(t, r, s) {\n            var n = new oe\n              , o = t >> 1;\n            this.e = parseInt(r, 16);\n            var h = new e(r,16)\n              , a = this\n              , u = function() {\n                var r = function() {\n                    if (a.p.compareTo(a.q) <= 0) {\n                        var t = a.p;\n                        a.p = a.q,\n                        a.q = t\n                    }\n                    var i = a.p.subtract(e.ONE)\n                      , r = a.q.subtract(e.ONE)\n                      , n = i.multiply(r);\n                    0 == n.gcd(h).compareTo(e.ONE) ? (a.n = a.p.multiply(a.q),\n                    a.d = h.modInverse(n),\n                    a.dmp1 = a.d.mod(i),\n                    a.dmq1 = a.d.mod(r),\n                    a.coeff = a.q.modInverse(a.p),\n                    setTimeout(function() {\n                        s()\n                    }, 0)) : setTimeout(u, 0)\n                }\n                  , c = function() {\n                    a.q = i(),\n                    a.q.fromNumberAsync(o, 1, n, function() {\n                        a.q.subtract(e.ONE).gcda(h, function(t) {\n                            0 == t.compareTo(e.ONE) && a.q.isProbablePrime(10) ? setTimeout(r, 0) : setTimeout(c, 0)\n                        })\n                    })\n                }\n                  , f = function() {\n                    a.p = i(),\n                    a.p.fromNumberAsync(t - o, 1, n, function() {\n                        a.p.subtract(e.ONE).gcda(h, function(t) {\n                            0 == t.compareTo(e.ONE) && a.p.isProbablePrime(10) ? setTimeout(c, 0) : setTimeout(f, 0)\n                        })\n                    })\n                };\n                setTimeout(f, 0)\n            };\n            setTimeout(u, 0)\n        };\n        ue.prototype.generateAsync = t;\n        var r = function(t, e) {\n            var i = this.s < 0 ? this.negate() : this.clone()\n              , r = t.s < 0 ? t.negate() : t.clone();\n            if (i.compareTo(r) < 0) {\n                var s = i;\n                i = r,\n                r = s\n            }\n            var n = i.getLowestSetBit()\n              , o = r.getLowestSetBit();\n            if (0 > o)\n                return void e(i);\n            o > n && (o = n),\n            o > 0 && (i.rShiftTo(o, i),\n            r.rShiftTo(o, r));\n            var h = function() {\n                (n = i.getLowestSetBit()) > 0 && i.rShiftTo(n, i),\n                (n = r.getLowestSetBit()) > 0 && r.rShiftTo(n, r),\n                i.compareTo(r) >= 0 ? (i.subTo(r, i),\n                i.rShiftTo(1, i)) : (r.subTo(i, r),\n                r.rShiftTo(1, r)),\n                i.signum() > 0 ? setTimeout(h, 0) : (o > 0 && r.lShiftTo(o, r),\n                setTimeout(function() {\n                    e(r)\n                }, 0))\n            };\n            setTimeout(h, 10)\n        };\n        e.prototype.gcda = r;\n        var s = function(t, i, r, s) {\n            if (\"number\" == typeof i)\n                if (2 > t)\n                    this.fromInt(1);\n                else {\n                    this.fromNumber(t, r),\n                    this.testBit(t - 1) || this.bitwiseTo(e.ONE.shiftLeft(t - 1), ht, this),\n                    this.isEven() && this.dAddOffset(1, 0);\n                    var n = this\n                      , o = function() {\n                        n.dAddOffset(2, 0),\n                        n.bitLength() > t && n.subTo(e.ONE.shiftLeft(t - 1), n),\n                        n.isProbablePrime(i) ? setTimeout(function() {\n                            s()\n                        }, 0) : setTimeout(o, 0)\n                    };\n                    setTimeout(o, 0)\n                }\n            else {\n                var h = new Array\n                  , a = 7 & t;\n                h.length = (t >> 3) + 1,\n                i.nextBytes(h),\n                a > 0 ? h[0] &= (1 << a) - 1 : h[0] = 0,\n                this.fromString(h, 256)\n            }\n        };\n        e.prototype.fromNumberAsync = s\n    }();\n    var Le = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\n      , qe = \"=\"\n      , Ce = Ce || {};\n    Ce.env = Ce.env || {};\n    var He = Ce\n      , je = Object.prototype\n      , ke = \"[object Function]\"\n      , Fe = [\"toString\", \"valueOf\"];\n    Ce.env.parseUA = function(t) {\n        var e, i = function(t) {\n            var e = 0;\n            return parseFloat(t.replace(/\\./g, function() {\n                return 1 == e++ ? \"\" : \".\"\n            }))\n        }, r = navigator, s = {\n            ie: 0,\n            opera: 0,\n            gecko: 0,\n            webkit: 0,\n            chrome: 0,\n            mobile: null,\n            air: 0,\n            ipad: 0,\n            iphone: 0,\n            ipod: 0,\n            ios: null,\n            android: 0,\n            webos: 0,\n            caja: r && r.cajaVersion,\n            secure: !1,\n            os: null\n        }, n = t || navigator && navigator.userAgent, o = window && window.location, h = o && o.href;\n        return s.secure = h && 0 === h.toLowerCase().indexOf(\"https\"),\n        n && (/windows|win32/i.test(n) ? s.os = \"windows\" : /macintosh/i.test(n) ? s.os = \"macintosh\" : /rhino/i.test(n) && (s.os = \"rhino\"),\n        /KHTML/.test(n) && (s.webkit = 1),\n        e = n.match(/AppleWebKit\\/([^\\s]*)/),\n        e && e[1] && (s.webkit = i(e[1]),\n        / Mobile\\//.test(n) ? (s.mobile = \"Apple\",\n        e = n.match(/OS ([^\\s]*)/),\n        e && e[1] && (e = i(e[1].replace(\"_\", \".\"))),\n        s.ios = e,\n        s.ipad = s.ipod = s.iphone = 0,\n        e = n.match(/iPad|iPod|iPhone/),\n        e && e[0] && (s[e[0].toLowerCase()] = s.ios)) : (e = n.match(/NokiaN[^\\/]*|Android \\d\\.\\d|webOS\\/\\d\\.\\d/),\n        e && (s.mobile = e[0]),\n        /webOS/.test(n) && (s.mobile = \"WebOS\",\n        e = n.match(/webOS\\/([^\\s]*);/),\n        e && e[1] && (s.webos = i(e[1]))),\n        / Android/.test(n) && (s.mobile = \"Android\",\n        e = n.match(/Android ([^\\s]*);/),\n        e && e[1] && (s.android = i(e[1])))),\n        e = n.match(/Chrome\\/([^\\s]*)/),\n        e && e[1] ? s.chrome = i(e[1]) : (e = n.match(/AdobeAIR\\/([^\\s]*)/),\n        e && (s.air = e[0]))),\n        s.webkit || (e = n.match(/Opera[\\s\\/]([^\\s]*)/),\n        e && e[1] ? (s.opera = i(e[1]),\n        e = n.match(/Version\\/([^\\s]*)/),\n        e && e[1] && (s.opera = i(e[1])),\n        e = n.match(/Opera Mini[^;]*/),\n        e && (s.mobile = e[0])) : (e = n.match(/MSIE\\s([^;]*)/),\n        e && e[1] ? s.ie = i(e[1]) : (e = n.match(/Gecko\\/([^\\s]*)/),\n        e && (s.gecko = 1,\n        e = n.match(/rv:([^\\s\\)]*)/),\n        e && e[1] && (s.gecko = i(e[1]))))))),\n        s\n    }\n    ,\n    Ce.env.ua = Ce.env.parseUA(),\n    Ce.isFunction = function(t) {\n        return \"function\" == typeof t || je.toString.apply(t) === ke\n    }\n    ,\n    Ce._IEEnumFix = Ce.env.ua.ie ? function(t, e) {\n        var i, r, s;\n        for (i = 0; i < Fe.length; i += 1)\n            r = Fe[i],\n            s = e[r],\n            He.isFunction(s) && s != je[r] && (t[r] = s)\n    }\n    : function() {}\n    ,\n    Ce.extend = function(t, e, i) {\n        if (!e || !t)\n            throw new Error(\"extend failed, please check that all dependencies are included.\");\n        var r, s = function() {};\n        if (s.prototype = e.prototype,\n        t.prototype = new s,\n        t.prototype.constructor = t,\n        t.superclass = e.prototype,\n        e.prototype.constructor == je.constructor && (e.prototype.constructor = e),\n        i) {\n            for (r in i)\n                He.hasOwnProperty(i, r) && (t.prototype[r] = i[r]);\n            He._IEEnumFix(t.prototype, i)\n        }\n    }\n    ,\n    /*\n * asn1.js - ASN.1 DER encoder classes\n *\n * Copyright (c) 2013 Kenji Urushima (kenji.urushima@gmail.com)\n *\n * This software is licensed under the terms of the MIT License.\n * http://kjur.github.com/jsrsasign/license\n *\n * The above copyright and license notice shall be\n * included in all copies or substantial portions of the Software.\n */\n    /**\n * @fileOverview\n * @name asn1-1.0.js\n * @author Kenji Urushima kenji.urushima@gmail.com\n * @version 1.0.2 (2013-May-30)\n * @since 2.1\n * @license <a href=\"http://kjur.github.io/jsrsasign/license/\">MIT License</a>\n */\n    \"undefined\" != typeof KJUR && KJUR || (KJUR = {}),\n    \"undefined\" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}),\n    KJUR.asn1.ASN1Util = new function() {\n        this.integerToByteHex = function(t) {\n            var e = t.toString(16);\n            return e.length % 2 == 1 && (e = \"0\" + e),\n            e\n        }\n        ,\n        this.bigIntToMinTwosComplementsHex = function(t) {\n            var i = t.toString(16);\n            if (\"-\" != i.substr(0, 1))\n                i.length % 2 == 1 ? i = \"0\" + i : i.match(/^[0-7]/) || (i = \"00\" + i);\n            else {\n                var r = i.substr(1)\n                  , s = r.length;\n                s % 2 == 1 ? s += 1 : i.match(/^[0-7]/) || (s += 2);\n                for (var n = \"\", o = 0; s > o; o++)\n                    n += \"f\";\n                var h = new e(n,16)\n                  , a = h.xor(t).add(e.ONE);\n                i = a.toString(16).replace(/^-/, \"\")\n            }\n            return i\n        }\n        ,\n        this.getPEMStringFromHex = function(t, e) {\n            var i = CryptoJS.enc.Hex.parse(t)\n              , r = CryptoJS.enc.Base64.stringify(i)\n              , s = r.replace(/(.{64})/g, \"$1\\r\\n\");\n            return s = s.replace(/\\r\\n$/, \"\"),\n            \"-----BEGIN \" + e + \"-----\\r\\n\" + s + \"\\r\\n-----END \" + e + \"-----\\r\\n\"\n        }\n    }\n    ,\n    KJUR.asn1.ASN1Object = function() {\n        var t = \"\";\n        this.getLengthHexFromValue = function() {\n            if (\"undefined\" == typeof this.hV || null == this.hV)\n                throw \"this.hV is null or undefined.\";\n            if (this.hV.length % 2 == 1)\n                throw \"value hex must be even length: n=\" + t.length + \",v=\" + this.hV;\n            var e = this.hV.length / 2\n              , i = e.toString(16);\n            if (i.length % 2 == 1 && (i = \"0\" + i),\n            128 > e)\n                return i;\n            var r = i.length / 2;\n            if (r > 15)\n                throw \"ASN.1 length too long to represent by 8x: n = \" + e.toString(16);\n            var s = 128 + r;\n            return s.toString(16) + i\n        }\n        ,\n        this.getEncodedHex = function() {\n            return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(),\n            this.hL = this.getLengthHexFromValue(),\n            this.hTLV = this.hT + this.hL + this.hV,\n            this.isModified = !1),\n            this.hTLV\n        }\n        ,\n        this.getValueHex = function() {\n            return this.getEncodedHex(),\n            this.hV\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return \"\"\n        }\n    }\n    ,\n    KJUR.asn1.DERAbstractString = function(t) {\n        KJUR.asn1.DERAbstractString.superclass.constructor.call(this);\n        this.getString = function() {\n            return this.s\n        }\n        ,\n        this.setString = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = t,\n            this.hV = stohex(this.s)\n        }\n        ,\n        this.setStringHex = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = null,\n            this.hV = t\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.str ? this.setString(t.str) : \"undefined\" != typeof t.hex && this.setStringHex(t.hex))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERAbstractTime = function(t) {\n        KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);\n        this.localDateToUTC = function(t) {\n            utc = t.getTime() + 6e4 * t.getTimezoneOffset();\n            var e = new Date(utc);\n            return e\n        }\n        ,\n        this.formatDate = function(t, e) {\n            var i = this.zeroPadding\n              , r = this.localDateToUTC(t)\n              , s = String(r.getFullYear());\n            \"utc\" == e && (s = s.substr(2, 2));\n            var n = i(String(r.getMonth() + 1), 2)\n              , o = i(String(r.getDate()), 2)\n              , h = i(String(r.getHours()), 2)\n              , a = i(String(r.getMinutes()), 2)\n              , u = i(String(r.getSeconds()), 2);\n            return s + n + o + h + a + u + \"Z\"\n        }\n        ,\n        this.zeroPadding = function(t, e) {\n            return t.length >= e ? t : new Array(e - t.length + 1).join(\"0\") + t\n        }\n        ,\n        this.getString = function() {\n            return this.s\n        }\n        ,\n        this.setString = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = t,\n            this.hV = stohex(this.s)\n        }\n        ,\n        this.setByDateValue = function(t, e, i, r, s, n) {\n            var o = new Date(Date.UTC(t, e - 1, i, r, s, n, 0));\n            this.setByDate(o)\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERAbstractStructured = function(t) {\n        KJUR.asn1.DERAbstractString.superclass.constructor.call(this);\n        this.setByASN1ObjectArray = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.asn1Array = t\n        }\n        ,\n        this.appendASN1Object = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.asn1Array.push(t)\n        }\n        ,\n        this.asn1Array = new Array,\n        \"undefined\" != typeof t && \"undefined\" != typeof t.array && (this.asn1Array = t.array)\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERBoolean = function() {\n        KJUR.asn1.DERBoolean.superclass.constructor.call(this),\n        this.hT = \"01\",\n        this.hTLV = \"0101ff\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERInteger = function(t) {\n        KJUR.asn1.DERInteger.superclass.constructor.call(this),\n        this.hT = \"02\",\n        this.setByBigInteger = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)\n        }\n        ,\n        this.setByInteger = function(t) {\n            var i = new e(String(t),10);\n            this.setByBigInteger(i)\n        }\n        ,\n        this.setValueHex = function(t) {\n            this.hV = t\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.bigint ? this.setByBigInteger(t.bigint) : \"undefined\" != typeof t[\"int\"] ? this.setByInteger(t[\"int\"]) : \"undefined\" != typeof t.hex && this.setValueHex(t.hex))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERBitString = function(t) {\n        KJUR.asn1.DERBitString.superclass.constructor.call(this),\n        this.hT = \"03\",\n        this.setHexValueIncludingUnusedBits = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = t\n        }\n        ,\n        this.setUnusedBitsAndHexValue = function(t, e) {\n            if (0 > t || t > 7)\n                throw \"unused bits shall be from 0 to 7: u = \" + t;\n            var i = \"0\" + t;\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = i + e\n        }\n        ,\n        this.setByBinaryString = function(t) {\n            t = t.replace(/0+$/, \"\");\n            var e = 8 - t.length % 8;\n            8 == e && (e = 0);\n            for (var i = 0; e >= i; i++)\n                t += \"0\";\n            for (var r = \"\", i = 0; i < t.length - 1; i += 8) {\n                var s = t.substr(i, 8)\n                  , n = parseInt(s, 2).toString(16);\n                1 == n.length && (n = \"0\" + n),\n                r += n\n            }\n            this.hTLV = null,\n            this.isModified = !0,\n            this.hV = \"0\" + e + r\n        }\n        ,\n        this.setByBooleanArray = function(t) {\n            for (var e = \"\", i = 0; i < t.length; i++)\n                e += 1 == t[i] ? \"1\" : \"0\";\n            this.setByBinaryString(e)\n        }\n        ,\n        this.newFalseArray = function(t) {\n            for (var e = new Array(t), i = 0; t > i; i++)\n                e[i] = !1;\n            return e\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.hex ? this.setHexValueIncludingUnusedBits(t.hex) : \"undefined\" != typeof t.bin ? this.setByBinaryString(t.bin) : \"undefined\" != typeof t.array && this.setByBooleanArray(t.array))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DEROctetString = function(t) {\n        KJUR.asn1.DEROctetString.superclass.constructor.call(this, t),\n        this.hT = \"04\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERNull = function() {\n        KJUR.asn1.DERNull.superclass.constructor.call(this),\n        this.hT = \"05\",\n        this.hTLV = \"0500\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERObjectIdentifier = function(t) {\n        var i = function(t) {\n            var e = t.toString(16);\n            return 1 == e.length && (e = \"0\" + e),\n            e\n        }\n          , r = function(t) {\n            var r = \"\"\n              , s = new e(t,10)\n              , n = s.toString(2)\n              , o = 7 - n.length % 7;\n            7 == o && (o = 0);\n            for (var h = \"\", a = 0; o > a; a++)\n                h += \"0\";\n            n = h + n;\n            for (var a = 0; a < n.length - 1; a += 7) {\n                var u = n.substr(a, 7);\n                a != n.length - 7 && (u = \"1\" + u),\n                r += i(parseInt(u, 2))\n            }\n            return r\n        };\n        KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this),\n        this.hT = \"06\",\n        this.setValueHex = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = null,\n            this.hV = t\n        }\n        ,\n        this.setValueOidString = function(t) {\n            if (!t.match(/^[0-9.]+$/))\n                throw \"malformed oid string: \" + t;\n            var e = \"\"\n              , s = t.split(\".\")\n              , n = 40 * parseInt(s[0]) + parseInt(s[1]);\n            e += i(n),\n            s.splice(0, 2);\n            for (var o = 0; o < s.length; o++)\n                e += r(s[o]);\n            this.hTLV = null,\n            this.isModified = !0,\n            this.s = null,\n            this.hV = e\n        }\n        ,\n        this.setValueName = function(t) {\n            if (\"undefined\" == typeof KJUR.asn1.x509.OID.name2oidList[t])\n                throw \"DERObjectIdentifier oidName undefined: \" + t;\n            var e = KJUR.asn1.x509.OID.name2oidList[t];\n            this.setValueOidString(e)\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.oid ? this.setValueOidString(t.oid) : \"undefined\" != typeof t.hex ? this.setValueHex(t.hex) : \"undefined\" != typeof t.name && this.setValueName(t.name))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object),\n    KJUR.asn1.DERUTF8String = function(t) {\n        KJUR.asn1.DERUTF8String.superclass.constructor.call(this, t),\n        this.hT = \"0c\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERNumericString = function(t) {\n        KJUR.asn1.DERNumericString.superclass.constructor.call(this, t),\n        this.hT = \"12\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERPrintableString = function(t) {\n        KJUR.asn1.DERPrintableString.superclass.constructor.call(this, t),\n        this.hT = \"13\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERTeletexString = function(t) {\n        KJUR.asn1.DERTeletexString.superclass.constructor.call(this, t),\n        this.hT = \"14\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERIA5String = function(t) {\n        KJUR.asn1.DERIA5String.superclass.constructor.call(this, t),\n        this.hT = \"16\"\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString),\n    KJUR.asn1.DERUTCTime = function(t) {\n        KJUR.asn1.DERUTCTime.superclass.constructor.call(this, t),\n        this.hT = \"17\",\n        this.setByDate = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.date = t,\n            this.s = this.formatDate(this.date, \"utc\"),\n            this.hV = stohex(this.s)\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.str ? this.setString(t.str) : \"undefined\" != typeof t.hex ? this.setStringHex(t.hex) : \"undefined\" != typeof t.date && this.setByDate(t.date))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime),\n    KJUR.asn1.DERGeneralizedTime = function(t) {\n        KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, t),\n        this.hT = \"18\",\n        this.setByDate = function(t) {\n            this.hTLV = null,\n            this.isModified = !0,\n            this.date = t,\n            this.s = this.formatDate(this.date, \"gen\"),\n            this.hV = stohex(this.s)\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.str ? this.setString(t.str) : \"undefined\" != typeof t.hex ? this.setStringHex(t.hex) : \"undefined\" != typeof t.date && this.setByDate(t.date))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime),\n    KJUR.asn1.DERSequence = function(t) {\n        KJUR.asn1.DERSequence.superclass.constructor.call(this, t),\n        this.hT = \"30\",\n        this.getFreshValueHex = function() {\n            for (var t = \"\", e = 0; e < this.asn1Array.length; e++) {\n                var i = this.asn1Array[e];\n                t += i.getEncodedHex()\n            }\n            return this.hV = t,\n            this.hV\n        }\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured),\n    KJUR.asn1.DERSet = function(t) {\n        KJUR.asn1.DERSet.superclass.constructor.call(this, t),\n        this.hT = \"31\",\n        this.getFreshValueHex = function() {\n            for (var t = new Array, e = 0; e < this.asn1Array.length; e++) {\n                var i = this.asn1Array[e];\n                t.push(i.getEncodedHex())\n            }\n            return t.sort(),\n            this.hV = t.join(\"\"),\n            this.hV\n        }\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured),\n    KJUR.asn1.DERTaggedObject = function(t) {\n        KJUR.asn1.DERTaggedObject.superclass.constructor.call(this),\n        this.hT = \"a0\",\n        this.hV = \"\",\n        this.isExplicit = !0,\n        this.asn1Object = null,\n        this.setASN1Object = function(t, e, i) {\n            this.hT = e,\n            this.isExplicit = t,\n            this.asn1Object = i,\n            this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(),\n            this.hTLV = null,\n            this.isModified = !0) : (this.hV = null,\n            this.hTLV = i.getEncodedHex(),\n            this.hTLV = this.hTLV.replace(/^../, e),\n            this.isModified = !1)\n        }\n        ,\n        this.getFreshValueHex = function() {\n            return this.hV\n        }\n        ,\n        \"undefined\" != typeof t && (\"undefined\" != typeof t.tag && (this.hT = t.tag),\n        \"undefined\" != typeof t.explicit && (this.isExplicit = t.explicit),\n        \"undefined\" != typeof t.obj && (this.asn1Object = t.obj,\n        this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)))\n    }\n    ,\n    Ce.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object),\n    // Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n    // copyright notice and this permission notice appear in all copies.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n    // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n    // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n    // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n    // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n    // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n    // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n    function(t) {\n        \"use strict\";\n        var e, i = {};\n        i.decode = function(i) {\n            var r;\n            if (e === t) {\n                var s = \"0123456789ABCDEF\"\n                  , n = \" \\f\\n\\r\t \\u2028\\u2029\";\n                for (e = [],\n                r = 0; 16 > r; ++r)\n                    e[s.charAt(r)] = r;\n                for (s = s.toLowerCase(),\n                r = 10; 16 > r; ++r)\n                    e[s.charAt(r)] = r;\n                for (r = 0; r < n.length; ++r)\n                    e[n.charAt(r)] = -1\n            }\n            var o = []\n              , h = 0\n              , a = 0;\n            for (r = 0; r < i.length; ++r) {\n                var u = i.charAt(r);\n                if (\"=\" == u)\n                    break;\n                if (u = e[u],\n                -1 != u) {\n                    if (u === t)\n                        throw \"Illegal character at offset \" + r;\n                    h |= u,\n                    ++a >= 2 ? (o[o.length] = h,\n                    h = 0,\n                    a = 0) : h <<= 4\n                }\n            }\n            if (a)\n                throw \"Hex encoding incomplete: 4 bits missing\";\n            return o\n        }\n        ,\n        window.Hex = i\n    }(),\n    // Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n    // copyright notice and this permission notice appear in all copies.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n    // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n    // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n    // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n    // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n    // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n    // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n    function(t) {\n        \"use strict\";\n        var e, i = {};\n        i.decode = function(i) {\n            var r;\n            if (e === t) {\n                var s = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\n                  , n = \"= \\f\\n\\r\t \\u2028\\u2029\";\n                for (e = [],\n                r = 0; 64 > r; ++r)\n                    e[s.charAt(r)] = r;\n                for (r = 0; r < n.length; ++r)\n                    e[n.charAt(r)] = -1\n            }\n            var o = []\n              , h = 0\n              , a = 0;\n            for (r = 0; r < i.length; ++r) {\n                var u = i.charAt(r);\n                if (\"=\" == u)\n                    break;\n                if (u = e[u],\n                -1 != u) {\n                    if (u === t)\n                        throw \"Illegal character at offset \" + r;\n                    h |= u,\n                    ++a >= 4 ? (o[o.length] = h >> 16,\n                    o[o.length] = h >> 8 & 255,\n                    o[o.length] = 255 & h,\n                    h = 0,\n                    a = 0) : h <<= 6\n                }\n            }\n            switch (a) {\n            case 1:\n                throw \"Base64 encoding incomplete: at least 2 bits missing\";\n            case 2:\n                o[o.length] = h >> 10;\n                break;\n            case 3:\n                o[o.length] = h >> 16,\n                o[o.length] = h >> 8 & 255\n            }\n            return o\n        }\n        ,\n        i.re = /-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n        i.unarmor = function(t) {\n            var e = i.re.exec(t);\n            if (e)\n                if (e[1])\n                    t = e[1];\n                else {\n                    if (!e[2])\n                        throw \"RegExp out of sync\";\n                    t = e[2]\n                }\n            return i.decode(t)\n        }\n        ,\n        window.Base64 = i\n    }(),\n    // Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n    // copyright notice and this permission notice appear in all copies.\n    //\n    // THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n    // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n    // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n    // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n    // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n    // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n    // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n    function(t) {\n        \"use strict\";\n        function e(t, i) {\n            t instanceof e ? (this.enc = t.enc,\n            this.pos = t.pos) : (this.enc = t,\n            this.pos = i)\n        }\n        function i(t, e, i, r, s) {\n            this.stream = t,\n            this.header = e,\n            this.length = i,\n            this.tag = r,\n            this.sub = s\n        }\n        var r = 100\n          , s = \"…\"\n          , n = {\n            tag: function(t, e) {\n                var i = document.createElement(t);\n                return i.className = e,\n                i\n            },\n            text: function(t) {\n                return document.createTextNode(t)\n            }\n        };\n        e.prototype.get = function(e) {\n            if (e === t && (e = this.pos++),\n            e >= this.enc.length)\n                throw \"Requesting byte offset \" + e + \" on a stream of length \" + this.enc.length;\n            return this.enc[e]\n        }\n        ,\n        e.prototype.hexDigits = \"0123456789ABCDEF\",\n        e.prototype.hexByte = function(t) {\n            return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(15 & t)\n        }\n        ,\n        e.prototype.hexDump = function(t, e, i) {\n            for (var r = \"\", s = t; e > s; ++s)\n                if (r += this.hexByte(this.get(s)),\n                i !== !0)\n                    switch (15 & s) {\n                    case 7:\n                        r += \"  \";\n                        break;\n                    case 15:\n                        r += \"\\n\";\n                        break;\n                    default:\n                        r += \" \"\n                    }\n            return r\n        }\n        ,\n        e.prototype.parseStringISO = function(t, e) {\n            for (var i = \"\", r = t; e > r; ++r)\n                i += String.fromCharCode(this.get(r));\n            return i\n        }\n        ,\n        e.prototype.parseStringUTF = function(t, e) {\n            for (var i = \"\", r = t; e > r; ) {\n                var s = this.get(r++);\n                i += 128 > s ? String.fromCharCode(s) : s > 191 && 224 > s ? String.fromCharCode((31 & s) << 6 | 63 & this.get(r++)) : String.fromCharCode((15 & s) << 12 | (63 & this.get(r++)) << 6 | 63 & this.get(r++))\n            }\n            return i\n        }\n        ,\n        e.prototype.parseStringBMP = function(t, e) {\n            for (var i = \"\", r = t; e > r; r += 2) {\n                var s = this.get(r)\n                  , n = this.get(r + 1);\n                i += String.fromCharCode((s << 8) + n)\n            }\n            return i\n        }\n        ,\n        e.prototype.reTime = /^((?:1[89]|2\\d)?\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/,\n        e.prototype.parseTime = function(t, e) {\n            var i = this.parseStringISO(t, e)\n              , r = this.reTime.exec(i);\n            return r ? (i = r[1] + \"-\" + r[2] + \"-\" + r[3] + \" \" + r[4],\n            r[5] && (i += \":\" + r[5],\n            r[6] && (i += \":\" + r[6],\n            r[7] && (i += \".\" + r[7]))),\n            r[8] && (i += \" UTC\",\n            \"Z\" != r[8] && (i += r[8],\n            r[9] && (i += \":\" + r[9]))),\n            i) : \"Unrecognized time: \" + i\n        }\n        ,\n        e.prototype.parseInteger = function(t, e) {\n            var i = e - t;\n            if (i > 4) {\n                i <<= 3;\n                var r = this.get(t);\n                if (0 === r)\n                    i -= 8;\n                else\n                    for (; 128 > r; )\n                        r <<= 1,\n                        --i;\n                return \"(\" + i + \" bit)\"\n            }\n            for (var s = 0, n = t; e > n; ++n)\n                s = s << 8 | this.get(n);\n            return s\n        }\n        ,\n        e.prototype.parseBitString = function(t, e) {\n            var i = this.get(t)\n              , r = (e - t - 1 << 3) - i\n              , s = \"(\" + r + \" bit)\";\n            if (20 >= r) {\n                var n = i;\n                s += \" \";\n                for (var o = e - 1; o > t; --o) {\n                    for (var h = this.get(o), a = n; 8 > a; ++a)\n                        s += h >> a & 1 ? \"1\" : \"0\";\n                    n = 0\n                }\n            }\n            return s\n        }\n        ,\n        e.prototype.parseOctetString = function(t, e) {\n            var i = e - t\n              , n = \"(\" + i + \" byte) \";\n            i > r && (e = t + r);\n            for (var o = t; e > o; ++o)\n                n += this.hexByte(this.get(o));\n            return i > r && (n += s),\n            n\n        }\n        ,\n        e.prototype.parseOID = function(t, e) {\n            for (var i = \"\", r = 0, s = 0, n = t; e > n; ++n) {\n                var o = this.get(n);\n                if (r = r << 7 | 127 & o,\n                s += 7,\n                !(128 & o)) {\n                    if (\"\" === i) {\n                        var h = 80 > r ? 40 > r ? 0 : 1 : 2;\n                        i = h + \".\" + (r - 40 * h)\n                    } else\n                        i += \".\" + (s >= 31 ? \"bigint\" : r);\n                    r = s = 0\n                }\n            }\n            return i\n        }\n        ,\n        i.prototype.typeName = function() {\n            if (this.tag === t)\n                return \"unknown\";\n            var e = this.tag >> 6\n              , i = (this.tag >> 5 & 1,\n            31 & this.tag);\n            switch (e) {\n            case 0:\n                switch (i) {\n                case 0:\n                    return \"EOC\";\n                case 1:\n                    return \"BOOLEAN\";\n                case 2:\n                    return \"INTEGER\";\n                case 3:\n                    return \"BIT_STRING\";\n                case 4:\n                    return \"OCTET_STRING\";\n                case 5:\n                    return \"NULL\";\n                case 6:\n                    return \"OBJECT_IDENTIFIER\";\n                case 7:\n                    return \"ObjectDescriptor\";\n                case 8:\n                    return \"EXTERNAL\";\n                case 9:\n                    return \"REAL\";\n                case 10:\n                    return \"ENUMERATED\";\n                case 11:\n                    return \"EMBEDDED_PDV\";\n                case 12:\n                    return \"UTF8String\";\n                case 16:\n                    return \"SEQUENCE\";\n                case 17:\n                    return \"SET\";\n                case 18:\n                    return \"NumericString\";\n                case 19:\n                    return \"PrintableString\";\n                case 20:\n                    return \"TeletexString\";\n                case 21:\n                    return \"VideotexString\";\n                case 22:\n                    return \"IA5String\";\n                case 23:\n                    return \"UTCTime\";\n                case 24:\n                    return \"GeneralizedTime\";\n                case 25:\n                    return \"GraphicString\";\n                case 26:\n                    return \"VisibleString\";\n                case 27:\n                    return \"GeneralString\";\n                case 28:\n                    return \"UniversalString\";\n                case 30:\n                    return \"BMPString\";\n                default:\n                    return \"Universal_\" + i.toString(16)\n                }\n            case 1:\n                return \"Application_\" + i.toString(16);\n            case 2:\n                return \"[\" + i + \"]\";\n            case 3:\n                return \"Private_\" + i.toString(16)\n            }\n        }\n        ,\n        i.prototype.reSeemsASCII = /^[ -~]+$/,\n        i.prototype.content = function() {\n            if (this.tag === t)\n                return null;\n            var e = this.tag >> 6\n              , i = 31 & this.tag\n              , n = this.posContent()\n              , o = Math.abs(this.length);\n            if (0 !== e) {\n                if (null !== this.sub)\n                    return \"(\" + this.sub.length + \" elem)\";\n                var h = this.stream.parseStringISO(n, n + Math.min(o, r));\n                return this.reSeemsASCII.test(h) ? h.substring(0, 2 * r) + (h.length > 2 * r ? s : \"\") : this.stream.parseOctetString(n, n + o)\n            }\n            switch (i) {\n            case 1:\n                return 0 === this.stream.get(n) ? \"false\" : \"true\";\n            case 2:\n                return this.stream.parseInteger(n, n + o);\n            case 3:\n                return this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseBitString(n, n + o);\n            case 4:\n                return this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseOctetString(n, n + o);\n            case 6:\n                return this.stream.parseOID(n, n + o);\n            case 16:\n            case 17:\n                return \"(\" + this.sub.length + \" elem)\";\n            case 12:\n                return this.stream.parseStringUTF(n, n + o);\n            case 18:\n            case 19:\n            case 20:\n            case 21:\n            case 22:\n            case 26:\n                return this.stream.parseStringISO(n, n + o);\n            case 30:\n                return this.stream.parseStringBMP(n, n + o);\n            case 23:\n            case 24:\n                return this.stream.parseTime(n, n + o)\n            }\n            return null\n        }\n        ,\n        i.prototype.toString = function() {\n            return this.typeName() + \"@\" + this.stream.pos + \"[header:\" + this.header + \",length:\" + this.length + \",sub:\" + (null === this.sub ? \"null\" : this.sub.length) + \"]\"\n        }\n        ,\n        i.prototype.print = function(e) {\n            if (e === t && (e = \"\"),\n            document.writeln(e + this),\n            null !== this.sub) {\n                e += \"  \";\n                for (var i = 0, r = this.sub.length; r > i; ++i)\n                    this.sub[i].print(e)\n            }\n        }\n        ,\n        i.prototype.toPrettyString = function(e) {\n            e === t && (e = \"\");\n            var i = e + this.typeName() + \" @\" + this.stream.pos;\n            if (this.length >= 0 && (i += \"+\"),\n            i += this.length,\n            32 & this.tag ? i += \" (constructed)\" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += \" (encapsulates)\"),\n            i += \"\\n\",\n            null !== this.sub) {\n                e += \"  \";\n                for (var r = 0, s = this.sub.length; s > r; ++r)\n                    i += this.sub[r].toPrettyString(e)\n            }\n            return i\n        }\n        ,\n        i.prototype.toDOM = function() {\n            var t = n.tag(\"div\", \"node\");\n            t.asn1 = this;\n            var e = n.tag(\"div\", \"head\")\n              , i = this.typeName().replace(/_/g, \" \");\n            e.innerHTML = i;\n            var r = this.content();\n            if (null !== r) {\n                r = String(r).replace(/</g, \"&lt;\");\n                var s = n.tag(\"span\", \"preview\");\n                s.appendChild(n.text(r)),\n                e.appendChild(s)\n            }\n            t.appendChild(e),\n            this.node = t,\n            this.head = e;\n            var o = n.tag(\"div\", \"value\");\n            if (i = \"Offset: \" + this.stream.pos + \"<br/>\",\n            i += \"Length: \" + this.header + \"+\",\n            i += this.length >= 0 ? this.length : -this.length + \" (undefined)\",\n            32 & this.tag ? i += \"<br/>(constructed)\" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += \"<br/>(encapsulates)\"),\n            null !== r && (i += \"<br/>Value:<br/><b>\" + r + \"</b>\",\n            \"object\" == typeof oids && 6 == this.tag)) {\n                var h = oids[r];\n                h && (h.d && (i += \"<br/>\" + h.d),\n                h.c && (i += \"<br/>\" + h.c),\n                h.w && (i += \"<br/>(warning!)\"))\n            }\n            o.innerHTML = i,\n            t.appendChild(o);\n            var a = n.tag(\"div\", \"sub\");\n            if (null !== this.sub)\n                for (var u = 0, c = this.sub.length; c > u; ++u)\n                    a.appendChild(this.sub[u].toDOM());\n            return t.appendChild(a),\n            e.onclick = function() {\n                t.className = \"node collapsed\" == t.className ? \"node\" : \"node collapsed\"\n            }\n            ,\n            t\n        }\n        ,\n        i.prototype.posStart = function() {\n            return this.stream.pos\n        }\n        ,\n        i.prototype.posContent = function() {\n            return this.stream.pos + this.header\n        }\n        ,\n        i.prototype.posEnd = function() {\n            return this.stream.pos + this.header + Math.abs(this.length)\n        }\n        ,\n        i.prototype.fakeHover = function(t) {\n            this.node.className += \" hover\",\n            t && (this.head.className += \" hover\")\n        }\n        ,\n        i.prototype.fakeOut = function(t) {\n            var e = / ?hover/;\n            this.node.className = this.node.className.replace(e, \"\"),\n            t && (this.head.className = this.head.className.replace(e, \"\"))\n        }\n        ,\n        i.prototype.toHexDOM_sub = function(t, e, i, r, s) {\n            if (!(r >= s)) {\n                var o = n.tag(\"span\", e);\n                o.appendChild(n.text(i.hexDump(r, s))),\n                t.appendChild(o)\n            }\n        }\n        ,\n        i.prototype.toHexDOM = function(e) {\n            var i = n.tag(\"span\", \"hex\");\n            if (e === t && (e = i),\n            this.head.hexNode = i,\n            this.head.onmouseover = function() {\n                this.hexNode.className = \"hexCurrent\"\n            }\n            ,\n            this.head.onmouseout = function() {\n                this.hexNode.className = \"hex\"\n            }\n            ,\n            i.asn1 = this,\n            i.onmouseover = function() {\n                var t = !e.selected;\n                t && (e.selected = this.asn1,\n                this.className = \"hexCurrent\"),\n                this.asn1.fakeHover(t)\n            }\n            ,\n            i.onmouseout = function() {\n                var t = e.selected == this.asn1;\n                this.asn1.fakeOut(t),\n                t && (e.selected = null,\n                this.className = \"hex\")\n            }\n            ,\n            this.toHexDOM_sub(i, \"tag\", this.stream, this.posStart(), this.posStart() + 1),\n            this.toHexDOM_sub(i, this.length >= 0 ? \"dlen\" : \"ulen\", this.stream, this.posStart() + 1, this.posContent()),\n            null === this.sub)\n                i.appendChild(n.text(this.stream.hexDump(this.posContent(), this.posEnd())));\n            else if (this.sub.length > 0) {\n                var r = this.sub[0]\n                  , s = this.sub[this.sub.length - 1];\n                this.toHexDOM_sub(i, \"intro\", this.stream, this.posContent(), r.posStart());\n                for (var o = 0, h = this.sub.length; h > o; ++o)\n                    i.appendChild(this.sub[o].toHexDOM(e));\n                this.toHexDOM_sub(i, \"outro\", this.stream, s.posEnd(), this.posEnd())\n            }\n            return i\n        }\n        ,\n        i.prototype.toHexString = function(t) {\n            return this.stream.hexDump(this.posStart(), this.posEnd(), !0)\n        }\n        ,\n        i.decodeLength = function(t) {\n            var e = t.get()\n              , i = 127 & e;\n            if (i == e)\n                return i;\n            if (i > 3)\n                throw \"Length over 24 bits not supported at position \" + (t.pos - 1);\n            if (0 === i)\n                return -1;\n            e = 0;\n            for (var r = 0; i > r; ++r)\n                e = e << 8 | t.get();\n            return e\n        }\n        ,\n        i.hasContent = function(t, r, s) {\n            if (32 & t)\n                return !0;\n            if (3 > t || t > 4)\n                return !1;\n            var n = new e(s);\n            3 == t && n.get();\n            var o = n.get();\n            if (o >> 6 & 1)\n                return !1;\n            try {\n                var h = i.decodeLength(n);\n                return n.pos - s.pos + h == r\n            } catch (a) {\n                return !1\n            }\n        }\n        ,\n        i.decode = function(t) {\n            t instanceof e || (t = new e(t,0));\n            var r = new e(t)\n              , s = t.get()\n              , n = i.decodeLength(t)\n              , o = t.pos - r.pos\n              , h = null;\n            if (i.hasContent(s, n, t)) {\n                var a = t.pos;\n                if (3 == s && t.get(),\n                h = [],\n                n >= 0) {\n                    for (var u = a + n; t.pos < u; )\n                        h[h.length] = i.decode(t);\n                    if (t.pos != u)\n                        throw \"Content size is not correct for container starting at offset \" + a\n                } else\n                    try {\n                        for (; ; ) {\n                            var c = i.decode(t);\n                            if (0 === c.tag)\n                                break;\n                            h[h.length] = c\n                        }\n                        n = a - t.pos\n                    } catch (f) {\n                        throw \"Exception while decoding undefined length content: \" + f\n                    }\n            } else\n                t.pos += n;\n            return new i(r,o,n,s,h)\n        }\n        ,\n        i.test = function() {\n            for (var t = [{\n                value: [39],\n                expected: 39\n            }, {\n                value: [129, 201],\n                expected: 201\n            }, {\n                value: [131, 254, 220, 186],\n                expected: 16702650\n            }], r = 0, s = t.length; s > r; ++r) {\n                var n = new e(t[r].value,0)\n                  , o = i.decodeLength(n);\n                o != t[r].expected && document.write(\"In test[\" + r + \"] expected \" + t[r].expected + \" got \" + o + \"\\n\")\n            }\n        }\n        ,\n        window.ASN1 = i\n    }(),\n    ASN1.prototype.getHexStringValue = function() {\n        var t = this.toHexString()\n          , e = 2 * this.header\n          , i = 2 * this.length;\n        return t.substr(e, i)\n    }\n    ,\n    ue.prototype.parseKey = function(t) {\n        try {\n            var e = 0\n              , i = 0\n              , r = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/\n              , s = r.test(t) ? Hex.decode(t) : Base64.unarmor(t)\n              , n = ASN1.decode(s);\n            if (3 === n.sub.length && (n = n.sub[2].sub[0]),\n            9 === n.sub.length) {\n                e = n.sub[1].getHexStringValue(),\n                this.n = he(e, 16),\n                i = n.sub[2].getHexStringValue(),\n                this.e = parseInt(i, 16);\n                var o = n.sub[3].getHexStringValue();\n                this.d = he(o, 16);\n                var h = n.sub[4].getHexStringValue();\n                this.p = he(h, 16);\n                var a = n.sub[5].getHexStringValue();\n                this.q = he(a, 16);\n                var u = n.sub[6].getHexStringValue();\n                this.dmp1 = he(u, 16);\n                var c = n.sub[7].getHexStringValue();\n                this.dmq1 = he(c, 16);\n                var f = n.sub[8].getHexStringValue();\n                this.coeff = he(f, 16)\n            } else {\n                if (2 !== n.sub.length)\n                    return !1;\n                var p = n.sub[1]\n                  , l = p.sub[0];\n                e = l.sub[0].getHexStringValue(),\n                this.n = he(e, 16),\n                i = l.sub[1].getHexStringValue(),\n                this.e = parseInt(i, 16)\n            }\n            return !0\n        } catch (d) {\n            return !1\n        }\n    }\n    ,\n    ue.prototype.getPrivateBaseKey = function() {\n        var t = {\n            array: [new KJUR.asn1.DERInteger({\n                \"int\": 0\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.n\n            }), new KJUR.asn1.DERInteger({\n                \"int\": this.e\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.d\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.p\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.q\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.dmp1\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.dmq1\n            }), new KJUR.asn1.DERInteger({\n                bigint: this.coeff\n            })]\n        }\n          , e = new KJUR.asn1.DERSequence(t);\n        return e.getEncodedHex()\n    }\n    ,\n    ue.prototype.getPrivateBaseKeyB64 = function() {\n        return be(this.getPrivateBaseKey())\n    }\n    ,\n    ue.prototype.getPublicBaseKey = function() {\n        var t = {\n            array: [new KJUR.asn1.DERObjectIdentifier({\n                oid: \"1.2.840.113549.1.1.1\"\n            }), new KJUR.asn1.DERNull]\n        }\n          , e = new KJUR.asn1.DERSequence(t);\n        t = {\n            array: [new KJUR.asn1.DERInteger({\n                bigint: this.n\n            }), new KJUR.asn1.DERInteger({\n                \"int\": this.e\n            })]\n        };\n        var i = new KJUR.asn1.DERSequence(t);\n        t = {\n            hex: \"00\" + i.getEncodedHex()\n        };\n        var r = new KJUR.asn1.DERBitString(t);\n        t = {\n            array: [e, r]\n        };\n        var s = new KJUR.asn1.DERSequence(t);\n        return s.getEncodedHex()\n    }\n    ,\n    ue.prototype.getPublicBaseKeyB64 = function() {\n        return be(this.getPublicBaseKey())\n    }\n    ,\n    ue.prototype.wordwrap = function(t, e) {\n        if (e = e || 64,\n        !t)\n            return t;\n        var i = \"(.{1,\" + e + \"})( +|$\\n?)|(.{1,\" + e + \"})\";\n        return t.match(RegExp(i, \"g\")).join(\"\\n\")\n    }\n    ,\n    ue.prototype.getPrivateKey = function() {\n        var t = \"-----BEGIN RSA PRIVATE KEY-----\\n\";\n        return t += this.wordwrap(this.getPrivateBaseKeyB64()) + \"\\n\",\n        t += \"-----END RSA PRIVATE KEY-----\"\n    }\n    ,\n    ue.prototype.getPublicKey = function() {\n        var t = \"-----BEGIN PUBLIC KEY-----\\n\";\n        return t += this.wordwrap(this.getPublicBaseKeyB64()) + \"\\n\",\n        t += \"-----END PUBLIC KEY-----\"\n    }\n    ,\n    ue.prototype.hasPublicKeyProperty = function(t) {\n        return t = t || {},\n        t.hasOwnProperty(\"n\") && t.hasOwnProperty(\"e\")\n    }\n    ,\n    ue.prototype.hasPrivateKeyProperty = function(t) {\n        return t = t || {},\n        t.hasOwnProperty(\"n\") && t.hasOwnProperty(\"e\") && t.hasOwnProperty(\"d\") && t.hasOwnProperty(\"p\") && t.hasOwnProperty(\"q\") && t.hasOwnProperty(\"dmp1\") && t.hasOwnProperty(\"dmq1\") && t.hasOwnProperty(\"coeff\")\n    }\n    ,\n    ue.prototype.parsePropertiesFrom = function(t) {\n        this.n = t.n,\n        this.e = t.e,\n        t.hasOwnProperty(\"d\") && (this.d = t.d,\n        this.p = t.p,\n        this.q = t.q,\n        this.dmp1 = t.dmp1,\n        this.dmq1 = t.dmq1,\n        this.coeff = t.coeff)\n    }\n    ;\n    var _e = function(t) {\n        ue.call(this),\n        t && (\"string\" == typeof t ? this.parseKey(t) : (this.hasPrivateKeyProperty(t) || this.hasPublicKeyProperty(t)) && this.parsePropertiesFrom(t))\n    };\n    _e.prototype = new ue,\n    _e.prototype.constructor = _e;\n    var ze = function(t) {\n        t = t || {},\n        this.default_key_size = parseInt(t.default_key_size) || 1024,\n        this.default_public_exponent = t.default_public_exponent || \"010001\",\n        this.log = t.log || !1,\n        this.key = null\n    };\n    ze.prototype.setKey = function(t) {\n        this.log && this.key && console.warn(\"A key was already set, overriding existing.\"),\n        this.key = new _e(t)\n    }\n    ,\n    ze.prototype.setPrivateKey = function(t) {\n        this.setKey(t)\n    }\n    ,\n    ze.prototype.setPublicKey = function(t) {\n        this.setKey(t)\n    }\n    ,\n    ze.prototype.decrypt = function(t) {\n        try {\n            return this.getKey().decrypt(Te(t))\n        } catch (e) {\n            return !1\n        }\n    }\n    ,\n    ze.prototype.encrypt = function(t) {\n        try {\n            return be(this.getKey().encrypt(t))\n        } catch (e) {\n            return !1\n        }\n    }\n    ,\n    ze.prototype.getKey = function(t) {\n        if (!this.key) {\n            if (this.key = new _e,\n            t && \"[object Function]\" === {}.toString.call(t))\n                return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t);\n            this.key.generate(this.default_key_size, this.default_public_exponent)\n        }\n        return this.key\n    }\n    ,\n    ze.prototype.getPrivateKey = function() {\n        return this.getKey().getPrivateKey()\n    }\n    ,\n    ze.prototype.getPrivateKeyB64 = function() {\n        return this.getKey().getPrivateBaseKeyB64()\n    }\n    ,\n    ze.prototype.getPublicKey = function() {\n        return this.getKey().getPublicKey()\n    }\n    ,\n    ze.prototype.getPublicKeyB64 = function() {\n        return this.getKey().getPublicBaseKeyB64()\n    }\n    ,\n    ze.version = \"2.3.1\",\n    t.JSEncrypt = ze\n});\n\n\n\nfunction make(pwd) {\n    var encrypt = new JSEncrypt();\n    encrypt.setPublicKey(pubKey);\n    var enc = encrypt.encrypt(pwd);\n    return enc;\n}\n"
  },
  {
    "path": "其他实战/【百度】wap端sig生成/make_sig.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2020-01-13  Python: 3.7\n\n\"\"\"\nwap端 sig 参数生成\n应水友需求，帮忙弄的\n需要 V8 引擎！\n\"\"\"\n\nimport execjs\nimport os\n\nprint(execjs.get().name)\n\n\nwith open(os.path.dirname(__file__) + '/v3_update.js') as f:\n    js = execjs.compile(f.read())\n\n\n# dv 可固定， 用了一些随机参数生成的。\ndv = 'tk0.48553508531670751578885709447.0@mmy0VdnCHg9mlXM-7ZM-tbvB8YHXK3MIEg9WNa8V3x9Cqa5kqgOXcFOjca5BJWOB7eNIzY5k9j8VNKUk0~9F~~5rOiHXvivmzzHjJFMXubOG~W8VRln6~l9k0g9mlXM-7ZM-tbvB8YHXK3MIEg9WH~9V7x9Cql5kqgOXcFOjca5BJWOB7eNIzY5k9-9CRWUq__dy0ov8Cpy5k9j8S~W8Cpz9SlXM-7ZM-tbH-JSMIYaUktanm~F9VEg9WEj8VRgOXcFOjca5BJWOB7eNIzYUk0~9kHg9C9~5kEF8WqW9mlx-vvLwvB87Tr4hByj9G~F5kHyGynvrg~5Vty8CEW8Cqy8C9l8VH~8WEl8CHynkRz8WqK8kt-5Vq_jy~56JeOrJXLIKYOq__Hyr9m~~5k0K9k9g9WHj5k0K9Vqg9Cqy9m~lnCp~5k0K9Vqg9Cqa9q__'\nusername = '这是测试'  # 用户名\ns_code = 'ilvw'  # 验证码\nverifystring = 'jxOb3456654e9d67a5c02ab155fe9012fb44e5b90ae9b01ca02'  # 首页返回的\n\nresult = js.call('v3test', dv, s_code, verifystring)\n\nprint(result)"
  },
  {
    "path": "其他实战/【百度】wap端sig生成/v3_update.js",
    "content": "window={};\nxxoo={};\nvar _0xe7d2 = [\"words\", \"sigBytes\", \"length\", \"stringify\", \"ceil\", \"slice\", \"random\", \"enc\", \"Hex\", \"join\", \"substr\", \"push\", \"fromCharCode\", \"charCodeAt\", \"Utf8\", \"Malformed UTF-8 data\", \"parse\", \"BufferedBlockAlgorithm\", \"_data\", \"_nDataBytes\", \"concat\", \"blockSize\", \"max\", \"_minBufferSize\", \"min\", \"_doProcessBlock\", \"splice\", \"clone\", \"Hasher\", \"cfg\", \"reset\", \"_append\", \"_doFinalize\", \"finalize\", \"HMAC\", \"algo\", \"Cipher\", \"WordArray\", \"EvpKDF\", \"_ENC_XFORM_MODE\", \"_DEC_XFORM_MODE\", \"_xformMode\", \"_key\", \"_doReset\", \"_process\", \"encrypt\", \"decrypt\", \"flush\", \"mode\", \"BlockCipherMode\", \"Encryptor\", \"Decryptor\", \"_cipher\", \"_iv\", \"CBC\", \"encryptBlock\", \"_prevBlock\", \"pad\", \"Pkcs7\", \"BlockCipher\", \"createEncryptor\", \"createDecryptor\", \"_mode\", \"__creator\", \"unpad\", \"CipherParams\", \"formatter\", \"format\", \"ciphertext\", \"_parse\", \"kdf\", \"OpenSSL\", \"PasswordBasedCipher\", \"ivSize\", \"key\", \"execute\", \"keySize\", \"salt\", \"MD5\", \"hasher\", \"update\", \"compute\", \"Base64\", \"_map\", \"clamp\", \"_reverseMap\", \"charAt\", \"indexOf\", \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\", \"abs\", \"sin\", \"_hash\", \"floor\", \"HmacMD5\", \"_createHmacHelper\", \"Word\", \"high\", \"low\", \"SHA1\", \"_createHelper\", \"HmacSHA1\", \"_iKey\", \"_hasher\", \"_oKey\", \"0123456789abcdef\", \"sqrt\", \"SHA256\", \"HmacSHA256\", \"x64\", \"toX32\", \"SHA512\", \"HmacSHA512\", \"moonshad5moonsh2\", \"moonshad3moonsh0\", \"moonshad8moonsh6\", \"moonshad0moonsh1\", \"moonshad1moonsh9\", \"OOOO0O\", \"O0000O\", \"O00O0O\", \"OO0OOO\", \"screen\", \"width\", \"height\", \"alg\", \"version\", \"round\", \"getTime\", \"sig\", \"traceid\", \"callback\", \"elapsed\", \"shaOne\", \"encryption\", \"sort\", \"split\", \"substring\", \"ECB\", \"byteOffset\", \"byteLength\", \"Utf16BE\", \"Utf16LE\", \"Utf16\", \"SHA224\", \"SHA384\", \"HmacSHA384\", \"SHA3\", \"_state\", \"outputLength\", \"HmacSHA3\", \"RIPEMD160\", \"HmacRIPEMD160\", \"iterations\", \"PBKDF2\", \"CFB\", \"CTR\", \"_counter\", \"OFB\", \"_keystream\", \"decryptBlock\", \"AnsiX923\", \"Ansix923\", \"Iso10126\", \"Iso97971\", \"ZeroPadding\", \"NoPadding\", \"AES\", \"_nRounds\", \"_keyPriorReset\", \"_keySchedule\", \"_invKeySchedule\", \"_doCryptBlock\", \"DES\", \"_subKeys\", \"_invSubKeys\", \"_lBlock\", \"_rBlock\", \"TripleDES\", \"_des2\", \"_des3\", \"_des1\", \"StreamCipher\", \"RC4\", \"drop\", \"RC4Drop\", \"Rabbit\", \"RabbitLegacy\", \"location\", \"protocol\", \"//nsclick.baidu.com/v.gif?\", \"pid=111&type=1023&v=\", \"&data_source=fe\", \"&extrajson=\", \"&monitorType=moonshadErrors\", \"{eventType:na-moonshad-error}\", \"&auto_en=na-monitor\", \"onload\", \"onerror\", \"src\", \"exports\", \"defineProperty\", \"undefined\", \"toStringTag\", \"Module\", \"__esModule\", \"object\", \"create\", \"default\", \"string\", \"bind\", \"prototype\", \"hasOwnProperty\", \"call\", \"lib\", \"Base\", \"mixIn\", \"init\", \"$super\", \"apply\", \"toString\", \"extend\"];\n!function(c) {\n    !function(x) {\n        for (; --x; )\n            c.push(c.shift())\n    }(421)\n}(_0xe7d2);\nvar _0x19c3 = function(x, c) {\n    return _0xe7d2[x -= 0]\n};\n!function(x, c) {\n    for (var _ in c)\n        x[_] = c[_]\n}(window, function(_) {\n    var t = {};\n    function r(x) {\n        if (t[x])\n            return t[x][_0x19c3(\"0x0\")];\n        var c = t[x] = {\n            i: x,\n            l: !1,\n            exports: {}\n        };\n        return _[x].call(c[_0x19c3(\"0x0\")], c, c[_0x19c3(\"0x0\")], r),\n        c.l = !0,\n        c[_0x19c3(\"0x0\")]\n    }\n    return r.m = _,\n    r.c = t,\n    r.d = function(x, c, _) {\n        r.o(x, c) || Object[_0x19c3(\"0x1\")](x, c, {\n            enumerable: !0,\n            get: _\n        })\n    }\n    ,\n    r.r = function(x) {\n        typeof Symbol !== _0x19c3(\"0x2\") && Symbol[_0x19c3(\"0x3\")] && Object[_0x19c3(\"0x1\")](x, Symbol.toStringTag, {\n            value: _0x19c3(\"0x4\")\n        }),\n        Object[_0x19c3(\"0x1\")](x, _0x19c3(\"0x5\"), {\n            value: !0\n        })\n    }\n    ,\n    r.t = function(c, x) {\n        if (1 & x && (c = r(c)),\n        8 & x)\n            return c;\n        if (4 & x && typeof c === _0x19c3(\"0x6\") && c && c[_0x19c3(\"0x5\")])\n            return c;\n        var _ = Object[_0x19c3(\"0x7\")](null);\n        if (r.r(_),\n        Object.defineProperty(_, _0x19c3(\"0x8\"), {\n            enumerable: !0,\n            value: c\n        }),\n        2 & x && typeof c != _0x19c3(\"0x9\"))\n            for (var t in c)\n                r.d(_, t, function(x) {\n                    return c[x]\n                }\n                [_0x19c3(\"0xa\")](null, t));\n        return _\n    }\n    ,\n    r.n = function(x) {\n        var c = x && x[_0x19c3(\"0x5\")] ? function() {\n            return x[_0x19c3(\"0x8\")]\n        }\n        : function() {\n            return x\n        }\n        ;\n        return r.d(c, \"a\", c),\n        c\n    }\n    ,\n    r.o = function(x, c) {\n        return Object[_0x19c3(\"0xb\")][_0x19c3(\"0xc\")][_0x19c3(\"0xd\")](x, c)\n    }\n    ,\n    r.p = \"\",\n    r(r.s = 12)\n}([function(x, c, _) {\n    var t;\n    x.exports = (t = t || function(f) {\n        var _ = Object[_0x19c3(\"0x7\")] || function() {\n            function _() {}\n            return function(x) {\n                var c;\n                return _[_0x19c3(\"0xb\")] = x,\n                c = new _,\n                _[_0x19c3(\"0xb\")] = null,\n                c\n            }\n        }()\n          , x = {}\n          , c = x[_0x19c3(\"0xe\")] = {}\n          , t = c[_0x19c3(\"0xf\")] = {\n            extend: function(x) {\n                var c = _(this);\n                return x && c[_0x19c3(\"0x10\")](x),\n                c[_0x19c3(\"0xc\")](\"init\") && this.init !== c[_0x19c3(\"0x11\")] || (c[_0x19c3(\"0x11\")] = function() {\n                    c[_0x19c3(\"0x12\")].init[_0x19c3(\"0x13\")](this, arguments)\n                }\n                ),\n                (c.init[_0x19c3(\"0xb\")] = c)[_0x19c3(\"0x12\")] = this,\n                c\n            },\n            create: function() {\n                var x = this.extend();\n                return x[_0x19c3(\"0x11\")].apply(x, arguments),\n                x\n            },\n            init: function() {},\n            mixIn: function(x) {\n                for (var c in x)\n                    x.hasOwnProperty(c) && (this[c] = x[c]);\n                x[_0x19c3(\"0xc\")](_0x19c3(\"0x14\")) && (this[_0x19c3(\"0x14\")] = x.toString)\n            },\n            clone: function() {\n                return this[_0x19c3(\"0x11\")][_0x19c3(\"0xb\")][_0x19c3(\"0x15\")](this)\n            }\n        }\n          , u = c.WordArray = t[_0x19c3(\"0x15\")]({\n            init: function(x, c) {\n                x = this[_0x19c3(\"0x16\")] = x || [],\n                null != c ? this[_0x19c3(\"0x17\")] = c : this.sigBytes = 4 * x[_0x19c3(\"0x18\")]\n            },\n            toString: function(x) {\n                return (x || n)[_0x19c3(\"0x19\")](this)\n            },\n            concat: function(x) {\n                var c = this[_0x19c3(\"0x16\")]\n                  , _ = x[_0x19c3(\"0x16\")]\n                  , t = this.sigBytes\n                  , r = x[_0x19c3(\"0x17\")];\n                if (this.clamp(),\n                t % 4)\n                    for (var n = 0; n < r; n++) {\n                        var i = _[n >>> 2] >>> 24 - n % 4 * 8 & 255;\n                        c[t + n >>> 2] |= i << 24 - (t + n) % 4 * 8\n                    }\n                else\n                    for (var n = 0; n < r; n += 4)\n                        c[t + n >>> 2] = _[n >>> 2];\n                return this[_0x19c3(\"0x17\")] += r,\n                this\n            },\n            clamp: function() {\n                var x = this[_0x19c3(\"0x16\")]\n                  , c = this[_0x19c3(\"0x17\")];\n                x[c >>> 2] &= 4294967295 << 32 - c % 4 * 8,\n                x[_0x19c3(\"0x18\")] = f[_0x19c3(\"0x1a\")](c / 4)\n            },\n            clone: function() {\n                var x = t.clone[_0x19c3(\"0xd\")](this);\n                return x[_0x19c3(\"0x16\")] = this[_0x19c3(\"0x16\")][_0x19c3(\"0x1b\")](0),\n                x\n            },\n            random: function(x) {\n                for (var c, _ = [], t = function(c) {\n                    var c = c\n                      , _ = 987654321\n                      , t = 4294967295;\n                    return function() {\n                        var x = ((_ = 36969 * (65535 & _) + (_ >> 16) & t) << 16) + (c = 18e3 * (65535 & c) + (c >> 16) & t) & t;\n                        return x /= 4294967296,\n                        (x += .5) * (.5 < f[_0x19c3(\"0x1c\")]() ? 1 : -1)\n                    }\n                }, r = 0; r < x; r += 4) {\n                    var n = t(4294967296 * (c || f[_0x19c3(\"0x1c\")]()));\n                    c = 987654071 * n(),\n                    _.push(4294967296 * n() | 0)\n                }\n                return new (u[_0x19c3(\"0x11\")])(_,x)\n            }\n        })\n          , r = x[_0x19c3(\"0x1d\")] = {}\n          , n = r[_0x19c3(\"0x1e\")] = {\n            stringify: function(x) {\n                for (var c = x[_0x19c3(\"0x16\")], _ = x[_0x19c3(\"0x17\")], t = [], r = 0; r < _; r++) {\n                    var n = c[r >>> 2] >>> 24 - r % 4 * 8 & 255;\n                    t.push((n >>> 4).toString(16)),\n                    t.push((15 & n)[_0x19c3(\"0x14\")](16))\n                }\n                return t[_0x19c3(\"0x1f\")](\"\")\n            },\n            parse: function(x) {\n                for (var c = x[_0x19c3(\"0x18\")], _ = [], t = 0; t < c; t += 2)\n                    _[t >>> 3] |= parseInt(x[_0x19c3(\"0x20\")](t, 2), 16) << 24 - t % 8 * 4;\n                return new (u[_0x19c3(\"0x11\")])(_,c / 2)\n            }\n        }\n          , i = r.Latin1 = {\n            stringify: function(x) {\n                for (var c = x[_0x19c3(\"0x16\")], _ = x[_0x19c3(\"0x17\")], t = [], r = 0; r < _; r++) {\n                    var n = c[r >>> 2] >>> 24 - r % 4 * 8 & 255;\n                    t[_0x19c3(\"0x21\")](String[_0x19c3(\"0x22\")](n))\n                }\n                return t.join(\"\")\n            },\n            parse: function(x) {\n                for (var c = x[_0x19c3(\"0x18\")], _ = [], t = 0; t < c; t++)\n                    _[t >>> 2] |= (255 & x[_0x19c3(\"0x23\")](t)) << 24 - t % 4 * 8;\n                return new (u[_0x19c3(\"0x11\")])(_,c)\n            }\n        }\n          , e = r[_0x19c3(\"0x24\")] = {\n            stringify: function(x) {\n                try {\n                    return decodeURIComponent(escape(i[_0x19c3(\"0x19\")](x)))\n                } catch (c) {\n                    throw new Error(_0x19c3(\"0x25\"))\n                }\n            },\n            parse: function(x) {\n                return i[_0x19c3(\"0x26\")](unescape(encodeURIComponent(x)))\n            }\n        }\n          , o = c[_0x19c3(\"0x27\")] = t[_0x19c3(\"0x15\")]({\n            reset: function() {\n                this[_0x19c3(\"0x28\")] = new u.init,\n                this[_0x19c3(\"0x29\")] = 0\n            },\n            _append: function(x) {\n                typeof x == _0x19c3(\"0x9\") && (x = e[_0x19c3(\"0x26\")](x)),\n                this._data[_0x19c3(\"0x2a\")](x),\n                this._nDataBytes += x[_0x19c3(\"0x17\")]\n            },\n            _process: function(x) {\n                var c = this[_0x19c3(\"0x28\")]\n                  , _ = c[_0x19c3(\"0x16\")]\n                  , t = c[_0x19c3(\"0x17\")]\n                  , r = this[_0x19c3(\"0x2b\")]\n                  , n = 4 * r\n                  , i = t / n\n                  , e = (i = x ? f[_0x19c3(\"0x1a\")](i) : f[_0x19c3(\"0x2c\")]((0 | i) - this[_0x19c3(\"0x2d\")], 0)) * r\n                  , o = f[_0x19c3(\"0x2e\")](4 * e, t);\n                if (e) {\n                    for (var a = 0; a < e; a += r)\n                        this[_0x19c3(\"0x2f\")](_, a);\n                    var s = _[_0x19c3(\"0x30\")](0, e);\n                    c[_0x19c3(\"0x17\")] -= o\n                }\n                return new (u[_0x19c3(\"0x11\")])(s,o)\n            },\n            clone: function() {\n                var x = t[_0x19c3(\"0x31\")][_0x19c3(\"0xd\")](this);\n                return x[_0x19c3(\"0x28\")] = this._data[_0x19c3(\"0x31\")](),\n                x\n            },\n            _minBufferSize: 0\n        })\n          , a = (c[_0x19c3(\"0x32\")] = o[_0x19c3(\"0x15\")]({\n            cfg: t[_0x19c3(\"0x15\")](),\n            init: function(x) {\n                this[_0x19c3(\"0x33\")] = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](x),\n                this[_0x19c3(\"0x34\")]()\n            },\n            reset: function() {\n                o[_0x19c3(\"0x34\")].call(this),\n                this._doReset()\n            },\n            update: function(x) {\n                return this[_0x19c3(\"0x35\")](x),\n                this._process(),\n                this\n            },\n            finalize: function(x) {\n                x && this[_0x19c3(\"0x35\")](x);\n                var c = this[_0x19c3(\"0x36\")]();\n                return c\n            },\n            blockSize: 16,\n            _createHelper: function(_) {\n                return function(x, c) {\n                    return new (_[_0x19c3(\"0x11\")])(c)[_0x19c3(\"0x37\")](x)\n                }\n            },\n            _createHmacHelper: function(_) {\n                return function(x, c) {\n                    return new (a[_0x19c3(\"0x38\")][_0x19c3(\"0x11\")])(_,c)[_0x19c3(\"0x37\")](x)\n                }\n            }\n        }),\n        x[_0x19c3(\"0x39\")] = {});\n        return x\n    }(Math),\n    t)\n}\n, function(x, c, _) {\n    var m;\n    x[_0x19c3(\"0x0\")] = (m = _(0),\n    _(2),\n    void (m[_0x19c3(\"0xe\")][_0x19c3(\"0x3a\")] || function() {\n        var x = m\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c[_0x19c3(\"0xf\")]\n          , o = c[_0x19c3(\"0x3b\")]\n          , t = c[_0x19c3(\"0x27\")]\n          , r = x.enc\n          , n = (r.Utf8,\n        r.Base64)\n          , i = x[_0x19c3(\"0x39\")]\n          , e = i[_0x19c3(\"0x3c\")]\n          , a = c[_0x19c3(\"0x3a\")] = t.extend({\n            cfg: _[_0x19c3(\"0x15\")](),\n            createEncryptor: function(x, c) {\n                return this[_0x19c3(\"0x7\")](this[_0x19c3(\"0x3d\")], x, c)\n            },\n            createDecryptor: function(x, c) {\n                return this[_0x19c3(\"0x7\")](this[_0x19c3(\"0x3e\")], x, c)\n            },\n            init: function(x, c, _) {\n                this.cfg = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](_),\n                this[_0x19c3(\"0x3f\")] = x,\n                this[_0x19c3(\"0x40\")] = c,\n                this[_0x19c3(\"0x34\")]()\n            },\n            reset: function() {\n                t[_0x19c3(\"0x34\")][_0x19c3(\"0xd\")](this),\n                this[_0x19c3(\"0x41\")]()\n            },\n            process: function(x) {\n                return this[_0x19c3(\"0x35\")](x),\n                this[_0x19c3(\"0x42\")]()\n            },\n            finalize: function(x) {\n                x && this._append(x);\n                var c = this[_0x19c3(\"0x36\")]();\n                return c\n            },\n            keySize: 4,\n            ivSize: 4,\n            _ENC_XFORM_MODE: 1,\n            _DEC_XFORM_MODE: 2,\n            _createHelper: function() {\n                function r(x) {\n                    return typeof x == _0x19c3(\"0x9\") ? w : b\n                }\n                return function(t) {\n                    return {\n                        encrypt: function(x, c, _) {\n                            return r(c)[_0x19c3(\"0x43\")](t, x, c, _)\n                        },\n                        decrypt: function(x, c, _) {\n                            return r(c)[_0x19c3(\"0x44\")](t, x, c, _)\n                        }\n                    }\n                }\n            }()\n        })\n          , s = (c.StreamCipher = a.extend({\n            _doFinalize: function() {\n                var x = this[_0x19c3(\"0x42\")](!!_0x19c3(\"0x45\"));\n                return x\n            },\n            blockSize: 1\n        }),\n        x[_0x19c3(\"0x46\")] = {})\n          , f = c[_0x19c3(\"0x47\")] = _[_0x19c3(\"0x15\")]({\n            createEncryptor: function(x, c) {\n                return this[_0x19c3(\"0x48\")][_0x19c3(\"0x7\")](x, c)\n            },\n            createDecryptor: function(x, c) {\n                return this[_0x19c3(\"0x49\")][_0x19c3(\"0x7\")](x, c)\n            },\n            init: function(x, c) {\n                this[_0x19c3(\"0x4a\")] = x,\n                this[_0x19c3(\"0x4b\")] = c\n            }\n        })\n          , u = s[_0x19c3(\"0x4c\")] = function() {\n            var x = f[_0x19c3(\"0x15\")]();\n            function n(x, c, _) {\n                var t = this[_0x19c3(\"0x4b\")];\n                if (t) {\n                    var r = t;\n                    this[_0x19c3(\"0x4b\")] = void 0\n                } else\n                    var r = this[_0x19c3(\"0x4e\")];\n                for (var n = 0; n < _; n++)\n                    x[c + n] ^= r[n]\n            }\n            return x.Encryptor = x[_0x19c3(\"0x15\")]({\n                processBlock: function(x, c) {\n                    var _ = this._cipher\n                      , t = _[_0x19c3(\"0x2b\")];\n                    n[_0x19c3(\"0xd\")](this, x, c, t),\n                    _[_0x19c3(\"0x4d\")](x, c),\n                    this._prevBlock = x[_0x19c3(\"0x1b\")](c, c + t)\n                }\n            }),\n            x[_0x19c3(\"0x49\")] = x.extend({\n                processBlock: function(x, c) {\n                    var _ = this[_0x19c3(\"0x4a\")]\n                      , t = _.blockSize\n                      , r = x.slice(c, c + t);\n                    _.decryptBlock(x, c),\n                    n[_0x19c3(\"0xd\")](this, x, c, t),\n                    this[_0x19c3(\"0x4e\")] = r\n                }\n            }),\n            x\n        }()\n          , h = x[_0x19c3(\"0x4f\")] = {}\n          , v = h[_0x19c3(\"0x50\")] = {\n            pad: function(x, c) {\n                for (var _ = 4 * c, t = _ - x[_0x19c3(\"0x17\")] % _, r = t << 24 | t << 16 | t << 8 | t, n = [], i = 0; i < t; i += 4)\n                    n.push(r);\n                var e = o[_0x19c3(\"0x7\")](n, t);\n                x[_0x19c3(\"0x2a\")](e)\n            },\n            unpad: function(x) {\n                var c = 255 & x.words[x[_0x19c3(\"0x17\")] - 1 >>> 2];\n                x[_0x19c3(\"0x17\")] -= c\n            }\n        }\n          , d = (c[_0x19c3(\"0x51\")] = a[_0x19c3(\"0x15\")]({\n            cfg: a[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")]({\n                mode: u,\n                padding: v\n            }),\n            reset: function() {\n                a.reset[_0x19c3(\"0xd\")](this);\n                var x = this[_0x19c3(\"0x33\")]\n                  , c = x.iv\n                  , _ = x[_0x19c3(\"0x46\")];\n                if (this[_0x19c3(\"0x3f\")] == this[_0x19c3(\"0x3d\")])\n                    var t = _[_0x19c3(\"0x52\")];\n                else {\n                    var t = _[_0x19c3(\"0x53\")];\n                    this._minBufferSize = 1\n                }\n                this[_0x19c3(\"0x54\")] && this[_0x19c3(\"0x54\")][_0x19c3(\"0x55\")] == t ? this._mode[_0x19c3(\"0x11\")](this, c && c.words) : (this[_0x19c3(\"0x54\")] = t[_0x19c3(\"0xd\")](_, this, c && c.words),\n                this._mode[_0x19c3(\"0x55\")] = t)\n            },\n            _doProcessBlock: function(x, c) {\n                this[_0x19c3(\"0x54\")].processBlock(x, c)\n            },\n            _doFinalize: function() {\n                var x = this[_0x19c3(\"0x33\")].padding;\n                if (this._xformMode == this._ENC_XFORM_MODE) {\n                    x.pad(this[_0x19c3(\"0x28\")], this[_0x19c3(\"0x2b\")]);\n                    var c = this._process(!!_0x19c3(\"0x45\"))\n                } else {\n                    var c = this._process(!0);\n                    x[_0x19c3(\"0x56\")](c)\n                }\n                return c\n            },\n            blockSize: 4\n        }),\n        c[_0x19c3(\"0x57\")] = _[_0x19c3(\"0x15\")]({\n            init: function(x) {\n                this[_0x19c3(\"0x10\")](x)\n            },\n            toString: function(x) {\n                return (x || this[_0x19c3(\"0x58\")])[_0x19c3(\"0x19\")](this)\n            }\n        }))\n          , l = x[_0x19c3(\"0x59\")] = {}\n          , p = l.OpenSSL = {\n            stringify: function(x) {\n                var c = x[_0x19c3(\"0x5a\")]\n                  , _ = x.salt;\n                if (_)\n                    var t = o[_0x19c3(\"0x7\")]([1398893684, 1701076831])[_0x19c3(\"0x2a\")](_)[_0x19c3(\"0x2a\")](c);\n                else\n                    var t = c;\n                return t[_0x19c3(\"0x14\")](n)\n            },\n            parse: function(x) {\n                var c = n[_0x19c3(\"0x26\")](x)\n                  , _ = c.words;\n                if (1398893684 == _[0] && 1701076831 == _[1]) {\n                    var t = o[_0x19c3(\"0x7\")](_[_0x19c3(\"0x1b\")](2, 4));\n                    _[_0x19c3(\"0x30\")](0, 4),\n                    c[_0x19c3(\"0x17\")] -= 16\n                }\n                return d[_0x19c3(\"0x7\")]({\n                    ciphertext: c,\n                    salt: t\n                })\n            }\n        }\n          , b = c.SerializableCipher = _.extend({\n            cfg: _[_0x19c3(\"0x15\")]({\n                format: p\n            }),\n            encrypt: function(x, c, _, t) {\n                t = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](t);\n                var r = x[_0x19c3(\"0x52\")](_, t)\n                  , n = r[_0x19c3(\"0x37\")](c)\n                  , i = r[_0x19c3(\"0x33\")];\n                return d[_0x19c3(\"0x7\")]({\n                    ciphertext: n,\n                    key: _,\n                    iv: i.iv,\n                    algorithm: x,\n                    mode: i[_0x19c3(\"0x46\")],\n                    padding: i.padding,\n                    blockSize: x[_0x19c3(\"0x2b\")],\n                    formatter: t.format\n                })\n            },\n            decrypt: function(x, c, _, t) {\n                t = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](t),\n                c = this[_0x19c3(\"0x5b\")](c, t[_0x19c3(\"0x59\")]);\n                var r = x[_0x19c3(\"0x53\")](_, t).finalize(c[_0x19c3(\"0x5a\")]);\n                return r\n            },\n            _parse: function(x, c) {\n                return typeof x == _0x19c3(\"0x9\") ? c[_0x19c3(\"0x26\")](x, this) : x\n            }\n        })\n          , y = x[_0x19c3(\"0x5c\")] = {}\n          , g = y[_0x19c3(\"0x5d\")] = {\n            execute: function(x, c, _, t) {\n                t = t || o.random(8);\n                var r = e[_0x19c3(\"0x7\")]({\n                    keySize: c + _\n                }).compute(x, t)\n                  , n = o[_0x19c3(\"0x7\")](r[_0x19c3(\"0x16\")].slice(c), 4 * _);\n                return r[_0x19c3(\"0x17\")] = 4 * c,\n                d[_0x19c3(\"0x7\")]({\n                    key: r,\n                    iv: n,\n                    salt: t\n                })\n            }\n        }\n          , w = c[_0x19c3(\"0x5e\")] = b[_0x19c3(\"0x15\")]({\n            cfg: b.cfg.extend({\n                kdf: g\n            }),\n            encrypt: function(x, c, _, t) {\n                var r = (t = this[_0x19c3(\"0x33\")].extend(t)).kdf.execute(_, x.keySize, x[_0x19c3(\"0x5f\")]);\n                t.iv = r.iv;\n                var n = b.encrypt[_0x19c3(\"0xd\")](this, x, c, r[_0x19c3(\"0x60\")], t);\n                return n[_0x19c3(\"0x10\")](r),\n                n\n            },\n            decrypt: function(x, c, _, t) {\n                t = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](t),\n                c = this[_0x19c3(\"0x5b\")](c, t.format);\n                var r = t[_0x19c3(\"0x5c\")][_0x19c3(\"0x61\")](_, x[_0x19c3(\"0x62\")], x[_0x19c3(\"0x5f\")], c[_0x19c3(\"0x63\")]);\n                t.iv = r.iv;\n                var n = b[_0x19c3(\"0x44\")][_0x19c3(\"0xd\")](this, x, c, r[_0x19c3(\"0x60\")], t);\n                return n\n            }\n        })\n    }()))\n}\n, function(x, c, _) {\n    var i;\n    x[_0x19c3(\"0x0\")] = (i = _(0),\n    _(6),\n    _(7),\n    function() {\n        var x = i\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c.Base\n          , s = c.WordArray\n          , t = x[_0x19c3(\"0x39\")]\n          , r = t[_0x19c3(\"0x64\")]\n          , n = t.EvpKDF = _[_0x19c3(\"0x15\")]({\n            cfg: _[_0x19c3(\"0x15\")]({\n                keySize: 4,\n                hasher: r,\n                iterations: 1\n            }),\n            init: function(x) {\n                this.cfg = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](x)\n            },\n            compute: function(x, c) {\n                for (var _ = this[_0x19c3(\"0x33\")], t = _[_0x19c3(\"0x65\")][_0x19c3(\"0x7\")](), r = s.create(), n = r.words, i = _[_0x19c3(\"0x62\")], e = _.iterations; n[_0x19c3(\"0x18\")] < i; ) {\n                    o && t[_0x19c3(\"0x66\")](o);\n                    var o = t[_0x19c3(\"0x66\")](x)[_0x19c3(\"0x37\")](c);\n                    t.reset();\n                    for (var a = 1; a < e; a++)\n                        o = t[_0x19c3(\"0x37\")](o),\n                        t[_0x19c3(\"0x34\")]();\n                    r[_0x19c3(\"0x2a\")](o)\n                }\n                return r[_0x19c3(\"0x17\")] = 4 * i,\n                r\n            }\n        });\n        x[_0x19c3(\"0x3c\")] = function(x, c, _) {\n            return n.create(_)[_0x19c3(\"0x67\")](x, c)\n        }\n    }(),\n    i[_0x19c3(\"0x3c\")])\n}\n, function(x, c, _) {\n    var t;\n    x.exports = (t = _(0),\n    function() {\n        var x = t\n          , a = x.lib[_0x19c3(\"0x3b\")];\n        x[_0x19c3(\"0x1d\")][_0x19c3(\"0x68\")] = {\n            stringify: function(x) {\n                var c = x[_0x19c3(\"0x16\")]\n                  , _ = x[_0x19c3(\"0x17\")]\n                  , t = this[_0x19c3(\"0x69\")];\n                x[_0x19c3(\"0x6a\")]();\n                for (var r = [], n = 0; n < _; n += 3)\n                    for (var i = (c[n >>> 2] >>> 24 - n % 4 * 8 & 255) << 16 | (c[n + 1 >>> 2] >>> 24 - (n + 1) % 4 * 8 & 255) << 8 | c[n + 2 >>> 2] >>> 24 - (n + 2) % 4 * 8 & 255, e = 0; e < 4 && n + .75 * e < _; e++)\n                        r[_0x19c3(\"0x21\")](t.charAt(i >>> 6 * (3 - e) & 63));\n                var o = t.charAt(64);\n                if (o)\n                    for (; r[_0x19c3(\"0x18\")] % 4; )\n                        r[_0x19c3(\"0x21\")](o);\n                return r.join(\"\")\n            },\n            parse: function(x) {\n                var c = x[_0x19c3(\"0x18\")]\n                  , _ = this[_0x19c3(\"0x69\")]\n                  , t = this._reverseMap;\n                if (!t) {\n                    t = this[_0x19c3(\"0x6b\")] = [];\n                    for (var r = 0; r < _[_0x19c3(\"0x18\")]; r++)\n                        t[_[_0x19c3(\"0x23\")](r)] = r\n                }\n                var n = _[_0x19c3(\"0x6c\")](64);\n                if (n) {\n                    var i = x[_0x19c3(\"0x6d\")](n);\n                    -1 !== i && (c = i)\n                }\n                return function o(x, c, _) {\n                    for (var t = [], r = 0, n = 0; n < c; n++)\n                        if (n % 4) {\n                            var i = _[x[_0x19c3(\"0x23\")](n - 1)] << n % 4 * 2\n                              , e = _[x[_0x19c3(\"0x23\")](n)] >>> 6 - n % 4 * 2;\n                            t[r >>> 2] |= (i | e) << 24 - r % 4 * 8,\n                            r++\n                        }\n                    return a[_0x19c3(\"0x7\")](t, r)\n                }(x, c, t)\n            },\n            _map: _0x19c3(\"0x6e\")\n        }\n    }(),\n    t[_0x19c3(\"0x1d\")][_0x19c3(\"0x68\")])\n}\n, function(x, c, _) {\n    var i;\n    x[_0x19c3(\"0x0\")] = (i = _(0),\n    function(s) {\n        var x = i\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c[_0x19c3(\"0x3b\")]\n          , t = c[_0x19c3(\"0x32\")]\n          , r = x[_0x19c3(\"0x39\")]\n          , B = [];\n        !function() {\n            for (var x = 0; x < 64; x++)\n                B[x] = 4294967296 * s[_0x19c3(\"0x6f\")](s[_0x19c3(\"0x70\")](x + 1)) | 0\n        }();\n        var n = r[_0x19c3(\"0x64\")] = t.extend({\n            _doReset: function() {\n                this._hash = new (_[_0x19c3(\"0x11\")])([1732584193, 4023233417, 2562383102, 271733878])\n            },\n            _doProcessBlock: function(x, c) {\n                for (var _ = 0; _ < 16; _++) {\n                    var t = c + _\n                      , r = x[t];\n                    x[t] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8)\n                }\n                var n = this[_0x19c3(\"0x71\")][_0x19c3(\"0x16\")]\n                  , i = x[c + 0]\n                  , e = x[c + 1]\n                  , o = x[c + 2]\n                  , a = x[c + 3]\n                  , s = x[c + 4]\n                  , f = x[c + 5]\n                  , u = x[c + 6]\n                  , h = x[c + 7]\n                  , v = x[c + 8]\n                  , d = x[c + 9]\n                  , l = x[c + 10]\n                  , p = x[c + 11]\n                  , b = x[c + 12]\n                  , y = x[c + 13]\n                  , g = x[c + 14]\n                  , w = x[c + 15]\n                  , m = n[0]\n                  , k = n[1]\n                  , S = n[2]\n                  , O = n[3];\n                k = C(k = C(k = C(k = C(k = H(k = H(k = H(k = H(k = z(k = z(k = z(k = z(k = A(k = A(k = A(k = A(k, S = A(S, O = A(O, m = A(m, k, S, O, i, 7, B[0]), k, S, e, 12, B[1]), m, k, o, 17, B[2]), O, m, a, 22, B[3]), S = A(S, O = A(O, m = A(m, k, S, O, s, 7, B[4]), k, S, f, 12, B[5]), m, k, u, 17, B[6]), O, m, h, 22, B[7]), S = A(S, O = A(O, m = A(m, k, S, O, v, 7, B[8]), k, S, d, 12, B[9]), m, k, l, 17, B[10]), O, m, p, 22, B[11]), S = A(S, O = A(O, m = A(m, k, S, O, b, 7, B[12]), k, S, y, 12, B[13]), m, k, g, 17, B[14]), O, m, w, 22, B[15]), S = z(S, O = z(O, m = z(m, k, S, O, e, 5, B[16]), k, S, u, 9, B[17]), m, k, p, 14, B[18]), O, m, i, 20, B[19]), S = z(S, O = z(O, m = z(m, k, S, O, f, 5, B[20]), k, S, l, 9, B[21]), m, k, w, 14, B[22]), O, m, s, 20, B[23]), S = z(S, O = z(O, m = z(m, k, S, O, d, 5, B[24]), k, S, g, 9, B[25]), m, k, a, 14, B[26]), O, m, v, 20, B[27]), S = z(S, O = z(O, m = z(m, k, S, O, y, 5, B[28]), k, S, o, 9, B[29]), m, k, h, 14, B[30]), O, m, b, 20, B[31]), S = H(S, O = H(O, m = H(m, k, S, O, f, 4, B[32]), k, S, v, 11, B[33]), m, k, p, 16, B[34]), O, m, g, 23, B[35]), S = H(S, O = H(O, m = H(m, k, S, O, e, 4, B[36]), k, S, s, 11, B[37]), m, k, h, 16, B[38]), O, m, l, 23, B[39]), S = H(S, O = H(O, m = H(m, k, S, O, y, 4, B[40]), k, S, i, 11, B[41]), m, k, a, 16, B[42]), O, m, u, 23, B[43]), S = H(S, O = H(O, m = H(m, k, S, O, d, 4, B[44]), k, S, b, 11, B[45]), m, k, w, 16, B[46]), O, m, o, 23, B[47]), S = C(S, O = C(O, m = C(m, k, S, O, i, 6, B[48]), k, S, h, 10, B[49]), m, k, g, 15, B[50]), O, m, f, 21, B[51]), S = C(S, O = C(O, m = C(m, k, S, O, b, 6, B[52]), k, S, a, 10, B[53]), m, k, l, 15, B[54]), O, m, e, 21, B[55]), S = C(S, O = C(O, m = C(m, k, S, O, v, 6, B[56]), k, S, w, 10, B[57]), m, k, u, 15, B[58]), O, m, y, 21, B[59]), S = C(S, O = C(O, m = C(m, k, S, O, s, 6, B[60]), k, S, p, 10, B[61]), m, k, o, 15, B[62]), O, m, d, 21, B[63]),\n                n[0] = n[0] + m | 0,\n                n[1] = n[1] + k | 0,\n                n[2] = n[2] + S | 0,\n                n[3] = n[3] + O | 0\n            },\n            _doFinalize: function() {\n                var x = this._data\n                  , c = x.words\n                  , _ = 8 * this[_0x19c3(\"0x29\")]\n                  , t = 8 * x[_0x19c3(\"0x17\")];\n                c[t >>> 5] |= 128 << 24 - t % 32;\n                var r = s[_0x19c3(\"0x72\")](_ / 4294967296)\n                  , n = _;\n                c[15 + (64 + t >>> 9 << 4)] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8),\n                c[14 + (64 + t >>> 9 << 4)] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8),\n                x[_0x19c3(\"0x17\")] = 4 * (c.length + 1),\n                this[_0x19c3(\"0x42\")]();\n                for (var i = this[_0x19c3(\"0x71\")], e = i[_0x19c3(\"0x16\")], o = 0; o < 4; o++) {\n                    var a = e[o];\n                    e[o] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8)\n                }\n                return i\n            },\n            clone: function() {\n                var x = t[_0x19c3(\"0x31\")].call(this);\n                return x._hash = this._hash[_0x19c3(\"0x31\")](),\n                x\n            }\n        });\n        function A(x, c, _, t, r, n, i) {\n            var e = x + (c & _ | ~c & t) + r + i;\n            return (e << n | e >>> 32 - n) + c\n        }\n        function z(x, c, _, t, r, n, i) {\n            var e = x + (c & t | _ & ~t) + r + i;\n            return (e << n | e >>> 32 - n) + c\n        }\n        function H(x, c, _, t, r, n, i) {\n            var e = x + (c ^ _ ^ t) + r + i;\n            return (e << n | e >>> 32 - n) + c\n        }\n        function C(x, c, _, t, r, n, i) {\n            var e = x + (_ ^ (c | ~t)) + r + i;\n            return (e << n | e >>> 32 - n) + c\n        }\n        x[_0x19c3(\"0x64\")] = t._createHelper(n),\n        x[_0x19c3(\"0x73\")] = t[_0x19c3(\"0x74\")](n)\n    }(Math),\n    i[_0x19c3(\"0x64\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    function() {\n        var x = t\n          , c = x[_0x19c3(\"0xe\")]\n          , r = c[_0x19c3(\"0xf\")]\n          , n = c[_0x19c3(\"0x3b\")]\n          , _ = x.x64 = {};\n        _[_0x19c3(\"0x75\")] = r[_0x19c3(\"0x15\")]({\n            init: function(x, c) {\n                this[_0x19c3(\"0x76\")] = x,\n                this[_0x19c3(\"0x77\")] = c\n            }\n        }),\n        _[_0x19c3(\"0x3b\")] = r[_0x19c3(\"0x15\")]({\n            init: function(x, c) {\n                x = this[_0x19c3(\"0x16\")] = x || [],\n                null != c ? this.sigBytes = c : this[_0x19c3(\"0x17\")] = 8 * x[_0x19c3(\"0x18\")]\n            },\n            toX32: function() {\n                for (var x = this[_0x19c3(\"0x16\")], c = x[_0x19c3(\"0x18\")], _ = [], t = 0; t < c; t++) {\n                    var r = x[t];\n                    _[_0x19c3(\"0x21\")](r[_0x19c3(\"0x76\")]),\n                    _[_0x19c3(\"0x21\")](r[_0x19c3(\"0x77\")])\n                }\n                return n[_0x19c3(\"0x7\")](_, this.sigBytes)\n            },\n            clone: function() {\n                for (var x = r.clone[_0x19c3(\"0xd\")](this), c = x[_0x19c3(\"0x16\")] = this[_0x19c3(\"0x16\")][_0x19c3(\"0x1b\")](0), _ = c[_0x19c3(\"0x18\")], t = 0; t < _; t++)\n                    c[t] = c[t][_0x19c3(\"0x31\")]();\n                return x\n            }\n        })\n    }(),\n    t)\n}\n, function(x, c, _) {\n    var i;\n    x[_0x19c3(\"0x0\")] = (i = _(0),\n    function() {\n        var x = i\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c[_0x19c3(\"0x3b\")]\n          , t = c[_0x19c3(\"0x32\")]\n          , r = x[_0x19c3(\"0x39\")]\n          , f = []\n          , n = r[_0x19c3(\"0x78\")] = t[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                this[_0x19c3(\"0x71\")] = new (_[_0x19c3(\"0x11\")])([1732584193, 4023233417, 2562383102, 271733878, 3285377520])\n            },\n            _doProcessBlock: function(x, c) {\n                for (var _ = this[_0x19c3(\"0x71\")].words, t = _[0], r = _[1], n = _[2], i = _[3], e = _[4], o = 0; o < 80; o++) {\n                    if (o < 16)\n                        f[o] = 0 | x[c + o];\n                    else {\n                        var a = f[o - 3] ^ f[o - 8] ^ f[o - 14] ^ f[o - 16];\n                        f[o] = a << 1 | a >>> 31\n                    }\n                    var s = (t << 5 | t >>> 27) + e + f[o];\n                    s += o < 20 ? 1518500249 + (r & n | ~r & i) : o < 40 ? 1859775393 + (r ^ n ^ i) : o < 60 ? (r & n | r & i | n & i) - 1894007588 : (r ^ n ^ i) - 899497514,\n                    e = i,\n                    i = n,\n                    n = r << 30 | r >>> 2,\n                    r = t,\n                    t = s\n                }\n                _[0] = _[0] + t | 0,\n                _[1] = _[1] + r | 0,\n                _[2] = _[2] + n | 0,\n                _[3] = _[3] + i | 0,\n                _[4] = _[4] + e | 0\n            },\n            _doFinalize: function() {\n                var x = this._data\n                  , c = x[_0x19c3(\"0x16\")]\n                  , _ = 8 * this[_0x19c3(\"0x29\")]\n                  , t = 8 * x[_0x19c3(\"0x17\")];\n                return c[t >>> 5] |= 128 << 24 - t % 32,\n                c[14 + (64 + t >>> 9 << 4)] = Math.floor(_ / 4294967296),\n                c[15 + (64 + t >>> 9 << 4)] = _,\n                x.sigBytes = 4 * c[_0x19c3(\"0x18\")],\n                this[_0x19c3(\"0x42\")](),\n                this[_0x19c3(\"0x71\")]\n            },\n            clone: function() {\n                var x = t[_0x19c3(\"0x31\")][_0x19c3(\"0xd\")](this);\n                return x[_0x19c3(\"0x71\")] = this[_0x19c3(\"0x71\")].clone(),\n                x\n            }\n        });\n        x.SHA1 = t[_0x19c3(\"0x79\")](n),\n        x[_0x19c3(\"0x7a\")] = t._createHmacHelper(n)\n    }(),\n    i[_0x19c3(\"0x78\")])\n}\n, function(x, c, _) {\n    var n;\n    x[_0x19c3(\"0x0\")] = (n = _(0),\n    void function() {\n        var x = n\n          , c = x.lib\n          , _ = c[_0x19c3(\"0xf\")]\n          , t = x[_0x19c3(\"0x1d\")]\n          , a = t[_0x19c3(\"0x24\")]\n          , r = x[_0x19c3(\"0x39\")];\n        r[_0x19c3(\"0x38\")] = _[_0x19c3(\"0x15\")]({\n            init: function(x, c) {\n                x = this._hasher = new (x[_0x19c3(\"0x11\")]),\n                typeof c == _0x19c3(\"0x9\") && (c = a[_0x19c3(\"0x26\")](c));\n                var _ = x[_0x19c3(\"0x2b\")]\n                  , t = 4 * _;\n                c[_0x19c3(\"0x17\")] > t && (c = x[_0x19c3(\"0x37\")](c)),\n                c.clamp();\n                for (var r = this._oKey = c[_0x19c3(\"0x31\")](), n = this[_0x19c3(\"0x7b\")] = c[_0x19c3(\"0x31\")](), i = r[_0x19c3(\"0x16\")], e = n.words, o = 0; o < _; o++)\n                    i[o] ^= 1549556828,\n                    e[o] ^= 909522486;\n                r[_0x19c3(\"0x17\")] = n[_0x19c3(\"0x17\")] = t,\n                this[_0x19c3(\"0x34\")]()\n            },\n            reset: function() {\n                var x = this[_0x19c3(\"0x7c\")];\n                x.reset(),\n                x[_0x19c3(\"0x66\")](this[_0x19c3(\"0x7b\")])\n            },\n            update: function(x) {\n                return this._hasher[_0x19c3(\"0x66\")](x),\n                this\n            },\n            finalize: function(x) {\n                var c = this[_0x19c3(\"0x7c\")]\n                  , _ = c[_0x19c3(\"0x37\")](x);\n                c[_0x19c3(\"0x34\")]();\n                var t = c[_0x19c3(\"0x37\")](this[_0x19c3(\"0x7d\")][_0x19c3(\"0x31\")]()[_0x19c3(\"0x2a\")](_));\n                return t\n            }\n        })\n    }())\n}\n, function(x, c) {\n    function f(x, c) {\n        var _ = (65535 & x) + (65535 & c);\n        return (x >> 16) + (c >> 16) + (_ >> 16) << 16 | 65535 & _\n    }\n    function e(x, c, _, t, r, n) {\n        return f(function i(x, c) {\n            return x << c | x >>> 32 - c\n        }(f(f(c, x), f(t, n)), r), _)\n    }\n    function u(x, c, _, t, r, n, i) {\n        return e(c & _ | ~c & t, x, c, r, n, i)\n    }\n    function h(x, c, _, t, r, n, i) {\n        return e(c & t | _ & ~t, x, c, r, n, i)\n    }\n    function v(x, c, _, t, r, n, i) {\n        return e(c ^ _ ^ t, x, c, r, n, i)\n    }\n    function d(x, c, _, t, r, n, i) {\n        return e(_ ^ (c | ~t), x, c, r, n, i)\n    }\n    function o(x, c) {\n        x[c >> 5] |= 128 << c % 32,\n        x[14 + (c + 64 >>> 9 << 4)] = c;\n        var _, t, r, n, i, e = 1732584193, o = -271733879, a = -1732584194, s = 271733878;\n        for (_ = 0; _ < x[_0x19c3(\"0x18\")]; _ += 16)\n            o = d(o = d(o = d(o = d(o = v(o = v(o = v(o = v(o = h(o = h(o = h(o = h(o = u(o = u(o = u(o = u(r = o, a = u(n = a, s = u(i = s, e = u(t = e, o, a, s, x[_], 7, -680876936), o, a, x[_ + 1], 12, -389564586), e, o, x[_ + 2], 17, 606105819), s, e, x[_ + 3], 22, -1044525330), a = u(a, s = u(s, e = u(e, o, a, s, x[_ + 4], 7, -176418897), o, a, x[_ + 5], 12, 1200080426), e, o, x[_ + 6], 17, -1473231341), s, e, x[_ + 7], 22, -45705983), a = u(a, s = u(s, e = u(e, o, a, s, x[_ + 8], 7, 1770035416), o, a, x[_ + 9], 12, -1958414417), e, o, x[_ + 10], 17, -42063), s, e, x[_ + 11], 22, -1990404162), a = u(a, s = u(s, e = u(e, o, a, s, x[_ + 12], 7, 1804603682), o, a, x[_ + 13], 12, -40341101), e, o, x[_ + 14], 17, -1502002290), s, e, x[_ + 15], 22, 1236535329), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 1], 5, -165796510), o, a, x[_ + 6], 9, -1069501632), e, o, x[_ + 11], 14, 643717713), s, e, x[_], 20, -373897302), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 5], 5, -701558691), o, a, x[_ + 10], 9, 38016083), e, o, x[_ + 15], 14, -660478335), s, e, x[_ + 4], 20, -405537848), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 9], 5, 568446438), o, a, x[_ + 14], 9, -1019803690), e, o, x[_ + 3], 14, -187363961), s, e, x[_ + 8], 20, 1163531501), a = h(a, s = h(s, e = h(e, o, a, s, x[_ + 13], 5, -1444681467), o, a, x[_ + 2], 9, -51403784), e, o, x[_ + 7], 14, 1735328473), s, e, x[_ + 12], 20, -1926607734), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 5], 4, -378558), o, a, x[_ + 8], 11, -2022574463), e, o, x[_ + 11], 16, 1839030562), s, e, x[_ + 14], 23, -35309556), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 1], 4, -1530992060), o, a, x[_ + 4], 11, 1272893353), e, o, x[_ + 7], 16, -155497632), s, e, x[_ + 10], 23, -1094730640), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 13], 4, 681279174), o, a, x[_], 11, -358537222), e, o, x[_ + 3], 16, -722521979), s, e, x[_ + 6], 23, 76029189), a = v(a, s = v(s, e = v(e, o, a, s, x[_ + 9], 4, -640364487), o, a, x[_ + 12], 11, -421815835), e, o, x[_ + 15], 16, 530742520), s, e, x[_ + 2], 23, -995338651), a = d(a, s = d(s, e = d(e, o, a, s, x[_], 6, -198630844), o, a, x[_ + 7], 10, 1126891415), e, o, x[_ + 14], 15, -1416354905), s, e, x[_ + 5], 21, -57434055), a = d(a, s = d(s, e = d(e, o, a, s, x[_ + 12], 6, 1700485571), o, a, x[_ + 3], 10, -1894986606), e, o, x[_ + 10], 15, -1051523), s, e, x[_ + 1], 21, -2054922799), a = d(a, s = d(s, e = d(e, o, a, s, x[_ + 8], 6, 1873313359), o, a, x[_ + 15], 10, -30611744), e, o, x[_ + 6], 15, -1560198380), s, e, x[_ + 13], 21, 1309151649), a = d(a, s = d(s, e = d(e, o, a, s, x[_ + 4], 6, -145523070), o, a, x[_ + 11], 10, -1120210379), e, o, x[_ + 2], 15, 718787259), s, e, x[_ + 9], 21, -343485551),\n            e = f(e, t),\n            o = f(o, r),\n            a = f(a, n),\n            s = f(s, i);\n        return [e, o, a, s]\n    }\n    function a(x) {\n        var c, _ = \"\";\n        for (c = 0; c < 32 * x[_0x19c3(\"0x18\")]; c += 8)\n            _ += String[_0x19c3(\"0x22\")](x[c >> 5] >>> c % 32 & 255);\n        return _\n    }\n    function s(x) {\n        var c, _ = [];\n        for (_[(x[_0x19c3(\"0x18\")] >> 2) - 1] = undefined,\n        c = 0; c < _.length; c += 1)\n            _[c] = 0;\n        for (c = 0; c < 8 * x[_0x19c3(\"0x18\")]; c += 8)\n            _[c >> 5] |= (255 & x[_0x19c3(\"0x23\")](c / 8)) << c % 32;\n        return _\n    }\n    function n(x) {\n        var c, _, t = _0x19c3(\"0x7e\"), r = \"\";\n        for (_ = 0; _ < x[_0x19c3(\"0x18\")]; _ += 1)\n            c = x[_0x19c3(\"0x23\")](_),\n            r += t.charAt(c >>> 4 & 15) + t.charAt(15 & c);\n        return r\n    }\n    function _(x) {\n        return unescape(encodeURIComponent(x))\n    }\n    function i(x) {\n        return function c(x) {\n            return a(o(s(x), 8 * x.length))\n        }(_(x))\n    }\n    function l(x, c) {\n        return function e(x, c) {\n            var _, t, r = s(x), n = [], i = [];\n            for (n[15] = i[15] = undefined,\n            16 < r.length && (r = o(r, 8 * x[_0x19c3(\"0x18\")])),\n            _ = 0; _ < 16; _ += 1)\n                n[_] = 909522486 ^ r[_],\n                i[_] = 1549556828 ^ r[_];\n            return t = o(n[_0x19c3(\"0x2a\")](s(c)), 512 + 8 * c[_0x19c3(\"0x18\")]),\n            a(o(i[_0x19c3(\"0x2a\")](t), 640))\n        }(_(x), _(c))\n    }\n    x[_0x19c3(\"0x0\")] = function p(x, c, _) {\n        return c ? _ ? l(c, x) : function t(x, c) {\n            return n(l(x, c))\n        }(c, x) : _ ? i(x) : function r(x) {\n            return n(i(x))\n        }(x)\n    }\n}\n, function(x, c, _) {\n    var o;\n    x[_0x19c3(\"0x0\")] = (o = _(0),\n    function(r) {\n        var x = o\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c.WordArray\n          , t = c.Hasher\n          , n = x[_0x19c3(\"0x39\")]\n          , i = []\n          , y = [];\n        !function() {\n            function x(x) {\n                for (var c = r[_0x19c3(\"0x7f\")](x), _ = 2; _ <= c; _++)\n                    if (!(x % _))\n                        return !1;\n                return !0\n            }\n            function c(x) {\n                return 4294967296 * (x - (0 | x)) | 0\n            }\n            for (var _ = 2, t = 0; t < 64; )\n                x(_) && (t < 8 && (i[t] = c(r.pow(_, .5))),\n                y[t] = c(r.pow(_, 1 / 3)),\n                t++),\n                _++\n        }();\n        var g = []\n          , e = n.SHA256 = t[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                this._hash = new (_[_0x19c3(\"0x11\")])(i[_0x19c3(\"0x1b\")](0))\n            },\n            _doProcessBlock: function(x, c) {\n                for (var _ = this._hash.words, t = _[0], r = _[1], n = _[2], i = _[3], e = _[4], o = _[5], a = _[6], s = _[7], f = 0; f < 64; f++) {\n                    if (f < 16)\n                        g[f] = 0 | x[c + f];\n                    else {\n                        var u = g[f - 15]\n                          , h = (u << 25 | u >>> 7) ^ (u << 14 | u >>> 18) ^ u >>> 3\n                          , v = g[f - 2]\n                          , d = (v << 15 | v >>> 17) ^ (v << 13 | v >>> 19) ^ v >>> 10;\n                        g[f] = h + g[f - 7] + d + g[f - 16]\n                    }\n                    var l = t & r ^ t & n ^ r & n\n                      , p = (t << 30 | t >>> 2) ^ (t << 19 | t >>> 13) ^ (t << 10 | t >>> 22)\n                      , b = s + ((e << 26 | e >>> 6) ^ (e << 21 | e >>> 11) ^ (e << 7 | e >>> 25)) + (e & o ^ ~e & a) + y[f] + g[f];\n                    s = a,\n                    a = o,\n                    o = e,\n                    e = i + b | 0,\n                    i = n,\n                    n = r,\n                    r = t,\n                    t = b + (p + l) | 0\n                }\n                _[0] = _[0] + t | 0,\n                _[1] = _[1] + r | 0,\n                _[2] = _[2] + n | 0,\n                _[3] = _[3] + i | 0,\n                _[4] = _[4] + e | 0,\n                _[5] = _[5] + o | 0,\n                _[6] = _[6] + a | 0,\n                _[7] = _[7] + s | 0\n            },\n            _doFinalize: function() {\n                var x = this[_0x19c3(\"0x28\")]\n                  , c = x.words\n                  , _ = 8 * this._nDataBytes\n                  , t = 8 * x[_0x19c3(\"0x17\")];\n                return c[t >>> 5] |= 128 << 24 - t % 32,\n                c[14 + (64 + t >>> 9 << 4)] = r[_0x19c3(\"0x72\")](_ / 4294967296),\n                c[15 + (64 + t >>> 9 << 4)] = _,\n                x.sigBytes = 4 * c[_0x19c3(\"0x18\")],\n                this._process(),\n                this._hash\n            },\n            clone: function() {\n                var x = t.clone[_0x19c3(\"0xd\")](this);\n                return x[_0x19c3(\"0x71\")] = this[_0x19c3(\"0x71\")].clone(),\n                x\n            }\n        });\n        x[_0x19c3(\"0x80\")] = t[_0x19c3(\"0x79\")](e),\n        x[_0x19c3(\"0x81\")] = t._createHmacHelper(e)\n    }(Math),\n    o.SHA256)\n}\n, function(x, c, _) {\n    var o;\n    x.exports = (o = _(0),\n    _(5),\n    function() {\n        var x = o\n          , c = x[_0x19c3(\"0xe\")][_0x19c3(\"0x32\")]\n          , _ = x[_0x19c3(\"0x82\")]\n          , t = _[_0x19c3(\"0x75\")]\n          , r = _.WordArray\n          , n = x[_0x19c3(\"0x39\")];\n        function i() {\n            return t[_0x19c3(\"0x7\")][_0x19c3(\"0x13\")](t, arguments)\n        }\n        var kx = [i(1116352408, 3609767458), i(1899447441, 602891725), i(3049323471, 3964484399), i(3921009573, 2173295548), i(961987163, 4081628472), i(1508970993, 3053834265), i(2453635748, 2937671579), i(2870763221, 3664609560), i(3624381080, 2734883394), i(310598401, 1164996542), i(607225278, 1323610764), i(1426881987, 3590304994), i(1925078388, 4068182383), i(2162078206, 991336113), i(2614888103, 633803317), i(3248222580, 3479774868), i(3835390401, 2666613458), i(4022224774, 944711139), i(264347078, 2341262773), i(604807628, 2007800933), i(770255983, 1495990901), i(1249150122, 1856431235), i(1555081692, 3175218132), i(1996064986, 2198950837), i(2554220882, 3999719339), i(2821834349, 766784016), i(2952996808, 2566594879), i(3210313671, 3203337956), i(3336571891, 1034457026), i(3584528711, 2466948901), i(113926993, 3758326383), i(338241895, 168717936), i(666307205, 1188179964), i(773529912, 1546045734), i(1294757372, 1522805485), i(1396182291, 2643833823), i(1695183700, 2343527390), i(1986661051, 1014477480), i(2177026350, 1206759142), i(2456956037, 344077627), i(2730485921, 1290863460), i(2820302411, 3158454273), i(3259730800, 3505952657), i(3345764771, 106217008), i(3516065817, 3606008344), i(3600352804, 1432725776), i(4094571909, 1467031594), i(275423344, 851169720), i(430227734, 3100823752), i(506948616, 1363258195), i(659060556, 3750685593), i(883997877, 3785050280), i(958139571, 3318307427), i(1322822218, 3812723403), i(1537002063, 2003034995), i(1747873779, 3602036899), i(1955562222, 1575990012), i(2024104815, 1125592928), i(2227730452, 2716904306), i(2361852424, 442776044), i(2428436474, 593698344), i(2756734187, 3733110249), i(3204031479, 2999351573), i(3329325298, 3815920427), i(3391569614, 3928383900), i(3515267271, 566280711), i(3940187606, 3454069534), i(4118630271, 4000239992), i(116418474, 1914138554), i(174292421, 2731055270), i(289380356, 3203993006), i(460393269, 320620315), i(685471733, 587496836), i(852142971, 1086792851), i(1017036298, 365543100), i(1126000580, 2618297676), i(1288033470, 3409855158), i(1501505948, 4234509866), i(1607167915, 987167468), i(1816402316, 1246189591)]\n          , Sx = [];\n        !function() {\n            for (var x = 0; x < 80; x++)\n                Sx[x] = i()\n        }();\n        var e = n.SHA512 = c[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                this._hash = new (r[_0x19c3(\"0x11\")])([new (t[_0x19c3(\"0x11\")])(1779033703,4089235720), new (t[_0x19c3(\"0x11\")])(3144134277,2227873595), new (t[_0x19c3(\"0x11\")])(1013904242,4271175723), new t.init(2773480762,1595750129), new (t[_0x19c3(\"0x11\")])(1359893119,2917565137), new (t[_0x19c3(\"0x11\")])(2600822924,725511199), new t.init(528734635,4215389547), new (t[_0x19c3(\"0x11\")])(1541459225,327033209)])\n            },\n            _doProcessBlock: function(x, c) {\n                for (var _ = this._hash[_0x19c3(\"0x16\")], t = _[0], r = _[1], n = _[2], i = _[3], e = _[4], o = _[5], a = _[6], s = _[7], f = t.high, u = t[_0x19c3(\"0x77\")], h = r.high, v = r[_0x19c3(\"0x77\")], d = n[_0x19c3(\"0x76\")], l = n[_0x19c3(\"0x77\")], p = i[_0x19c3(\"0x76\")], b = i[_0x19c3(\"0x77\")], y = e[_0x19c3(\"0x76\")], g = e[_0x19c3(\"0x77\")], w = o[_0x19c3(\"0x76\")], m = o[_0x19c3(\"0x77\")], k = a[_0x19c3(\"0x76\")], S = a.low, O = s[_0x19c3(\"0x76\")], B = s.low, A = f, z = u, H = h, C = v, R = d, M = l, D = p, E = b, P = y, F = g, j = w, U = m, I = k, X = S, K = O, T = B, L = 0; L < 80; L++) {\n                    var W = Sx[L];\n                    if (L < 16)\n                        var N = W.high = 0 | x[c + 2 * L]\n                          , q = W[_0x19c3(\"0x77\")] = 0 | x[c + 2 * L + 1];\n                    else {\n                        var Z = Sx[L - 15]\n                          , G = Z[_0x19c3(\"0x76\")]\n                          , V = Z[_0x19c3(\"0x77\")]\n                          , J = (G >>> 1 | V << 31) ^ (G >>> 8 | V << 24) ^ G >>> 7\n                          , Q = (V >>> 1 | G << 31) ^ (V >>> 8 | G << 24) ^ (V >>> 7 | G << 25)\n                          , Y = Sx[L - 2]\n                          , $ = Y[_0x19c3(\"0x76\")]\n                          , xx = Y[_0x19c3(\"0x77\")]\n                          , cx = ($ >>> 19 | xx << 13) ^ ($ << 3 | xx >>> 29) ^ $ >>> 6\n                          , _x = (xx >>> 19 | $ << 13) ^ (xx << 3 | $ >>> 29) ^ (xx >>> 6 | $ << 26)\n                          , tx = Sx[L - 7]\n                          , rx = tx[_0x19c3(\"0x76\")]\n                          , nx = tx.low\n                          , ix = Sx[L - 16]\n                          , ex = ix[_0x19c3(\"0x76\")]\n                          , ox = ix.low;\n                        N = (N = (N = J + rx + ((q = Q + nx) >>> 0 < Q >>> 0 ? 1 : 0)) + cx + ((q += _x) >>> 0 < _x >>> 0 ? 1 : 0)) + ex + ((q += ox) >>> 0 < ox >>> 0 ? 1 : 0),\n                        W[_0x19c3(\"0x76\")] = N,\n                        W[_0x19c3(\"0x77\")] = q\n                    }\n                    var ax, sx = P & j ^ ~P & I, fx = F & U ^ ~F & X, ux = A & H ^ A & R ^ H & R, hx = z & C ^ z & M ^ C & M, vx = (A >>> 28 | z << 4) ^ (A << 30 | z >>> 2) ^ (A << 25 | z >>> 7), dx = (z >>> 28 | A << 4) ^ (z << 30 | A >>> 2) ^ (z << 25 | A >>> 7), lx = (P >>> 14 | F << 18) ^ (P >>> 18 | F << 14) ^ (P << 23 | F >>> 9), px = (F >>> 14 | P << 18) ^ (F >>> 18 | P << 14) ^ (F << 23 | P >>> 9), bx = kx[L], yx = bx[_0x19c3(\"0x76\")], gx = bx[_0x19c3(\"0x77\")], wx = K + lx + ((ax = T + px) >>> 0 < T >>> 0 ? 1 : 0), mx = dx + hx;\n                    K = I,\n                    T = X,\n                    I = j,\n                    X = U,\n                    j = P,\n                    U = F,\n                    P = D + (wx = (wx = (wx = wx + sx + ((ax += fx) >>> 0 < fx >>> 0 ? 1 : 0)) + yx + ((ax += gx) >>> 0 < gx >>> 0 ? 1 : 0)) + N + ((ax += q) >>> 0 < q >>> 0 ? 1 : 0)) + ((F = E + ax | 0) >>> 0 < E >>> 0 ? 1 : 0) | 0,\n                    D = R,\n                    E = M,\n                    R = H,\n                    M = C,\n                    H = A,\n                    C = z,\n                    A = wx + (vx + ux + (mx >>> 0 < dx >>> 0 ? 1 : 0)) + ((z = ax + mx | 0) >>> 0 < ax >>> 0 ? 1 : 0) | 0\n                }\n                u = t[_0x19c3(\"0x77\")] = u + z,\n                t.high = f + A + (u >>> 0 < z >>> 0 ? 1 : 0),\n                v = r[_0x19c3(\"0x77\")] = v + C,\n                r[_0x19c3(\"0x76\")] = h + H + (v >>> 0 < C >>> 0 ? 1 : 0),\n                l = n.low = l + M,\n                n[_0x19c3(\"0x76\")] = d + R + (l >>> 0 < M >>> 0 ? 1 : 0),\n                b = i[_0x19c3(\"0x77\")] = b + E,\n                i.high = p + D + (b >>> 0 < E >>> 0 ? 1 : 0),\n                g = e[_0x19c3(\"0x77\")] = g + F,\n                e[_0x19c3(\"0x76\")] = y + P + (g >>> 0 < F >>> 0 ? 1 : 0),\n                m = o.low = m + U,\n                o[_0x19c3(\"0x76\")] = w + j + (m >>> 0 < U >>> 0 ? 1 : 0),\n                S = a[_0x19c3(\"0x77\")] = S + X,\n                a[_0x19c3(\"0x76\")] = k + I + (S >>> 0 < X >>> 0 ? 1 : 0),\n                B = s.low = B + T,\n                s.high = O + K + (B >>> 0 < T >>> 0 ? 1 : 0)\n            },\n            _doFinalize: function() {\n                var x = this[_0x19c3(\"0x28\")]\n                  , c = x[_0x19c3(\"0x16\")]\n                  , _ = 8 * this[_0x19c3(\"0x29\")]\n                  , t = 8 * x[_0x19c3(\"0x17\")];\n                return c[t >>> 5] |= 128 << 24 - t % 32,\n                c[30 + (128 + t >>> 10 << 5)] = Math.floor(_ / 4294967296),\n                c[31 + (128 + t >>> 10 << 5)] = _,\n                x[_0x19c3(\"0x17\")] = 4 * c[_0x19c3(\"0x18\")],\n                this._process(),\n                this[_0x19c3(\"0x71\")][_0x19c3(\"0x83\")]()\n            },\n            clone: function() {\n                var x = c[_0x19c3(\"0x31\")][_0x19c3(\"0xd\")](this);\n                return x[_0x19c3(\"0x71\")] = this._hash[_0x19c3(\"0x31\")](),\n                x\n            },\n            blockSize: 32\n        });\n        x[_0x19c3(\"0x84\")] = c[_0x19c3(\"0x79\")](e),\n        x[_0x19c3(\"0x85\")] = c[_0x19c3(\"0x74\")](e)\n    }(),\n    o[_0x19c3(\"0x84\")])\n}\n, function(x, c) {\n    x[_0x19c3(\"0x0\")] = function(x) {\n        var c, _, t, r, n, i, e = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n        for (t = x[_0x19c3(\"0x18\")],\n        _ = 0,\n        c = \"\"; _ < t; ) {\n            if (r = 255 & x.charCodeAt(_++),\n            _ === t) {\n                c += e.charAt(r >> 2),\n                c += e[_0x19c3(\"0x6c\")]((3 & r) << 4),\n                c += \"==\";\n                break\n            }\n            if (n = x[_0x19c3(\"0x23\")](_++),\n            _ === t) {\n                c += e[_0x19c3(\"0x6c\")](r >> 2),\n                c += e[_0x19c3(\"0x6c\")]((3 & r) << 4 | (240 & n) >> 4),\n                c += e[_0x19c3(\"0x6c\")]((15 & n) << 2),\n                c += \"=\";\n                break\n            }\n            i = x[_0x19c3(\"0x23\")](_++),\n            c += e[_0x19c3(\"0x6c\")](r >> 2),\n            c += e.charAt((3 & r) << 4 | (240 & n) >> 4),\n            c += e.charAt((15 & n) << 2 | (192 & i) >> 6),\n            c += e[_0x19c3(\"0x6c\")](63 & i)\n        }\n        return c\n    }\n}\n, function(x, c, _) {\n    var o = _(13)\n      , a = _(40)\n      , s = _(41)\n      , f = _(42)\n      , u = _(8)\n      , t = {\n        OOOO0O: _0x19c3(\"0x86\"),\n        O0000O: _0x19c3(\"0x87\"),\n        O00O0O: _0x19c3(\"0x88\"),\n        OO0OOO: _0x19c3(\"0x89\"),\n        OO0O0O: _0x19c3(\"0x8a\")\n    };\n    function r(x, c, _) {\n        var t = {};\n        try {\n            var r = a(x || {});\n            r[_0x19c3(\"0x92\")] = o[_0x19c3(\"0x93\")],\n            r.time = Math[_0x19c3(\"0x94\")]((new Date)[_0x19c3(\"0x95\")]() / 1e3),\n            r[_0x19c3(\"0xc\")](_0x19c3(\"0x96\")) && delete r[_0x19c3(\"0x96\")],\n            r[_0x19c3(\"0xc\")](_0x19c3(\"0x97\")) && delete r[_0x19c3(\"0x97\")],\n            r.hasOwnProperty(\"callback\") && delete r[_0x19c3(\"0x98\")],\n            r[_0x19c3(\"0xc\")](\"elapsed\") && delete r[_0x19c3(\"0x99\")],\n            r.hasOwnProperty(_0x19c3(\"0x9a\")) && delete r[_0x19c3(\"0x9a\")];\n            var n, i = \"\";\n            for (n = i = (new Date)[_0x19c3(\"0x95\")](); \"00\" !== (i = f(u(i)))[_0x19c3(\"0x14\")]()[_0x19c3(\"0x20\")](0, 2); )\n                ;\n            t = {\n                time: r.time,\n                alg: r[_0x19c3(\"0x92\")],\n                sig: o[_0x19c3(\"0x9b\")](r, c, _),\n                elapsed: (new Date)[_0x19c3(\"0x95\")]() - n || \"\",\n                shaOne: i\n            }\n        } catch (e) {\n            s(e)\n        }\n        return t.time+\"|\"+t.alg+\"|\"+t.sig+\"|\"+t.elapsed+\"|\"+t.shaOne;\n    }\nxxoo= r;\n    c.moonshadV3 = {\n        OOOO00: function n(x, c) {\n            return r(x, c, t[_0x19c3(\"0x8b\")])\n        },\n        OOO00O: function i(x, c) {\n            return r(x, c, t[_0x19c3(\"0x8c\")])\n        },\n        OOO000: function e(x, c) {\n            return r(x, c, t[_0x19c3(\"0x8d\")])\n        },\n        OOO0OO: function h(x, c) {\n            return r(x, c, t[_0x19c3(\"0x8e\")])\n        },\n        O0OOO0: function v(x, c) {\n            return r(x, c, t.OO0O0O)\n        }\n    }\n\n\n\n}\n, function(x, c, _) {\n    var r = _(14)\n      , n = _(15)\n      , i = _(11);\n    x[_0x19c3(\"0x0\")] = {\n        version: \"v3\",\n        encryption: function(x, c, _) {\n            var t = r(x, c);\n            return i(n(t, _))\n        }\n    }\n}\n, function(x, c, _) {\n    var u = _(8)\n      , h = {\n        a: \"3\",\n        b: \"4\",\n        c: \"5\",\n        d: \"9\",\n        e: \"8\",\n        f: \"7\",\n        g: \"1\",\n        h: \"2\",\n        i: \"6\",\n        j: \"0\",\n        k: \"a\",\n        l: \"b\",\n        m: \"c\",\n        n: \"d\",\n        o: \"e\",\n        p: \"f\",\n        q: \"g\",\n        r: \"z\",\n        s: \"y\",\n        t: \"x\",\n        u: \"w\",\n        v: \"v\",\n        w: \"u\",\n        x: \"o\",\n        y: \"p\",\n        z: \"q\",\n        0: \"s\",\n        1: \"t\",\n        2: \"r\",\n        3: \"h\",\n        4: \"i\",\n        5: \"j\",\n        6: \"k\",\n        7: \"l\",\n        8: \"m\",\n        9: \"n\"\n    };\n    x.exports = function(x, c) {\n        var _ = [];\n        for (var t in x)\n            x.hasOwnProperty(t) && _.push(t);\n        _[_0x19c3(\"0x9c\")]();\n        for (var r = [], n = 0, i = _.length; n < i; n++) {\n            var e = _[n];\n            r[_0x19c3(\"0x21\")](e + \"=\" + x[e])\n        }\n        var o = u(r.join(\"&\"))\n          , a = \"\"\n          , s = (\"19201080\")[_0x19c3(\"0x9d\")](\"\");\n        for (n = 0; n < s[_0x19c3(\"0x18\")]; n++)\n            a += h[s[n]];\n        return function f(x, c) {\n            var _, t = \"\", r = x[_0x19c3(\"0x9d\")](\"\"), n = c[_0x19c3(\"0x9d\")](\"\");\n            if (r[_0x19c3(\"0x18\")] >= n[_0x19c3(\"0x18\")]) {\n                for (_ = 0; _ < n[_0x19c3(\"0x18\")]; _++)\n                    t += r[_] + n[_];\n                t += x[_0x19c3(\"0x9e\")](_)\n            } else {\n                for (_ = 0; _ < r.length; _++)\n                    t += r[_] + n[_];\n                t += c[_0x19c3(\"0x9e\")](_)\n            }\n            return t\n        }(o, a)\n    }\n}\n, function(x, c, _) {\n    var r = _(16);\n    x[_0x19c3(\"0x0\")] = function(x, c) {\n        var _ = c\n          , t = (c = r[_0x19c3(\"0x1d\")].Utf8[_0x19c3(\"0x26\")](_),\n        r[_0x19c3(\"0x1d\")][_0x19c3(\"0x24\")][_0x19c3(\"0x26\")](x));\n        return r.AES[_0x19c3(\"0x43\")](t, c, {\n            mode: r[_0x19c3(\"0x46\")][_0x19c3(\"0x9f\")],\n            padding: r[_0x19c3(\"0x4f\")][_0x19c3(\"0x50\")]\n        })[_0x19c3(\"0x14\")]()\n    }\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(5),\n    _(17),\n    _(18),\n    _(3),\n    _(4),\n    _(6),\n    _(9),\n    _(19),\n    _(10),\n    _(20),\n    _(21),\n    _(22),\n    _(7),\n    _(23),\n    _(2),\n    _(1),\n    _(24),\n    _(25),\n    _(26),\n    _(27),\n    _(28),\n    _(29),\n    _(30),\n    _(31),\n    _(32),\n    _(33),\n    _(34),\n    _(35),\n    _(36),\n    _(37),\n    _(38),\n    _(39),\n    t)\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    function() {\n        if (\"function\" == typeof ArrayBuffer) {\n            var x = t[_0x19c3(\"0xe\")][_0x19c3(\"0x3b\")]\n              , r = x[_0x19c3(\"0x11\")];\n            (x[_0x19c3(\"0x11\")] = function(x) {\n                if (x instanceof ArrayBuffer && (x = new Uint8Array(x)),\n                (x instanceof Int8Array || typeof Uint8ClampedArray !== _0x19c3(\"0x2\") && x instanceof Uint8ClampedArray || x instanceof Int16Array || x instanceof Uint16Array || x instanceof Int32Array || x instanceof Uint32Array || x instanceof Float32Array || x instanceof Float64Array) && (x = new Uint8Array(x.buffer,x[_0x19c3(\"0xa0\")],x[_0x19c3(\"0xa1\")])),\n                x instanceof Uint8Array) {\n                    for (var c = x[_0x19c3(\"0xa1\")], _ = [], t = 0; t < c; t++)\n                        _[t >>> 2] |= x[t] << 24 - t % 4 * 8;\n                    r[_0x19c3(\"0xd\")](this, _, c)\n                } else\n                    r[_0x19c3(\"0x13\")](this, arguments)\n            }\n            )[_0x19c3(\"0xb\")] = x\n        }\n    }(),\n    t.lib[_0x19c3(\"0x3b\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    function() {\n        var x = t\n          , r = x.lib[_0x19c3(\"0x3b\")]\n          , c = x[_0x19c3(\"0x1d\")];\n        function i(x) {\n            return x << 8 & 4278255360 | x >>> 8 & 16711935\n        }\n        c.Utf16 = c[_0x19c3(\"0xa2\")] = {\n            stringify: function(x) {\n                for (var c = x[_0x19c3(\"0x16\")], _ = x.sigBytes, t = [], r = 0; r < _; r += 2) {\n                    var n = c[r >>> 2] >>> 16 - r % 4 * 8 & 65535;\n                    t.push(String.fromCharCode(n))\n                }\n                return t[_0x19c3(\"0x1f\")](\"\")\n            },\n            parse: function(x) {\n                for (var c = x[_0x19c3(\"0x18\")], _ = [], t = 0; t < c; t++)\n                    _[t >>> 1] |= x[_0x19c3(\"0x23\")](t) << 16 - t % 2 * 16;\n                return r.create(_, 2 * c)\n            }\n        },\n        c[_0x19c3(\"0xa3\")] = {\n            stringify: function(x) {\n                for (var c = x.words, _ = x[_0x19c3(\"0x17\")], t = [], r = 0; r < _; r += 2) {\n                    var n = i(c[r >>> 2] >>> 16 - r % 4 * 8 & 65535);\n                    t[_0x19c3(\"0x21\")](String[_0x19c3(\"0x22\")](n))\n                }\n                return t[_0x19c3(\"0x1f\")](\"\")\n            },\n            parse: function(x) {\n                for (var c = x[_0x19c3(\"0x18\")], _ = [], t = 0; t < c; t++)\n                    _[t >>> 1] |= i(x[_0x19c3(\"0x23\")](t) << 16 - t % 2 * 16);\n                return r[_0x19c3(\"0x7\")](_, 2 * c)\n            }\n        }\n    }(),\n    t.enc[_0x19c3(\"0xa4\")])\n}\n, function(x, c, _) {\n    var n;\n    x.exports = (n = _(0),\n    _(9),\n    function() {\n        var x = n\n          , c = x.lib[_0x19c3(\"0x3b\")]\n          , _ = x[_0x19c3(\"0x39\")]\n          , t = _[_0x19c3(\"0x80\")]\n          , r = _.SHA224 = t[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                this[_0x19c3(\"0x71\")] = new (c[_0x19c3(\"0x11\")])([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428])\n            },\n            _doFinalize: function() {\n                var x = t[_0x19c3(\"0x36\")].call(this);\n                return x[_0x19c3(\"0x17\")] -= 4,\n                x\n            }\n        });\n        x[_0x19c3(\"0xa5\")] = t[_0x19c3(\"0x79\")](r),\n        x.HmacSHA224 = t[_0x19c3(\"0x74\")](r)\n    }(),\n    n[_0x19c3(\"0xa5\")])\n}\n, function(x, c, _) {\n    var e;\n    x[_0x19c3(\"0x0\")] = (e = _(0),\n    _(5),\n    _(10),\n    function() {\n        var x = e\n          , c = x.x64\n          , _ = c[_0x19c3(\"0x75\")]\n          , t = c[_0x19c3(\"0x3b\")]\n          , r = x[_0x19c3(\"0x39\")]\n          , n = r.SHA512\n          , i = r[_0x19c3(\"0xa6\")] = n.extend({\n            _doReset: function() {\n                this[_0x19c3(\"0x71\")] = new (t[_0x19c3(\"0x11\")])([new (_[_0x19c3(\"0x11\")])(3418070365,3238371032), new (_[_0x19c3(\"0x11\")])(1654270250,914150663), new (_[_0x19c3(\"0x11\")])(2438529370,812702999), new _.init(355462360,4144912697), new (_[_0x19c3(\"0x11\")])(1731405415,4290775857), new (_[_0x19c3(\"0x11\")])(2394180231,1750603025), new _.init(3675008525,1694076839), new (_[_0x19c3(\"0x11\")])(1203062813,3204075428)])\n            },\n            _doFinalize: function() {\n                var x = n[_0x19c3(\"0x36\")].call(this);\n                return x[_0x19c3(\"0x17\")] -= 16,\n                x\n            }\n        });\n        x[_0x19c3(\"0xa6\")] = n[_0x19c3(\"0x79\")](i),\n        x[_0x19c3(\"0xa7\")] = n[_0x19c3(\"0x74\")](i)\n    }(),\n    e[_0x19c3(\"0xa6\")])\n}\n, function(x, c, _) {\n    var n;\n    x[_0x19c3(\"0x0\")] = (n = _(0),\n    _(5),\n    function(u) {\n        var x = n\n          , c = x[_0x19c3(\"0xe\")]\n          , h = c[_0x19c3(\"0x3b\")]\n          , t = c.Hasher\n          , s = x[_0x19c3(\"0x82\")][_0x19c3(\"0x75\")]\n          , _ = x[_0x19c3(\"0x39\")]\n          , H = []\n          , C = []\n          , R = [];\n        !function() {\n            for (var x = 1, c = 0, _ = 0; _ < 24; _++) {\n                H[x + 5 * c] = (_ + 1) * (_ + 2) / 2 % 64;\n                var t = (2 * x + 3 * c) % 5;\n                x = c % 5,\n                c = t\n            }\n            for (x = 0; x < 5; x++)\n                for (c = 0; c < 5; c++)\n                    C[x + 5 * c] = c + (2 * x + 3 * c) % 5 * 5;\n            for (var r = 1, n = 0; n < 24; n++) {\n                for (var i = 0, e = 0, o = 0; o < 7; o++) {\n                    if (1 & r) {\n                        var a = (1 << o) - 1;\n                        a < 32 ? e ^= 1 << a : i ^= 1 << a - 32\n                    }\n                    128 & r ? r = r << 1 ^ 113 : r <<= 1\n                }\n                R[n] = s[_0x19c3(\"0x7\")](i, e)\n            }\n        }();\n        var M = [];\n        !function() {\n            for (var x = 0; x < 25; x++)\n                M[x] = s[_0x19c3(\"0x7\")]()\n        }();\n        var r = _[_0x19c3(\"0xa8\")] = t[_0x19c3(\"0x15\")]({\n            cfg: t[_0x19c3(\"0x33\")].extend({\n                outputLength: 512\n            }),\n            _doReset: function() {\n                for (var x = this[_0x19c3(\"0xa9\")] = [], c = 0; c < 25; c++)\n                    x[c] = new s.init;\n                this[_0x19c3(\"0x2b\")] = (1600 - 2 * this[_0x19c3(\"0x33\")][_0x19c3(\"0xaa\")]) / 32\n            },\n            _doProcessBlock: function(x, c) {\n                for (var _ = this._state, t = this[_0x19c3(\"0x2b\")] / 2, r = 0; r < t; r++) {\n                    var n = x[c + 2 * r]\n                      , i = x[c + 2 * r + 1];\n                    n = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8),\n                    i = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8),\n                    (S = _[r])[_0x19c3(\"0x76\")] ^= i,\n                    S.low ^= n\n                }\n                for (var e = 0; e < 24; e++) {\n                    for (var o = 0; o < 5; o++) {\n                        for (var a = 0, s = 0, f = 0; f < 5; f++)\n                            a ^= (S = _[o + 5 * f])[_0x19c3(\"0x76\")],\n                            s ^= S[_0x19c3(\"0x77\")];\n                        var u = M[o];\n                        u.high = a,\n                        u[_0x19c3(\"0x77\")] = s\n                    }\n                    for (o = 0; o < 5; o++) {\n                        var h = M[(o + 4) % 5]\n                          , v = M[(o + 1) % 5]\n                          , d = v[_0x19c3(\"0x76\")]\n                          , l = v.low;\n                        for (a = h[_0x19c3(\"0x76\")] ^ (d << 1 | l >>> 31),\n                        s = h[_0x19c3(\"0x77\")] ^ (l << 1 | d >>> 31),\n                        f = 0; f < 5; f++)\n                            (S = _[o + 5 * f]).high ^= a,\n                            S[_0x19c3(\"0x77\")] ^= s\n                    }\n                    for (var p = 1; p < 25; p++) {\n                        var b = (S = _[p]).high\n                          , y = S[_0x19c3(\"0x77\")]\n                          , g = H[p];\n                        s = g < 32 ? (a = b << g | y >>> 32 - g,\n                        y << g | b >>> 32 - g) : (a = y << g - 32 | b >>> 64 - g,\n                        b << g - 32 | y >>> 64 - g);\n                        var w = M[C[p]];\n                        w[_0x19c3(\"0x76\")] = a,\n                        w[_0x19c3(\"0x77\")] = s\n                    }\n                    var m = M[0]\n                      , k = _[0];\n                    for (m[_0x19c3(\"0x76\")] = k[_0x19c3(\"0x76\")],\n                    m[_0x19c3(\"0x77\")] = k[_0x19c3(\"0x77\")],\n                    o = 0; o < 5; o++)\n                        for (f = 0; f < 5; f++) {\n                            var S = _[p = o + 5 * f]\n                              , O = M[p]\n                              , B = M[(o + 1) % 5 + 5 * f]\n                              , A = M[(o + 2) % 5 + 5 * f];\n                            S[_0x19c3(\"0x76\")] = O[_0x19c3(\"0x76\")] ^ ~B.high & A.high,\n                            S[_0x19c3(\"0x77\")] = O.low ^ ~B[_0x19c3(\"0x77\")] & A[_0x19c3(\"0x77\")]\n                        }\n                    S = _[0];\n                    var z = R[e];\n                    S.high ^= z[_0x19c3(\"0x76\")],\n                    S[_0x19c3(\"0x77\")] ^= z[_0x19c3(\"0x77\")]\n                }\n            },\n            _doFinalize: function() {\n                var x = this[_0x19c3(\"0x28\")]\n                  , c = x[_0x19c3(\"0x16\")]\n                  , _ = (this[_0x19c3(\"0x29\")],\n                8 * x[_0x19c3(\"0x17\")])\n                  , t = 32 * this.blockSize;\n                c[_ >>> 5] |= 1 << 24 - _ % 32,\n                c[(u.ceil((1 + _) / t) * t >>> 5) - 1] |= 128,\n                x[_0x19c3(\"0x17\")] = 4 * c.length,\n                this[_0x19c3(\"0x42\")]();\n                for (var r = this[_0x19c3(\"0xa9\")], n = this.cfg[_0x19c3(\"0xaa\")] / 8, i = n / 8, e = [], o = 0; o < i; o++) {\n                    var a = r[o]\n                      , s = a.high\n                      , f = a[_0x19c3(\"0x77\")];\n                    s = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8),\n                    f = 16711935 & (f << 8 | f >>> 24) | 4278255360 & (f << 24 | f >>> 8),\n                    e[_0x19c3(\"0x21\")](f),\n                    e[_0x19c3(\"0x21\")](s)\n                }\n                return new h.init(e,n)\n            },\n            clone: function() {\n                for (var x = t[_0x19c3(\"0x31\")][_0x19c3(\"0xd\")](this), c = x[_0x19c3(\"0xa9\")] = this[_0x19c3(\"0xa9\")][_0x19c3(\"0x1b\")](0), _ = 0; _ < 25; _++)\n                    c[_] = c[_][_0x19c3(\"0x31\")]();\n                return x\n            }\n        });\n        x.SHA3 = t._createHelper(r),\n        x[_0x19c3(\"0xab\")] = t[_0x19c3(\"0x74\")](r)\n    }(Math),\n    n[_0x19c3(\"0xa8\")])\n}\n, function(x, c, _) {\n    var i;\n    x.exports = (i = _(0),\n    function() {\n        var x = i\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c[_0x19c3(\"0x3b\")]\n          , t = c[_0x19c3(\"0x32\")]\n          , r = x[_0x19c3(\"0x39\")]\n          , k = _.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13])\n          , S = _.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11])\n          , O = _[_0x19c3(\"0x7\")]([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6])\n          , B = _[_0x19c3(\"0x7\")]([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11])\n          , A = _.create([0, 1518500249, 1859775393, 2400959708, 2840853838])\n          , z = _[_0x19c3(\"0x7\")]([1352829926, 1548603684, 1836072691, 2053994217, 0])\n          , n = r[_0x19c3(\"0xac\")] = t[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                this._hash = _[_0x19c3(\"0x7\")]([1732584193, 4023233417, 2562383102, 271733878, 3285377520])\n            },\n            _doProcessBlock: function(x, c) {\n                for (var _ = 0; _ < 16; _++) {\n                    var t = c + _\n                      , r = x[t];\n                    x[t] = 16711935 & (r << 8 | r >>> 24) | 4278255360 & (r << 24 | r >>> 8)\n                }\n                var n, i, e, o, a, s, f, u, h, v, d, l = this[_0x19c3(\"0x71\")].words, p = A[_0x19c3(\"0x16\")], b = z.words, y = k.words, g = S.words, w = O[_0x19c3(\"0x16\")], m = B.words;\n                for (s = n = l[0],\n                f = i = l[1],\n                u = e = l[2],\n                h = o = l[3],\n                v = a = l[4],\n                _ = 0; _ < 80; _ += 1)\n                    d = n + x[c + y[_]] | 0,\n                    d += _ < 16 ? H(i, e, o) + p[0] : _ < 32 ? C(i, e, o) + p[1] : _ < 48 ? R(i, e, o) + p[2] : _ < 64 ? M(i, e, o) + p[3] : D(i, e, o) + p[4],\n                    d = (d = E(d |= 0, w[_])) + a | 0,\n                    n = a,\n                    a = o,\n                    o = E(e, 10),\n                    e = i,\n                    i = d,\n                    d = s + x[c + g[_]] | 0,\n                    d += _ < 16 ? D(f, u, h) + b[0] : _ < 32 ? M(f, u, h) + b[1] : _ < 48 ? R(f, u, h) + b[2] : _ < 64 ? C(f, u, h) + b[3] : H(f, u, h) + b[4],\n                    d = (d = E(d |= 0, m[_])) + v | 0,\n                    s = v,\n                    v = h,\n                    h = E(u, 10),\n                    u = f,\n                    f = d;\n                d = l[1] + e + h | 0,\n                l[1] = l[2] + o + v | 0,\n                l[2] = l[3] + a + s | 0,\n                l[3] = l[4] + n + f | 0,\n                l[4] = l[0] + i + u | 0,\n                l[0] = d\n            },\n            _doFinalize: function() {\n                var x = this[_0x19c3(\"0x28\")]\n                  , c = x[_0x19c3(\"0x16\")]\n                  , _ = 8 * this[_0x19c3(\"0x29\")]\n                  , t = 8 * x[_0x19c3(\"0x17\")];\n                c[t >>> 5] |= 128 << 24 - t % 32,\n                c[14 + (64 + t >>> 9 << 4)] = 16711935 & (_ << 8 | _ >>> 24) | 4278255360 & (_ << 24 | _ >>> 8),\n                x[_0x19c3(\"0x17\")] = 4 * (c[_0x19c3(\"0x18\")] + 1),\n                this[_0x19c3(\"0x42\")]();\n                for (var r = this[_0x19c3(\"0x71\")], n = r.words, i = 0; i < 5; i++) {\n                    var e = n[i];\n                    n[i] = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8)\n                }\n                return r\n            },\n            clone: function() {\n                var x = t[_0x19c3(\"0x31\")][_0x19c3(\"0xd\")](this);\n                return x._hash = this._hash.clone(),\n                x\n            }\n        });\n        function H(x, c, _) {\n            return x ^ c ^ _\n        }\n        function C(x, c, _) {\n            return x & c | ~x & _\n        }\n        function R(x, c, _) {\n            return (x | ~c) ^ _\n        }\n        function M(x, c, _) {\n            return x & _ | c & ~_\n        }\n        function D(x, c, _) {\n            return x ^ (c | ~_)\n        }\n        function E(x, c) {\n            return x << c | x >>> 32 - c\n        }\n        x[_0x19c3(\"0xac\")] = t[_0x19c3(\"0x79\")](n),\n        x[_0x19c3(\"0xad\")] = t[_0x19c3(\"0x74\")](n)\n    }(Math),\n    i[_0x19c3(\"0xac\")])\n}\n, function(x, c, _) {\n    var i;\n    x.exports = (i = _(0),\n    _(6),\n    _(7),\n    function() {\n        var x = i\n          , c = x.lib\n          , _ = c[_0x19c3(\"0xf\")]\n          , p = c[_0x19c3(\"0x3b\")]\n          , t = x[_0x19c3(\"0x39\")]\n          , r = t.SHA1\n          , b = t.HMAC\n          , n = t.PBKDF2 = _.extend({\n            cfg: _[_0x19c3(\"0x15\")]({\n                keySize: 4,\n                hasher: r,\n                iterations: 1\n            }),\n            init: function(x) {\n                this[_0x19c3(\"0x33\")] = this[_0x19c3(\"0x33\")][_0x19c3(\"0x15\")](x)\n            },\n            compute: function(x, c) {\n                for (var _ = this[_0x19c3(\"0x33\")], t = b[_0x19c3(\"0x7\")](_[_0x19c3(\"0x65\")], x), r = p[_0x19c3(\"0x7\")](), n = p[_0x19c3(\"0x7\")]([1]), i = r[_0x19c3(\"0x16\")], e = n.words, o = _.keySize, a = _[_0x19c3(\"0xae\")]; i[_0x19c3(\"0x18\")] < o; ) {\n                    var s = t[_0x19c3(\"0x66\")](c)[_0x19c3(\"0x37\")](n);\n                    t.reset();\n                    for (var f = s[_0x19c3(\"0x16\")], u = f[_0x19c3(\"0x18\")], h = s, v = 1; v < a; v++) {\n                        h = t[_0x19c3(\"0x37\")](h),\n                        t.reset();\n                        for (var d = h[_0x19c3(\"0x16\")], l = 0; l < u; l++)\n                            f[l] ^= d[l]\n                    }\n                    r[_0x19c3(\"0x2a\")](s),\n                    e[0]++\n                }\n                return r[_0x19c3(\"0x17\")] = 4 * o,\n                r\n            }\n        });\n        x[_0x19c3(\"0xaf\")] = function(x, c, _) {\n            return n[_0x19c3(\"0x7\")](_)[_0x19c3(\"0x67\")](x, c)\n        }\n    }(),\n    i[_0x19c3(\"0xaf\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(1),\n    t.mode[_0x19c3(\"0xb0\")] = function() {\n        var x = t[_0x19c3(\"0xe\")][_0x19c3(\"0x47\")][_0x19c3(\"0x15\")]();\n        function n(x, c, _, t) {\n            var r = this._iv;\n            if (r) {\n                var n = r[_0x19c3(\"0x1b\")](0);\n                this[_0x19c3(\"0x4b\")] = undefined\n            } else\n                n = this._prevBlock;\n            t[_0x19c3(\"0x4d\")](n, 0);\n            for (var i = 0; i < _; i++)\n                x[c + i] ^= n[i]\n        }\n        return x[_0x19c3(\"0x48\")] = x[_0x19c3(\"0x15\")]({\n            processBlock: function(x, c) {\n                var _ = this[_0x19c3(\"0x4a\")]\n                  , t = _.blockSize;\n                n.call(this, x, c, t, _),\n                this[_0x19c3(\"0x4e\")] = x[_0x19c3(\"0x1b\")](c, c + t)\n            }\n        }),\n        x[_0x19c3(\"0x49\")] = x[_0x19c3(\"0x15\")]({\n            processBlock: function(x, c) {\n                var _ = this[_0x19c3(\"0x4a\")]\n                  , t = _[_0x19c3(\"0x2b\")]\n                  , r = x.slice(c, c + t);\n                n[_0x19c3(\"0xd\")](this, x, c, t, _),\n                this[_0x19c3(\"0x4e\")] = r\n            }\n        }),\n        x\n    }(),\n    t.mode[_0x19c3(\"0xb0\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(1),\n    t.mode[_0x19c3(\"0xb1\")] = function() {\n        var x = t.lib[_0x19c3(\"0x47\")][_0x19c3(\"0x15\")]()\n          , c = x[_0x19c3(\"0x48\")] = x.extend({\n            processBlock: function(x, c) {\n                var _ = this[_0x19c3(\"0x4a\")]\n                  , t = _[_0x19c3(\"0x2b\")]\n                  , r = this[_0x19c3(\"0x4b\")]\n                  , n = this[_0x19c3(\"0xb2\")];\n                r && (n = this[_0x19c3(\"0xb2\")] = r[_0x19c3(\"0x1b\")](0),\n                this[_0x19c3(\"0x4b\")] = undefined);\n                var i = n[_0x19c3(\"0x1b\")](0);\n                _[_0x19c3(\"0x4d\")](i, 0),\n                n[t - 1] = n[t - 1] + 1 | 0;\n                for (var e = 0; e < t; e++)\n                    x[c + e] ^= i[e]\n            }\n        });\n        return x[_0x19c3(\"0x49\")] = c,\n        x\n    }(),\n    t[_0x19c3(\"0x46\")][_0x19c3(\"0xb1\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(1),\n    t[_0x19c3(\"0x46\")].CTRGladman = function() {\n        var x = t.lib[_0x19c3(\"0x47\")][_0x19c3(\"0x15\")]();\n        function a(x) {\n            if (255 == (x >> 24 & 255)) {\n                var c = x >> 16 & 255\n                  , _ = x >> 8 & 255\n                  , t = 255 & x;\n                255 === c ? (c = 0,\n                255 === _ ? (_ = 0,\n                255 === t ? t = 0 : ++t) : ++_) : ++c,\n                x = 0,\n                x += c << 16,\n                x += _ << 8,\n                x += t\n            } else\n                x += 1 << 24;\n            return x\n        }\n        var c = x[_0x19c3(\"0x48\")] = x[_0x19c3(\"0x15\")]({\n            processBlock: function(x, c) {\n                var _ = this[_0x19c3(\"0x4a\")]\n                  , t = _[_0x19c3(\"0x2b\")]\n                  , r = this[_0x19c3(\"0x4b\")]\n                  , n = this[_0x19c3(\"0xb2\")];\n                r && (n = this[_0x19c3(\"0xb2\")] = r.slice(0),\n                this._iv = undefined),\n                function o(x) {\n                    return 0 === (x[0] = a(x[0])) && (x[1] = a(x[1])),\n                    x\n                }(n);\n                var i = n.slice(0);\n                _[_0x19c3(\"0x4d\")](i, 0);\n                for (var e = 0; e < t; e++)\n                    x[c + e] ^= i[e]\n            }\n        });\n        return x[_0x19c3(\"0x49\")] = c,\n        x\n    }(),\n    t[_0x19c3(\"0x46\")].CTRGladman)\n}\n, function(x, c, _) {\n    var t;\n    x.exports = (t = _(0),\n    _(1),\n    t[_0x19c3(\"0x46\")][_0x19c3(\"0xb3\")] = function() {\n        var x = t[_0x19c3(\"0xe\")][_0x19c3(\"0x47\")][_0x19c3(\"0x15\")]()\n          , c = x[_0x19c3(\"0x48\")] = x.extend({\n            processBlock: function(x, c) {\n                var _ = this._cipher\n                  , t = _[_0x19c3(\"0x2b\")]\n                  , r = this._iv\n                  , n = this[_0x19c3(\"0xb4\")];\n                r && (n = this[_0x19c3(\"0xb4\")] = r.slice(0),\n                this._iv = undefined),\n                _[_0x19c3(\"0x4d\")](n, 0);\n                for (var i = 0; i < t; i++)\n                    x[c + i] ^= n[i]\n            }\n        });\n        return x[_0x19c3(\"0x49\")] = c,\n        x\n    }(),\n    t[_0x19c3(\"0x46\")][_0x19c3(\"0xb3\")])\n}\n, function(x, c, _) {\n    var t;\n    x.exports = (t = _(0),\n    _(1),\n    t.mode[_0x19c3(\"0x9f\")] = function() {\n        var x = t.lib.BlockCipherMode.extend();\n        return x[_0x19c3(\"0x48\")] = x[_0x19c3(\"0x15\")]({\n            processBlock: function(x, c) {\n                this._cipher[_0x19c3(\"0x4d\")](x, c)\n            }\n        }),\n        x[_0x19c3(\"0x49\")] = x[_0x19c3(\"0x15\")]({\n            processBlock: function(x, c) {\n                this[_0x19c3(\"0x4a\")][_0x19c3(\"0xb5\")](x, c)\n            }\n        }),\n        x\n    }(),\n    t[_0x19c3(\"0x46\")][_0x19c3(\"0x9f\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(1),\n    t[_0x19c3(\"0x4f\")][_0x19c3(\"0xb6\")] = {\n        pad: function(x, c) {\n            var _ = x[_0x19c3(\"0x17\")]\n              , t = 4 * c\n              , r = t - _ % t\n              , n = _ + r - 1;\n            x[_0x19c3(\"0x6a\")](),\n            x.words[n >>> 2] |= r << 24 - n % 4 * 8,\n            x[_0x19c3(\"0x17\")] += r\n        },\n        unpad: function(x) {\n            var c = 255 & x[_0x19c3(\"0x16\")][x[_0x19c3(\"0x17\")] - 1 >>> 2];\n            x.sigBytes -= c\n        }\n    },\n    t[_0x19c3(\"0x4f\")][_0x19c3(\"0xb7\")])\n}\n, function(x, c, _) {\n    var r;\n    x[_0x19c3(\"0x0\")] = (r = _(0),\n    _(1),\n    r[_0x19c3(\"0x4f\")].Iso10126 = {\n        pad: function(x, c) {\n            var _ = 4 * c\n              , t = _ - x.sigBytes % _;\n            x[_0x19c3(\"0x2a\")](r[_0x19c3(\"0xe\")].WordArray[_0x19c3(\"0x1c\")](t - 1))[_0x19c3(\"0x2a\")](r.lib[_0x19c3(\"0x3b\")][_0x19c3(\"0x7\")]([t << 24], 1))\n        },\n        unpad: function(x) {\n            var c = 255 & x[_0x19c3(\"0x16\")][x[_0x19c3(\"0x17\")] - 1 >>> 2];\n            x[_0x19c3(\"0x17\")] -= c\n        }\n    },\n    r[_0x19c3(\"0x4f\")][_0x19c3(\"0xb8\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(1),\n    t[_0x19c3(\"0x4f\")][_0x19c3(\"0xb9\")] = {\n        pad: function(x, c) {\n            x.concat(t[_0x19c3(\"0xe\")][_0x19c3(\"0x3b\")].create([2147483648], 1)),\n            t[_0x19c3(\"0x4f\")][_0x19c3(\"0xba\")][_0x19c3(\"0x4f\")](x, c)\n        },\n        unpad: function(x) {\n            t.pad.ZeroPadding[_0x19c3(\"0x56\")](x),\n            x[_0x19c3(\"0x17\")]--\n        }\n    },\n    t.pad[_0x19c3(\"0xb9\")])\n}\n, function(x, c, _) {\n    var t;\n    x[_0x19c3(\"0x0\")] = (t = _(0),\n    _(1),\n    t[_0x19c3(\"0x4f\")][_0x19c3(\"0xba\")] = {\n        pad: function(x, c) {\n            var _ = 4 * c;\n            x[_0x19c3(\"0x6a\")](),\n            x[_0x19c3(\"0x17\")] += _ - (x.sigBytes % _ || _)\n        },\n        unpad: function(x) {\n            for (var c = x[_0x19c3(\"0x16\")], _ = x[_0x19c3(\"0x17\")] - 1; !(c[_ >>> 2] >>> 24 - _ % 4 * 8 & 255); )\n                _--;\n            x[_0x19c3(\"0x17\")] = _ + 1\n        }\n    },\n    t[_0x19c3(\"0x4f\")].ZeroPadding)\n}\n, function(x, c, _) {\n    var t;\n    x.exports = (t = _(0),\n    _(1),\n    t.pad[_0x19c3(\"0xbb\")] = {\n        pad: function() {},\n        unpad: function() {}\n    },\n    t.pad[_0x19c3(\"0xbb\")])\n}\n, function(x, c, _) {\n    var r;\n    x[_0x19c3(\"0x0\")] = (r = _(0),\n    _(1),\n    function() {\n        var x = r\n          , _ = x[_0x19c3(\"0xe\")][_0x19c3(\"0x57\")]\n          , t = x.enc.Hex;\n        x[_0x19c3(\"0x59\")][_0x19c3(\"0x1e\")] = {\n            stringify: function(x) {\n                return x.ciphertext.toString(t)\n            },\n            parse: function(x) {\n                var c = t[_0x19c3(\"0x26\")](x);\n                return _[_0x19c3(\"0x7\")]({\n                    ciphertext: c\n                })\n            }\n        }\n    }(),\n    r[_0x19c3(\"0x59\")][_0x19c3(\"0x1e\")])\n}\n, function(x, c, _) {\n    var r;\n    x[_0x19c3(\"0x0\")] = (r = _(0),\n    _(3),\n    _(4),\n    _(2),\n    _(1),\n    function() {\n        var x = r\n          , c = x[_0x19c3(\"0xe\")][_0x19c3(\"0x51\")]\n          , _ = x[_0x19c3(\"0x39\")]\n          , a = []\n          , s = []\n          , f = []\n          , u = []\n          , h = []\n          , v = []\n          , d = []\n          , l = []\n          , p = []\n          , b = [];\n        !function() {\n            for (var x = [], c = 0; c < 256; c++)\n                x[c] = c < 128 ? c << 1 : c << 1 ^ 283;\n            var _ = 0\n              , t = 0;\n            for (c = 0; c < 256; c++) {\n                var r = t ^ t << 1 ^ t << 2 ^ t << 3 ^ t << 4;\n                r = r >>> 8 ^ 255 & r ^ 99,\n                a[_] = r;\n                var n = x[s[r] = _]\n                  , i = x[n]\n                  , e = x[i]\n                  , o = 257 * x[r] ^ 16843008 * r;\n                f[_] = o << 24 | o >>> 8,\n                u[_] = o << 16 | o >>> 16,\n                h[_] = o << 8 | o >>> 24,\n                v[_] = o,\n                o = 16843009 * e ^ 65537 * i ^ 257 * n ^ 16843008 * _,\n                d[r] = o << 24 | o >>> 8,\n                l[r] = o << 16 | o >>> 16,\n                p[r] = o << 8 | o >>> 24,\n                b[r] = o,\n                _ ? (_ = n ^ x[x[x[e ^ n]]],\n                t ^= x[x[t]]) : _ = t = 1\n            }\n        }();\n        var y = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54]\n          , t = _[_0x19c3(\"0xbc\")] = c[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                if (!this[_0x19c3(\"0xbd\")] || this[_0x19c3(\"0xbe\")] !== this[_0x19c3(\"0x40\")]) {\n                    for (var x = this[_0x19c3(\"0xbe\")] = this[_0x19c3(\"0x40\")], c = x[_0x19c3(\"0x16\")], _ = x.sigBytes / 4, t = 4 * (1 + (this[_0x19c3(\"0xbd\")] = 6 + _)), r = this[_0x19c3(\"0xbf\")] = [], n = 0; n < t; n++)\n                        if (n < _)\n                            r[n] = c[n];\n                        else {\n                            var i = r[n - 1];\n                            n % _ ? 6 < _ && n % _ == 4 && (i = a[i >>> 24] << 24 | a[i >>> 16 & 255] << 16 | a[i >>> 8 & 255] << 8 | a[255 & i]) : (i = a[(i = i << 8 | i >>> 24) >>> 24] << 24 | a[i >>> 16 & 255] << 16 | a[i >>> 8 & 255] << 8 | a[255 & i],\n                            i ^= y[n / _ | 0] << 24),\n                            r[n] = r[n - _] ^ i\n                        }\n                    for (var e = this[_0x19c3(\"0xc0\")] = [], o = 0; o < t; o++)\n                        n = t - o,\n                        i = o % 4 ? r[n] : r[n - 4],\n                        e[o] = o < 4 || n <= 4 ? i : d[a[i >>> 24]] ^ l[a[i >>> 16 & 255]] ^ p[a[i >>> 8 & 255]] ^ b[a[255 & i]]\n                }\n            },\n            encryptBlock: function(x, c) {\n                this._doCryptBlock(x, c, this._keySchedule, f, u, h, v, a)\n            },\n            decryptBlock: function(x, c) {\n                var _ = x[c + 1];\n                x[c + 1] = x[c + 3],\n                x[c + 3] = _,\n                this[_0x19c3(\"0xc1\")](x, c, this._invKeySchedule, d, l, p, b, s),\n                _ = x[c + 1],\n                x[c + 1] = x[c + 3],\n                x[c + 3] = _\n            },\n            _doCryptBlock: function(x, c, _, t, r, n, i, e) {\n                for (var o = this[_0x19c3(\"0xbd\")], a = x[c] ^ _[0], s = x[c + 1] ^ _[1], f = x[c + 2] ^ _[2], u = x[c + 3] ^ _[3], h = 4, v = 1; v < o; v++) {\n                    var d = t[a >>> 24] ^ r[s >>> 16 & 255] ^ n[f >>> 8 & 255] ^ i[255 & u] ^ _[h++]\n                      , l = t[s >>> 24] ^ r[f >>> 16 & 255] ^ n[u >>> 8 & 255] ^ i[255 & a] ^ _[h++]\n                      , p = t[f >>> 24] ^ r[u >>> 16 & 255] ^ n[a >>> 8 & 255] ^ i[255 & s] ^ _[h++]\n                      , b = t[u >>> 24] ^ r[a >>> 16 & 255] ^ n[s >>> 8 & 255] ^ i[255 & f] ^ _[h++];\n                    a = d,\n                    s = l,\n                    f = p,\n                    u = b\n                }\n                d = (e[a >>> 24] << 24 | e[s >>> 16 & 255] << 16 | e[f >>> 8 & 255] << 8 | e[255 & u]) ^ _[h++],\n                l = (e[s >>> 24] << 24 | e[f >>> 16 & 255] << 16 | e[u >>> 8 & 255] << 8 | e[255 & a]) ^ _[h++],\n                p = (e[f >>> 24] << 24 | e[u >>> 16 & 255] << 16 | e[a >>> 8 & 255] << 8 | e[255 & s]) ^ _[h++],\n                b = (e[u >>> 24] << 24 | e[a >>> 16 & 255] << 16 | e[s >>> 8 & 255] << 8 | e[255 & f]) ^ _[h++],\n                x[c] = d,\n                x[c + 1] = l,\n                x[c + 2] = p,\n                x[c + 3] = b\n            },\n            keySize: 8\n        });\n        x[_0x19c3(\"0xbc\")] = c._createHelper(t)\n    }(),\n    r[_0x19c3(\"0xbc\")])\n}\n, function(x, c, _) {\n    var e;\n    x[_0x19c3(\"0x0\")] = (e = _(0),\n    _(3),\n    _(4),\n    _(2),\n    _(1),\n    function() {\n        var x = e\n          , c = x[_0x19c3(\"0xe\")]\n          , _ = c[_0x19c3(\"0x3b\")]\n          , t = c.BlockCipher\n          , r = x[_0x19c3(\"0x39\")]\n          , a = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4]\n          , s = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32]\n          , f = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]\n          , u = [{\n            0: 8421888,\n            268435456: 32768,\n            536870912: 8421378,\n            805306368: 2,\n            1073741824: 512,\n            1342177280: 8421890,\n            1610612736: 8389122,\n            1879048192: 8388608,\n            2147483648: 514,\n            2415919104: 8389120,\n            2684354560: 33280,\n            2952790016: 8421376,\n            3221225472: 32770,\n            3489660928: 8388610,\n            3758096384: 0,\n            4026531840: 33282,\n            134217728: 0,\n            402653184: 8421890,\n            671088640: 33282,\n            939524096: 32768,\n            1207959552: 8421888,\n            1476395008: 512,\n            1744830464: 8421378,\n            2013265920: 2,\n            2281701376: 8389120,\n            2550136832: 33280,\n            2818572288: 8421376,\n            3087007744: 8389122,\n            3355443200: 8388610,\n            3623878656: 32770,\n            3892314112: 514,\n            4160749568: 8388608,\n            1: 32768,\n            268435457: 2,\n            536870913: 8421888,\n            805306369: 8388608,\n            1073741825: 8421378,\n            1342177281: 33280,\n            1610612737: 512,\n            1879048193: 8389122,\n            2147483649: 8421890,\n            2415919105: 8421376,\n            2684354561: 8388610,\n            2952790017: 33282,\n            3221225473: 514,\n            3489660929: 8389120,\n            3758096385: 32770,\n            4026531841: 0,\n            134217729: 8421890,\n            402653185: 8421376,\n            671088641: 8388608,\n            939524097: 512,\n            1207959553: 32768,\n            1476395009: 8388610,\n            1744830465: 2,\n            2013265921: 33282,\n            2281701377: 32770,\n            2550136833: 8389122,\n            2818572289: 514,\n            3087007745: 8421888,\n            3355443201: 8389120,\n            3623878657: 0,\n            3892314113: 33280,\n            4160749569: 8421378\n        }, {\n            0: 1074282512,\n            16777216: 16384,\n            33554432: 524288,\n            50331648: 1074266128,\n            67108864: 1073741840,\n            83886080: 1074282496,\n            100663296: 1073758208,\n            117440512: 16,\n            134217728: 540672,\n            150994944: 1073758224,\n            167772160: 1073741824,\n            184549376: 540688,\n            201326592: 524304,\n            218103808: 0,\n            234881024: 16400,\n            251658240: 1074266112,\n            8388608: 1073758208,\n            25165824: 540688,\n            41943040: 16,\n            58720256: 1073758224,\n            75497472: 1074282512,\n            92274688: 1073741824,\n            109051904: 524288,\n            125829120: 1074266128,\n            142606336: 524304,\n            159383552: 0,\n            176160768: 16384,\n            192937984: 1074266112,\n            209715200: 1073741840,\n            226492416: 540672,\n            243269632: 1074282496,\n            260046848: 16400,\n            268435456: 0,\n            285212672: 1074266128,\n            301989888: 1073758224,\n            318767104: 1074282496,\n            335544320: 1074266112,\n            352321536: 16,\n            369098752: 540688,\n            385875968: 16384,\n            402653184: 16400,\n            419430400: 524288,\n            436207616: 524304,\n            452984832: 1073741840,\n            469762048: 540672,\n            486539264: 1073758208,\n            503316480: 1073741824,\n            520093696: 1074282512,\n            276824064: 540688,\n            293601280: 524288,\n            310378496: 1074266112,\n            327155712: 16384,\n            343932928: 1073758208,\n            360710144: 1074282512,\n            377487360: 16,\n            394264576: 1073741824,\n            411041792: 1074282496,\n            427819008: 1073741840,\n            444596224: 1073758224,\n            461373440: 524304,\n            478150656: 0,\n            494927872: 16400,\n            511705088: 1074266128,\n            528482304: 540672\n        }, {\n            0: 260,\n            1048576: 0,\n            2097152: 67109120,\n            3145728: 65796,\n            4194304: 65540,\n            5242880: 67108868,\n            6291456: 67174660,\n            7340032: 67174400,\n            8388608: 67108864,\n            9437184: 67174656,\n            10485760: 65792,\n            11534336: 67174404,\n            12582912: 67109124,\n            13631488: 65536,\n            14680064: 4,\n            15728640: 256,\n            524288: 67174656,\n            1572864: 67174404,\n            2621440: 0,\n            3670016: 67109120,\n            4718592: 67108868,\n            5767168: 65536,\n            6815744: 65540,\n            7864320: 260,\n            8912896: 4,\n            9961472: 256,\n            11010048: 67174400,\n            12058624: 65796,\n            13107200: 65792,\n            14155776: 67109124,\n            15204352: 67174660,\n            16252928: 67108864,\n            16777216: 67174656,\n            17825792: 65540,\n            18874368: 65536,\n            19922944: 67109120,\n            20971520: 256,\n            22020096: 67174660,\n            23068672: 67108868,\n            24117248: 0,\n            25165824: 67109124,\n            26214400: 67108864,\n            27262976: 4,\n            28311552: 65792,\n            29360128: 67174400,\n            30408704: 260,\n            31457280: 65796,\n            32505856: 67174404,\n            17301504: 67108864,\n            18350080: 260,\n            19398656: 67174656,\n            20447232: 0,\n            21495808: 65540,\n            22544384: 67109120,\n            23592960: 256,\n            24641536: 67174404,\n            25690112: 65536,\n            26738688: 67174660,\n            27787264: 65796,\n            28835840: 67108868,\n            29884416: 67109124,\n            30932992: 67174400,\n            31981568: 4,\n            33030144: 65792\n        }, {\n            0: 2151682048,\n            65536: 2147487808,\n            131072: 4198464,\n            196608: 2151677952,\n            262144: 0,\n            327680: 4198400,\n            393216: 2147483712,\n            458752: 4194368,\n            524288: 2147483648,\n            589824: 4194304,\n            655360: 64,\n            720896: 2147487744,\n            786432: 2151678016,\n            851968: 4160,\n            917504: 4096,\n            983040: 2151682112,\n            32768: 2147487808,\n            98304: 64,\n            163840: 2151678016,\n            229376: 2147487744,\n            294912: 4198400,\n            360448: 2151682112,\n            425984: 0,\n            491520: 2151677952,\n            557056: 4096,\n            622592: 2151682048,\n            688128: 4194304,\n            753664: 4160,\n            819200: 2147483648,\n            884736: 4194368,\n            950272: 4198464,\n            1015808: 2147483712,\n            1048576: 4194368,\n            1114112: 4198400,\n            1179648: 2147483712,\n            1245184: 0,\n            1310720: 4160,\n            1376256: 2151678016,\n            1441792: 2151682048,\n            1507328: 2147487808,\n            1572864: 2151682112,\n            1638400: 2147483648,\n            1703936: 2151677952,\n            1769472: 4198464,\n            1835008: 2147487744,\n            1900544: 4194304,\n            1966080: 64,\n            2031616: 4096,\n            1081344: 2151677952,\n            1146880: 2151682112,\n            1212416: 0,\n            1277952: 4198400,\n            1343488: 4194368,\n            1409024: 2147483648,\n            1474560: 2147487808,\n            1540096: 64,\n            1605632: 2147483712,\n            1671168: 4096,\n            1736704: 2147487744,\n            1802240: 2151678016,\n            1867776: 4160,\n            1933312: 2151682048,\n            1998848: 4194304,\n            2064384: 4198464\n        }, {\n            0: 128,\n            4096: 17039360,\n            8192: 262144,\n            12288: 536870912,\n            16384: 537133184,\n            20480: 16777344,\n            24576: 553648256,\n            28672: 262272,\n            32768: 16777216,\n            36864: 537133056,\n            40960: 536871040,\n            45056: 553910400,\n            49152: 553910272,\n            53248: 0,\n            57344: 17039488,\n            61440: 553648128,\n            2048: 17039488,\n            6144: 553648256,\n            10240: 128,\n            14336: 17039360,\n            18432: 262144,\n            22528: 537133184,\n            26624: 553910272,\n            30720: 536870912,\n            34816: 537133056,\n            38912: 0,\n            43008: 553910400,\n            47104: 16777344,\n            51200: 536871040,\n            55296: 553648128,\n            59392: 16777216,\n            63488: 262272,\n            65536: 262144,\n            69632: 128,\n            73728: 536870912,\n            77824: 553648256,\n            81920: 16777344,\n            86016: 553910272,\n            90112: 537133184,\n            94208: 16777216,\n            98304: 553910400,\n            102400: 553648128,\n            106496: 17039360,\n            110592: 537133056,\n            114688: 262272,\n            118784: 536871040,\n            122880: 0,\n            126976: 17039488,\n            67584: 553648256,\n            71680: 16777216,\n            75776: 17039360,\n            79872: 537133184,\n            83968: 536870912,\n            88064: 17039488,\n            92160: 128,\n            96256: 553910272,\n            100352: 262272,\n            104448: 553910400,\n            108544: 0,\n            112640: 553648128,\n            116736: 16777344,\n            120832: 262144,\n            124928: 537133056,\n            129024: 536871040\n        }, {\n            0: 268435464,\n            256: 8192,\n            512: 270532608,\n            768: 270540808,\n            1024: 268443648,\n            1280: 2097152,\n            1536: 2097160,\n            1792: 268435456,\n            2048: 0,\n            2304: 268443656,\n            2560: 2105344,\n            2816: 8,\n            3072: 270532616,\n            3328: 2105352,\n            3584: 8200,\n            3840: 270540800,\n            128: 270532608,\n            384: 270540808,\n            640: 8,\n            896: 2097152,\n            1152: 2105352,\n            1408: 268435464,\n            1664: 268443648,\n            1920: 8200,\n            2176: 2097160,\n            2432: 8192,\n            2688: 268443656,\n            2944: 270532616,\n            3200: 0,\n            3456: 270540800,\n            3712: 2105344,\n            3968: 268435456,\n            4096: 268443648,\n            4352: 270532616,\n            4608: 270540808,\n            4864: 8200,\n            5120: 2097152,\n            5376: 268435456,\n            5632: 268435464,\n            5888: 2105344,\n            6144: 2105352,\n            6400: 0,\n            6656: 8,\n            6912: 270532608,\n            7168: 8192,\n            7424: 268443656,\n            7680: 270540800,\n            7936: 2097160,\n            4224: 8,\n            4480: 2105344,\n            4736: 2097152,\n            4992: 268435464,\n            5248: 268443648,\n            5504: 8200,\n            5760: 270540808,\n            6016: 270532608,\n            6272: 270540800,\n            6528: 270532616,\n            6784: 8192,\n            7040: 2105352,\n            7296: 2097160,\n            7552: 0,\n            7808: 268435456,\n            8064: 268443656\n        }, {\n            0: 1048576,\n            16: 33555457,\n            32: 1024,\n            48: 1049601,\n            64: 34604033,\n            80: 0,\n            96: 1,\n            112: 34603009,\n            128: 33555456,\n            144: 1048577,\n            160: 33554433,\n            176: 34604032,\n            192: 34603008,\n            208: 1025,\n            224: 1049600,\n            240: 33554432,\n            8: 34603009,\n            24: 0,\n            40: 33555457,\n            56: 34604032,\n            72: 1048576,\n            88: 33554433,\n            104: 33554432,\n            120: 1025,\n            136: 1049601,\n            152: 33555456,\n            168: 34603008,\n            184: 1048577,\n            200: 1024,\n            216: 34604033,\n            232: 1,\n            248: 1049600,\n            256: 33554432,\n            272: 1048576,\n            288: 33555457,\n            304: 34603009,\n            320: 1048577,\n            336: 33555456,\n            352: 34604032,\n            368: 1049601,\n            384: 1025,\n            400: 34604033,\n            416: 1049600,\n            432: 1,\n            448: 0,\n            464: 34603008,\n            480: 33554433,\n            496: 1024,\n            264: 1049600,\n            280: 33555457,\n            296: 34603009,\n            312: 1,\n            328: 33554432,\n            344: 1048576,\n            360: 1025,\n            376: 34604032,\n            392: 33554433,\n            408: 34603008,\n            424: 0,\n            440: 34604033,\n            456: 1049601,\n            472: 1024,\n            488: 33555456,\n            504: 1048577\n        }, {\n            0: 134219808,\n            1: 131072,\n            2: 134217728,\n            3: 32,\n            4: 131104,\n            5: 134350880,\n            6: 134350848,\n            7: 2048,\n            8: 134348800,\n            9: 134219776,\n            10: 133120,\n            11: 134348832,\n            12: 2080,\n            13: 0,\n            14: 134217760,\n            15: 133152,\n            2147483648: 2048,\n            2147483649: 134350880,\n            2147483650: 134219808,\n            2147483651: 134217728,\n            2147483652: 134348800,\n            2147483653: 133120,\n            2147483654: 133152,\n            2147483655: 32,\n            2147483656: 134217760,\n            2147483657: 2080,\n            2147483658: 131104,\n            2147483659: 134350848,\n            2147483660: 0,\n            2147483661: 134348832,\n            2147483662: 134219776,\n            2147483663: 131072,\n            16: 133152,\n            17: 134350848,\n            18: 32,\n            19: 2048,\n            20: 134219776,\n            21: 134217760,\n            22: 134348832,\n            23: 131072,\n            24: 0,\n            25: 131104,\n            26: 134348800,\n            27: 134219808,\n            28: 134350880,\n            29: 133120,\n            30: 2080,\n            31: 134217728,\n            2147483664: 131072,\n            2147483665: 2048,\n            2147483666: 134348832,\n            2147483667: 133152,\n            2147483668: 32,\n            2147483669: 134348800,\n            2147483670: 134217728,\n            2147483671: 134219808,\n            2147483672: 134350880,\n            2147483673: 134217760,\n            2147483674: 134219776,\n            2147483675: 0,\n            2147483676: 133120,\n            2147483677: 2080,\n            2147483678: 131104,\n            2147483679: 134350848\n        }]\n          , h = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679]\n          , n = r[_0x19c3(\"0xc2\")] = t[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                for (var x = this[_0x19c3(\"0x40\")][_0x19c3(\"0x16\")], c = [], _ = 0; _ < 56; _++) {\n                    var t = a[_] - 1;\n                    c[_] = x[t >>> 5] >>> 31 - t % 32 & 1\n                }\n                for (var r = this[_0x19c3(\"0xc3\")] = [], n = 0; n < 16; n++) {\n                    var i = r[n] = []\n                      , e = f[n];\n                    for (_ = 0; _ < 24; _++)\n                        i[_ / 6 | 0] |= c[(s[_] - 1 + e) % 28] << 31 - _ % 6,\n                        i[4 + (_ / 6 | 0)] |= c[28 + (s[_ + 24] - 1 + e) % 28] << 31 - _ % 6;\n                    for (i[0] = i[0] << 1 | i[0] >>> 31,\n                    _ = 1; _ < 7; _++)\n                        i[_] = i[_] >>> 4 * (_ - 1) + 3;\n                    i[7] = i[7] << 5 | i[7] >>> 27\n                }\n                var o = this._invSubKeys = [];\n                for (_ = 0; _ < 16; _++)\n                    o[_] = r[15 - _]\n            },\n            encryptBlock: function(x, c) {\n                this._doCryptBlock(x, c, this[_0x19c3(\"0xc3\")])\n            },\n            decryptBlock: function(x, c) {\n                this[_0x19c3(\"0xc1\")](x, c, this[_0x19c3(\"0xc4\")])\n            },\n            _doCryptBlock: function(x, c, _) {\n                this[_0x19c3(\"0xc5\")] = x[c],\n                this[_0x19c3(\"0xc6\")] = x[c + 1],\n                v[_0x19c3(\"0xd\")](this, 4, 252645135),\n                v.call(this, 16, 65535),\n                d[_0x19c3(\"0xd\")](this, 2, 858993459),\n                d[_0x19c3(\"0xd\")](this, 8, 16711935),\n                v.call(this, 1, 1431655765);\n                for (var t = 0; t < 16; t++) {\n                    for (var r = _[t], n = this[_0x19c3(\"0xc5\")], i = this[_0x19c3(\"0xc6\")], e = 0, o = 0; o < 8; o++)\n                        e |= u[o][((i ^ r[o]) & h[o]) >>> 0];\n                    this._lBlock = i,\n                    this._rBlock = n ^ e\n                }\n                var a = this[_0x19c3(\"0xc5\")];\n                this[_0x19c3(\"0xc5\")] = this._rBlock,\n                this[_0x19c3(\"0xc6\")] = a,\n                v[_0x19c3(\"0xd\")](this, 1, 1431655765),\n                d[_0x19c3(\"0xd\")](this, 8, 16711935),\n                d.call(this, 2, 858993459),\n                v[_0x19c3(\"0xd\")](this, 16, 65535),\n                v.call(this, 4, 252645135),\n                x[c] = this[_0x19c3(\"0xc5\")],\n                x[c + 1] = this[_0x19c3(\"0xc6\")]\n            },\n            keySize: 2,\n            ivSize: 2,\n            blockSize: 2\n        });\n        function v(x, c) {\n            var _ = (this._lBlock >>> x ^ this[_0x19c3(\"0xc6\")]) & c;\n            this[_0x19c3(\"0xc6\")] ^= _,\n            this[_0x19c3(\"0xc5\")] ^= _ << x\n        }\n        function d(x, c) {\n            var _ = (this._rBlock >>> x ^ this[_0x19c3(\"0xc5\")]) & c;\n            this[_0x19c3(\"0xc5\")] ^= _,\n            this[_0x19c3(\"0xc6\")] ^= _ << x\n        }\n        x[_0x19c3(\"0xc2\")] = t[_0x19c3(\"0x79\")](n);\n        var i = r[_0x19c3(\"0xc7\")] = t[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                var x = this[_0x19c3(\"0x40\")].words;\n                this._des1 = n[_0x19c3(\"0x52\")](_[_0x19c3(\"0x7\")](x[_0x19c3(\"0x1b\")](0, 2))),\n                this[_0x19c3(\"0xc8\")] = n.createEncryptor(_[_0x19c3(\"0x7\")](x.slice(2, 4))),\n                this[_0x19c3(\"0xc9\")] = n.createEncryptor(_[_0x19c3(\"0x7\")](x[_0x19c3(\"0x1b\")](4, 6)))\n            },\n            encryptBlock: function(x, c) {\n                this[_0x19c3(\"0xca\")].encryptBlock(x, c),\n                this[_0x19c3(\"0xc8\")][_0x19c3(\"0xb5\")](x, c),\n                this[_0x19c3(\"0xc9\")][_0x19c3(\"0x4d\")](x, c)\n            },\n            decryptBlock: function(x, c) {\n                this[_0x19c3(\"0xc9\")][_0x19c3(\"0xb5\")](x, c),\n                this[_0x19c3(\"0xc8\")][_0x19c3(\"0x4d\")](x, c),\n                this[_0x19c3(\"0xca\")][_0x19c3(\"0xb5\")](x, c)\n            },\n            keySize: 6,\n            ivSize: 2,\n            blockSize: 2\n        });\n        x.TripleDES = t[_0x19c3(\"0x79\")](i)\n    }(),\n    e[_0x19c3(\"0xc7\")])\n}\n, function(x, c, _) {\n    var i;\n    x[_0x19c3(\"0x0\")] = (i = _(0),\n    _(3),\n    _(4),\n    _(2),\n    _(1),\n    function() {\n        var x = i\n          , c = x.lib[_0x19c3(\"0xcb\")]\n          , _ = x.algo\n          , t = _[_0x19c3(\"0xcc\")] = c[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                for (var x = this[_0x19c3(\"0x40\")], c = x[_0x19c3(\"0x16\")], _ = x[_0x19c3(\"0x17\")], t = this._S = [], r = 0; r < 256; r++)\n                    t[r] = r;\n                for (var n = r = 0; r < 256; r++) {\n                    var i = r % _\n                      , e = c[i >>> 2] >>> 24 - i % 4 * 8 & 255;\n                    n = (n + t[r] + e) % 256;\n                    var o = t[r];\n                    t[r] = t[n],\n                    t[n] = o\n                }\n                this._i = this._j = 0\n            },\n            _doProcessBlock: function(x, c) {\n                x[c] ^= r[_0x19c3(\"0xd\")](this)\n            },\n            keySize: 8,\n            ivSize: 0\n        });\n        function r() {\n            for (var x = this._S, c = this._i, _ = this._j, t = 0, r = 0; r < 4; r++) {\n                _ = (_ + x[c = (c + 1) % 256]) % 256;\n                var n = x[c];\n                x[c] = x[_],\n                x[_] = n,\n                t |= x[(x[c] + x[_]) % 256] << 24 - 8 * r\n            }\n            return this._i = c,\n            this._j = _,\n            t\n        }\n        x[_0x19c3(\"0xcc\")] = c[_0x19c3(\"0x79\")](t);\n        var n = _.RC4Drop = t.extend({\n            cfg: t.cfg[_0x19c3(\"0x15\")]({\n                drop: 192\n            }),\n            _doReset: function() {\n                t[_0x19c3(\"0x41\")].call(this);\n                for (var x = this[_0x19c3(\"0x33\")][_0x19c3(\"0xcd\")]; 0 < x; x--)\n                    r.call(this)\n            }\n        });\n        x[_0x19c3(\"0xce\")] = c._createHelper(n)\n    }(),\n    i[_0x19c3(\"0xcc\")])\n}\n, function(x, c, _) {\n    var n;\n    x[_0x19c3(\"0x0\")] = (n = _(0),\n    _(3),\n    _(4),\n    _(2),\n    _(1),\n    function() {\n        var x = n\n          , c = x.lib[_0x19c3(\"0xcb\")]\n          , _ = x[_0x19c3(\"0x39\")]\n          , r = []\n          , o = []\n          , a = []\n          , t = _[_0x19c3(\"0xcf\")] = c.extend({\n            _doReset: function() {\n                for (var x = this[_0x19c3(\"0x40\")][_0x19c3(\"0x16\")], c = this[_0x19c3(\"0x33\")].iv, _ = 0; _ < 4; _++)\n                    x[_] = 16711935 & (x[_] << 8 | x[_] >>> 24) | 4278255360 & (x[_] << 24 | x[_] >>> 8);\n                var t = this._X = [x[0], x[3] << 16 | x[2] >>> 16, x[1], x[0] << 16 | x[3] >>> 16, x[2], x[1] << 16 | x[0] >>> 16, x[3], x[2] << 16 | x[1] >>> 16]\n                  , r = this._C = [x[2] << 16 | x[2] >>> 16, 4294901760 & x[0] | 65535 & x[1], x[3] << 16 | x[3] >>> 16, 4294901760 & x[1] | 65535 & x[2], x[0] << 16 | x[0] >>> 16, 4294901760 & x[2] | 65535 & x[3], x[1] << 16 | x[1] >>> 16, 4294901760 & x[3] | 65535 & x[0]];\n                for (_ = this._b = 0; _ < 4; _++)\n                    u.call(this);\n                for (_ = 0; _ < 8; _++)\n                    r[_] ^= t[_ + 4 & 7];\n                if (c) {\n                    var n = c.words\n                      , i = n[0]\n                      , e = n[1]\n                      , o = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8)\n                      , a = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8)\n                      , s = o >>> 16 | 4294901760 & a\n                      , f = a << 16 | 65535 & o;\n                    for (r[0] ^= o,\n                    r[1] ^= s,\n                    r[2] ^= a,\n                    r[3] ^= f,\n                    r[4] ^= o,\n                    r[5] ^= s,\n                    r[6] ^= a,\n                    r[7] ^= f,\n                    _ = 0; _ < 4; _++)\n                        u[_0x19c3(\"0xd\")](this)\n                }\n            },\n            _doProcessBlock: function(x, c) {\n                var _ = this._X;\n                u[_0x19c3(\"0xd\")](this),\n                r[0] = _[0] ^ _[5] >>> 16 ^ _[3] << 16,\n                r[1] = _[2] ^ _[7] >>> 16 ^ _[5] << 16,\n                r[2] = _[4] ^ _[1] >>> 16 ^ _[7] << 16,\n                r[3] = _[6] ^ _[3] >>> 16 ^ _[1] << 16;\n                for (var t = 0; t < 4; t++)\n                    r[t] = 16711935 & (r[t] << 8 | r[t] >>> 24) | 4278255360 & (r[t] << 24 | r[t] >>> 8),\n                    x[c + t] ^= r[t]\n            },\n            blockSize: 4,\n            ivSize: 2\n        });\n        function u() {\n            for (var x = this._X, c = this._C, _ = 0; _ < 8; _++)\n                o[_] = c[_];\n            for (c[0] = c[0] + 1295307597 + this._b | 0,\n            c[1] = c[1] + 3545052371 + (c[0] >>> 0 < o[0] >>> 0 ? 1 : 0) | 0,\n            c[2] = c[2] + 886263092 + (c[1] >>> 0 < o[1] >>> 0 ? 1 : 0) | 0,\n            c[3] = c[3] + 1295307597 + (c[2] >>> 0 < o[2] >>> 0 ? 1 : 0) | 0,\n            c[4] = c[4] + 3545052371 + (c[3] >>> 0 < o[3] >>> 0 ? 1 : 0) | 0,\n            c[5] = c[5] + 886263092 + (c[4] >>> 0 < o[4] >>> 0 ? 1 : 0) | 0,\n            c[6] = c[6] + 1295307597 + (c[5] >>> 0 < o[5] >>> 0 ? 1 : 0) | 0,\n            c[7] = c[7] + 3545052371 + (c[6] >>> 0 < o[6] >>> 0 ? 1 : 0) | 0,\n            this._b = c[7] >>> 0 < o[7] >>> 0 ? 1 : 0,\n            _ = 0; _ < 8; _++) {\n                var t = x[_] + c[_]\n                  , r = 65535 & t\n                  , n = t >>> 16\n                  , i = ((r * r >>> 17) + r * n >>> 15) + n * n\n                  , e = ((4294901760 & t) * t | 0) + ((65535 & t) * t | 0);\n                a[_] = i ^ e\n            }\n            x[0] = a[0] + (a[7] << 16 | a[7] >>> 16) + (a[6] << 16 | a[6] >>> 16) | 0,\n            x[1] = a[1] + (a[0] << 8 | a[0] >>> 24) + a[7] | 0,\n            x[2] = a[2] + (a[1] << 16 | a[1] >>> 16) + (a[0] << 16 | a[0] >>> 16) | 0,\n            x[3] = a[3] + (a[2] << 8 | a[2] >>> 24) + a[1] | 0,\n            x[4] = a[4] + (a[3] << 16 | a[3] >>> 16) + (a[2] << 16 | a[2] >>> 16) | 0,\n            x[5] = a[5] + (a[4] << 8 | a[4] >>> 24) + a[3] | 0,\n            x[6] = a[6] + (a[5] << 16 | a[5] >>> 16) + (a[4] << 16 | a[4] >>> 16) | 0,\n            x[7] = a[7] + (a[6] << 8 | a[6] >>> 24) + a[5] | 0\n        }\n        x[_0x19c3(\"0xcf\")] = c[_0x19c3(\"0x79\")](t)\n    }(),\n    n[_0x19c3(\"0xcf\")])\n}\n, function(x, c, _) {\n    var n;\n    x[_0x19c3(\"0x0\")] = (n = _(0),\n    _(3),\n    _(4),\n    _(2),\n    _(1),\n    function() {\n        var x = n\n          , c = x.lib[_0x19c3(\"0xcb\")]\n          , _ = x[_0x19c3(\"0x39\")]\n          , r = []\n          , o = []\n          , a = []\n          , t = _[_0x19c3(\"0xd0\")] = c[_0x19c3(\"0x15\")]({\n            _doReset: function() {\n                for (var x = this[_0x19c3(\"0x40\")][_0x19c3(\"0x16\")], c = this.cfg.iv, _ = this._X = [x[0], x[3] << 16 | x[2] >>> 16, x[1], x[0] << 16 | x[3] >>> 16, x[2], x[1] << 16 | x[0] >>> 16, x[3], x[2] << 16 | x[1] >>> 16], t = this._C = [x[2] << 16 | x[2] >>> 16, 4294901760 & x[0] | 65535 & x[1], x[3] << 16 | x[3] >>> 16, 4294901760 & x[1] | 65535 & x[2], x[0] << 16 | x[0] >>> 16, 4294901760 & x[2] | 65535 & x[3], x[1] << 16 | x[1] >>> 16, 4294901760 & x[3] | 65535 & x[0]], r = this._b = 0; r < 4; r++)\n                    u[_0x19c3(\"0xd\")](this);\n                for (r = 0; r < 8; r++)\n                    t[r] ^= _[r + 4 & 7];\n                if (c) {\n                    var n = c.words\n                      , i = n[0]\n                      , e = n[1]\n                      , o = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8)\n                      , a = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8)\n                      , s = o >>> 16 | 4294901760 & a\n                      , f = a << 16 | 65535 & o;\n                    for (t[0] ^= o,\n                    t[1] ^= s,\n                    t[2] ^= a,\n                    t[3] ^= f,\n                    t[4] ^= o,\n                    t[5] ^= s,\n                    t[6] ^= a,\n                    t[7] ^= f,\n                    r = 0; r < 4; r++)\n                        u[_0x19c3(\"0xd\")](this)\n                }\n            },\n            _doProcessBlock: function(x, c) {\n                var _ = this._X;\n                u.call(this),\n                r[0] = _[0] ^ _[5] >>> 16 ^ _[3] << 16,\n                r[1] = _[2] ^ _[7] >>> 16 ^ _[5] << 16,\n                r[2] = _[4] ^ _[1] >>> 16 ^ _[7] << 16,\n                r[3] = _[6] ^ _[3] >>> 16 ^ _[1] << 16;\n                for (var t = 0; t < 4; t++)\n                    r[t] = 16711935 & (r[t] << 8 | r[t] >>> 24) | 4278255360 & (r[t] << 24 | r[t] >>> 8),\n                    x[c + t] ^= r[t]\n            },\n            blockSize: 4,\n            ivSize: 2\n        });\n        function u() {\n            for (var x = this._X, c = this._C, _ = 0; _ < 8; _++)\n                o[_] = c[_];\n            for (c[0] = c[0] + 1295307597 + this._b | 0,\n            c[1] = c[1] + 3545052371 + (c[0] >>> 0 < o[0] >>> 0 ? 1 : 0) | 0,\n            c[2] = c[2] + 886263092 + (c[1] >>> 0 < o[1] >>> 0 ? 1 : 0) | 0,\n            c[3] = c[3] + 1295307597 + (c[2] >>> 0 < o[2] >>> 0 ? 1 : 0) | 0,\n            c[4] = c[4] + 3545052371 + (c[3] >>> 0 < o[3] >>> 0 ? 1 : 0) | 0,\n            c[5] = c[5] + 886263092 + (c[4] >>> 0 < o[4] >>> 0 ? 1 : 0) | 0,\n            c[6] = c[6] + 1295307597 + (c[5] >>> 0 < o[5] >>> 0 ? 1 : 0) | 0,\n            c[7] = c[7] + 3545052371 + (c[6] >>> 0 < o[6] >>> 0 ? 1 : 0) | 0,\n            this._b = c[7] >>> 0 < o[7] >>> 0 ? 1 : 0,\n            _ = 0; _ < 8; _++) {\n                var t = x[_] + c[_]\n                  , r = 65535 & t\n                  , n = t >>> 16\n                  , i = ((r * r >>> 17) + r * n >>> 15) + n * n\n                  , e = ((4294901760 & t) * t | 0) + ((65535 & t) * t | 0);\n                a[_] = i ^ e\n            }\n            x[0] = a[0] + (a[7] << 16 | a[7] >>> 16) + (a[6] << 16 | a[6] >>> 16) | 0,\n            x[1] = a[1] + (a[0] << 8 | a[0] >>> 24) + a[7] | 0,\n            x[2] = a[2] + (a[1] << 16 | a[1] >>> 16) + (a[0] << 16 | a[0] >>> 16) | 0,\n            x[3] = a[3] + (a[2] << 8 | a[2] >>> 24) + a[1] | 0,\n            x[4] = a[4] + (a[3] << 16 | a[3] >>> 16) + (a[2] << 16 | a[2] >>> 16) | 0,\n            x[5] = a[5] + (a[4] << 8 | a[4] >>> 24) + a[3] | 0,\n            x[6] = a[6] + (a[5] << 16 | a[5] >>> 16) + (a[4] << 16 | a[4] >>> 16) | 0,\n            x[7] = a[7] + (a[6] << 8 | a[6] >>> 24) + a[5] | 0\n        }\n        x.RabbitLegacy = c[_0x19c3(\"0x79\")](t)\n    }(),\n    n[_0x19c3(\"0xd0\")])\n}\n, function(x, c) {\n    x[_0x19c3(\"0x0\")] = function t(x) {\n        var c = {};\n        for (var _ in x)\n            c[_] = x[_];\n        return c\n    }\n}\n, function(x, c, _) {\n    var r = _(11);\n    x[_0x19c3(\"0x0\")] = function(x) {\n        try {\n            var c = document[_0x19c3(\"0xd1\")][_0x19c3(\"0xd2\")] + _0x19c3(\"0xd3\") + _0x19c3(\"0xd4\") + (new Date)[_0x19c3(\"0x95\")]() + _0x19c3(\"0xd5\");\n            c += _0x19c3(\"0xd6\") + x,\n            c += _0x19c3(\"0xd7\"),\n            c += \"&module=wapna\",\n            c += \"&auto_statistic=\" + r(_0x19c3(\"0xd8\")),\n            c += _0x19c3(\"0xd9\");\n            var _ = new Image;\n            _[_0x19c3(\"0xda\")] = _[_0x19c3(\"0xdb\")] = function() {\n                _.onload = _[_0x19c3(\"0xdb\")] = null,\n                _ = null\n            }\n            ,\n            _[_0x19c3(\"0xdc\")] = c\n        } catch (t) {}\n    }\n}\n, function(x, c) {\n    var i = 0;\n    function _(x) {\n        return function r(x) {\n            for (var c = i ? \"0123456789ABCDEF\" : \"0123456789abcdef\", _ = \"\", t = 0; t < 4 * x[_0x19c3(\"0x18\")]; t++)\n                _ += c[_0x19c3(\"0x6c\")](x[t >> 2] >> 8 * (3 - t % 4) + 4 & 15) + c[_0x19c3(\"0x6c\")](x[t >> 2] >> 8 * (3 - t % 4) & 15);\n            return _\n        }(function p(x) {\n            for (var c = x, _ = Array(80), t = 1732584193, r = -271733879, n = -1732584194, i = 271733878, e = -1009589776, o = 0; o < c[_0x19c3(\"0x18\")]; o += 16) {\n                for (var a = t, s = r, f = n, u = i, h = e, v = 0; v < 80; v++) {\n                    _[v] = v < 16 ? c[o + v] : g(_[v - 3] ^ _[v - 8] ^ _[v - 14] ^ _[v - 16], 1);\n                    var d = y(y(g(t, 5), b(v, r, n, i)), y(y(e, _[v]), (l = v) < 20 ? 1518500249 : l < 40 ? 1859775393 : l < 60 ? -1894007588 : -899497514));\n                    e = i,\n                    i = n,\n                    n = g(r, 30),\n                    r = t,\n                    t = d\n                }\n                t = y(t, a),\n                r = y(r, s),\n                n = y(n, f),\n                i = y(i, u),\n                e = y(e, h)\n            }\n            var l;\n            return new Array(t,r,n,i,e)\n        }(function n(x) {\n            for (var c = 1 + (x.length + 8 >> 6), _ = new Array(16 * c), t = 0; t < 16 * c; t++)\n                _[t] = 0;\n            for (t = 0; t < x[_0x19c3(\"0x18\")]; t++)\n                _[t >> 2] |= x[_0x19c3(\"0x23\")](t) << 24 - 8 * (3 & t);\n            return _[t >> 2] |= 128 << 24 - 8 * (3 & t),\n            _[16 * c - 1] = 8 * x[_0x19c3(\"0x18\")],\n            _\n        }(x)))\n    }\n    function b(x, c, _, t) {\n        return x < 20 ? c & _ | ~c & t : x < 40 ? c ^ _ ^ t : x < 60 ? c & _ | c & t | _ & t : c ^ _ ^ t\n    }\n    function y(x, c) {\n        var _ = (65535 & x) + (65535 & c);\n        return (x >> 16) + (c >> 16) + (_ >> 16) << 16 | 65535 & _\n    }\n    function g(x, c) {\n        return x << c | x >>> 32 - c\n    }\n    x[_0x19c3(\"0x0\")] = _\n}\n]));\n\n\nfunction v3test(s_dv,s_name,s_code,s_verifystring){\n\n\nx={\n\nadapter: \"\",\nbanner: \"1\",\nbdrefer: \"\",\nclient: \"\",\nclientfrom: \"\",\ndv: s_dv,\nindex: \"\",\nliveAbility: \"\",\nskin: \"\",\nsubpro: \"\",\nsuppcheck: \"\",\ntpl: \"\",\ntype: \"\",\nuserid: \"\",\nusername: s_name,\nvcode: s_code,\nverifystring: s_verifystring\n\n};\n\nc=undefined;\n\nvar o = \"OOOO00\"\n              , t = \"OOO00O\"\n              , d = \"OOO000\"\n              , e = \"OOO0OO\"\n              , w = \"O0OOO0\"\n              , c = {\n                OOOOO0: o,\n                O00000: t,\n                O0O00O: d,\n                O000OO: e,\n                O0O000: w\n            }\n              , i = (new Date).getTime() / 1e3\n              s = parseInt(i / 86400, 10) % 5;\n              //, h = c[Object.keys(c)[s]] || \"\";\n\nswitch (s) {\n    case 0:\n       _=\"moonshad5moonsh2\";\n        break;\n    case 1:\n       _=\"moonshad3moonsh0\";\n         break;\n    case 2:\n       _=\"moonshad8moonsh6\";\n         break;\n    case 3:\n       _=\"moonshad0moonsh1\";\n         break;\n    case 4:\n       _=\"moonshad1moonsh9\";\n         break;\n}\n\n\n//_=\"moonshad1moonsh9\";\nreturn xxoo(x, c, _);\n\n}\n"
  },
  {
    "path": "其他实战/【百度】网页找回密码/demo.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-12-23  Python: 3.7\r\n\r\nimport requests\r\nimport re\r\nimport time\r\nimport random\r\nimport os\r\nimport sys\r\nimport execjs.runtime_names\r\n\r\nfrom urllib import parse\r\n\r\nsys.path.append(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))\r\n\r\nfrom header import *\r\n\r\n\r\nclass BaiDu:\r\n    \"\"\"\r\n    百度找回密码\r\n    \"\"\"\r\n\r\n    def __init__(self, username):\r\n        print('引擎', execjs.get().name)\r\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\r\n            self.js = execjs.compile(f.read())\r\n        self.dv = ''\r\n        self.username = username\r\n        self.cookies = None\r\n\r\n    def make_dv(self):\r\n        \"\"\"生成dv 参数\r\n        \"\"\"\r\n        with open(\"dv.js\", \"r\", encoding=\"utf-8\") as f:\r\n            js_dv = execjs.compile(f.read())\r\n        _time = int(round(time.time() * 1000)) / 1000\r\n        tk = \"tk0.29\" + str(random.randint(104771190122337, 904771190122337)) + str(_time * 1000)\r\n        self.dv = js_dv.call('MakeDv', _time, tk)\r\n        print('【生成dv】', self.dv)\r\n\r\n    def get_bds_token(self):\r\n        \"\"\"\r\n        第一次访问 取 bds_token\r\n        :return: bds_token\r\n        \"\"\"\r\n        response = requests.get('https://passport.baidu.com/?getpassindex', headers=headers_bds_token)\r\n        text = response.content.decode('utf-8')\r\n        bds_token = re.search(r'\"bdstoken\" value=\"(.*?)\"', text).group(1)\r\n        print(\"【bds_token】:\", bds_token)\r\n        self.cookies = response.cookies\r\n        return bds_token\r\n\r\n    def get_verify_str(self):\r\n        \"\"\"\r\n        第二次访问 取 verify_str\r\n        :return:\r\n        \"\"\"\r\n        response = requests.get(\"https://passport.baidu.com/v2/?reggetcodestr&v=1574477016779&callback=bd__cbs__rgpbwl\",\r\n                                headers=headers_verify_str, cookies=self.cookies)\r\n        text = response.content.decode('utf-8')\r\n        verify_str = re.search(r\"verifystr:'(.*?)'\", text).group(1)\r\n        print('【verifystr】:', verify_str)\r\n        return verify_str\r\n\r\n    def get_img(self, verify_str):\r\n        \"\"\"\r\n        第三补 请求图片\r\n        :return:\r\n        \"\"\"\r\n        response = requests.get('https://passport.baidu.com/cgi-bin/genimage?' + verify_str, cookies=self.cookies,\r\n                                headers=headers_img)\r\n        with open('验证码.png', 'wb') as f:\r\n            f.write(response.content)\r\n\r\n    def get_token(self, bds_token, verify_str, code, _time, sig):\r\n        \"\"\"\r\n        第四步 获取 Token\r\n        :return:\r\n        \"\"\"\r\n        data = {\r\n            \"username\": self.username,\r\n            \"veritycode\": code,\r\n            \"captcha_str\": verify_str,\r\n            \"bdstoken\": bds_token,\r\n            \"tpl\": '',\r\n            \"index\": 'username',\r\n            \"countrycode\": '',\r\n            \"alg\": 'v2',\r\n            \"time\": _time,\r\n            \"sig\": parse.quote(sig),\r\n            \"dv\": self.dv,\r\n        }\r\n        response = requests.post('https://passport.baidu.com/?getpassindex', data=data, headers=headers_token,\r\n                                 cookies=self.cookies)\r\n        text = response.content.decode('utf-8')\r\n        if '频繁' in text:\r\n            print('【错误：操作频繁】')\r\n        elif '验证码有误' in text:\r\n            print('【错误：验证码输错】')\r\n        else:\r\n            token = re.search(r\"token = '(.*?)';\", text).group(1)\r\n            token = token.replace('\\\\', '')\r\n            if token:\r\n                print('【token】：', token)\r\n            else:\r\n                print(text)\r\n                print('【错误】token 加载失败')\r\n                exit()\r\n            return token\r\n\r\n    def get_phone(self, token):\r\n        \"\"\"\r\n        第五步 获取电话\r\n        :return:\r\n        \"\"\"\r\n        url = 'https://passport.baidu.com/v2/sapi/authwidgetverify?authtoken=' + parse.quote(\r\n            token) + '&type=&jsonp=1&apiver=v3&verifychannel=&action=getapi&vcode=&questionAndAnswer=&needsid=&rsakey=&countrycode=&u=https%3A%2F%2Fpassport.qatest.baidu.com%2F%3Fgetpassresetpwd&tpl=&winsdk=&authAction=&callback=bd__cbs__oeq73u'\r\n        response = requests.get(url, cookies=self.cookies, headers=headers_get_phone)\r\n        text = response.content.decode(\"utf-8\")\r\n        if '系统繁忙' in text:\r\n            print('【错误：系统繁忙】')\r\n        else:\r\n            result = re.search('mobile\":\\'(.*?)\\'.*?email\":\\'(.*?)\\'', text)\r\n            print('电话:', result.group(1))\r\n            print('邮箱:', result.group(2))\r\n        print(response.text)\r\n\r\n    def js_call(self, bds_token, verify_str, code):\r\n        \"\"\"\r\n        运行js V8 获取参数\r\n        :return: _time, sig\r\n        \"\"\"\r\n        result = self.js.call('zh', bds_token, verify_str, self.dv, self.username, code)\r\n        _time, sig = result.split('|')\r\n        print(\"【time】：\", _time)\r\n        print(\"【sig】：\", sig)\r\n        return _time, sig\r\n\r\n    def start(self):\r\n        \"\"\"\r\n        启动\r\n        :return:\r\n        \"\"\"\r\n        code = None\r\n        self.make_dv()  # dv 获取\r\n        bds_token = self.get_bds_token()  # 1\r\n        verify_str = self.get_verify_str()  # 2\r\n        self.get_img(verify_str)\r\n\r\n        code = input('请输入验证码 （验证码图在目录下）>>>>  ')\r\n        print('【验证码】：', code)\r\n        if code:\r\n            # 账号处理\r\n            _time, sig = self.js_call(bds_token, verify_str, code)  # 3\r\n            token = self.get_token(bds_token, verify_str, code, _time, sig)  # 4\r\n            self.get_phone(token)  # 5\r\n\r\n\r\nif __name__ == '__main__':\r\n    user = input('用户名')\r\n    star = time.time()\r\n    bd = BaiDu(user)\r\n    bd.start()\r\n    print('【执行时间】：', time.time() - star, '秒')\r\n"
  },
  {
    "path": "其他实战/【百度】网页找回密码/dv.js",
    "content": "window = document = {};\r\ne = {};\r\nt = {};\r\n\r\nfunction n(e) {\r\n    var t = [[48, 57], [65, 90], [97, 122], [45, 45], [126, 126]]\r\n        , n = o(t)\r\n        , a = o(t.slice(1));\r\n    e && (n = r(n, e),\r\n        a = r(a, e)),\r\n        this.dict = n,\r\n        this.dict2 = a\r\n}\r\n\r\nfunction r(e, t) {\r\n    for (var n = t.split(\"\"), r = 0; r < e.length; r++) {\r\n        var o = r % n.length;\r\n        o = n[o].charCodeAt(0),\r\n            o %= e.length;\r\n        var a = e[r];\r\n        e[r] = e[o],\r\n            e[o] = a\r\n    }\r\n    return e\r\n}\r\n\r\nfunction o(e) {\r\n    for (var t = [], n = 0; n < e.length; n++)\r\n        for (var r = e[n][0]; r <= e[n][1]; r++)\r\n            t.push(String.fromCharCode(r));\r\n    return t\r\n}\r\n\r\nfunction a(e, t) {\r\n    var n = \"\"\r\n        , r = Math.abs(parseInt(e));\r\n    if (r)\r\n        for (; r;)\r\n            n += t[r % t.length],\r\n                r = parseInt(r / t.length);\r\n    else\r\n        n = t[0];\r\n    return n\r\n}\r\n\r\nfunction i() {\r\n    if (M = !0,\r\n        L = [],\r\n        D = \"number\" == typeof F.SendInterval && F.SendInterval > 0 ? F.SendInterval : 1,\r\n        k = F.ImgUrl,\r\n    (1 & F.SendMethod) > 0) {\r\n        var e = t.getElementById(\"dv_Input\");\r\n        if (e)\r\n            e.value = \"\";\r\n        else {\r\n            var n = t.getElementById(F.FormId);\r\n            n && (e = t.createElement(\"input\"),\r\n                e.type = \"hidden\",\r\n                e.name = \"dv\",\r\n                e.id = \"dv_Input\",\r\n                n.insertBefore(e, n.firstChild))\r\n        }\r\n    }\r\n    (8 & F.SendMethod) > 0 && F.RecordStr && (F.RecordStr = \"\")\r\n}\r\n\r\nfunction d(e) {\r\n    M && (x = e.token + \"@\" + S(e, e.token),\r\n    (1 & F.SendMethod) > 0 && c(x))\r\n}\r\n\r\nfunction c(n) {\r\n    var r = t.getElementById(\"dv_Input\");\r\n    r && (r.value = n),\r\n        e.LG_DV_ARG.dvjsInput = n\r\n}\r\n\r\nfunction f() {\r\n    var t, n, r, o, a = navigator.userAgent.toLowerCase(), i = function () {\r\n        var t, n = e || this;\r\n        return t = \"object\" == typeof n.onhelp ? \"IExplorer\" : \"object\" == typeof n.chrome ? \"Chrome\" : \"object\" == typeof n.InstallTrigger ? \"Firefox\" : \"object\" == typeof n.opera ? \"Opera\" : \"An unknown browser\"\r\n    };\r\n    return o = (n = a.match(/maxthon[\\/ ]([\\d.]+)/i)) ? (t = 12,\r\n        n[1]) : (n = a.match(/msie.*360se/i)) ? (t = 4,\r\n        \"-1\") : (n = a.match(/msie.*360ee/i)) ? (t = 5,\r\n        \"-1\") : (n = a.match(/se ([\\d]+.[\\w]*) metasr ([\\d.]+)/i)) ? (t = 7,\r\n        n[1]) : (n = a.match(/msie.*qihu theworld/i)) ? (t = 8,\r\n        \"-1\") : (n = a.match(/tencenttraveler ([\\d.]+)/i)) ? (t = 9,\r\n        n[1]) : (n = a.match(/qqbrowser\\/([\\d.]+)/i)) ? (t = 10,\r\n        n[1]) : (n = a.match(/msie ([\\d.]+)/i)) ? (t = 1,\r\n        n[1]) : (n = a.match(/firefox\\/([\\d.]+)/i)) ? (t = 3,\r\n        n[1]) : (n = a.match(/Opera.+Version\\/([\\d.]+)/i)) ? (t = 6,\r\n        n[1]) : (n = a.match(/opr\\/([\\d.]+)/i)) ? (t = 6,\r\n        n[1]) : (n = a.match(/version\\/([\\d.]+).*safari/i)) ? (t = 11,\r\n        n[1]) : (n = a.match(/chrome\\/([\\d.]+)/i)) ? (t = 2,\r\n        n[1]) : (r = i(),\r\n        t = r,\r\n        \"-1\"),\r\n        o = \"-1\" == o ? \"an unknown version\" : o.split(\".\")[0],\r\n        [t, o]\r\n}\r\n\r\nfunction u() {\r\n    var e = f()\r\n        , t = navigator.platform || navigator.userAgent\r\n        ,\r\n        n = t.match(/win/i) ? 1 : t.match(/linux/i) ? 2 : t.match(/Mac/i) ? 3 : t.match(/iPhone/i) ? 4 : t.match(/iPod/i) ? 5 : t.match(/iPad/i) ? 6 : 0;\r\n    return [n, e].join(\",\")\r\n}\r\n\r\nfunction l() {\r\n    return O\r\n}\r\n\r\nfunction v() {\r\n    try {\r\n        var n = e.mozInnerScreenY || e.screenTop\r\n            , r = e.mozInnerScreenX || e.screenLeft;\r\n        \"undefined\" == typeof n && (n = 0),\r\n        \"undefined\" == typeof r && (r = 0);\r\n        var o = t.body.clientWidth\r\n            , a = t.body.clientHeight\r\n            , i = e.screen.width\r\n            , d = e.screen.height\r\n            , c = e.screen.availWidth\r\n            , f = (e.screen.availHeight,\r\n            e.outerWidth)\r\n            , u = e.outerHeight;\r\n        return [n, r, o, a, i, d, c, f, u].join(\",\")\r\n    } catch (l) {\r\n    }\r\n}\r\n\r\nfunction s(n) {\r\n    try {\r\n        var r = \"\"\r\n            , o = n || e.event\r\n            , a = o.target || o.srcElement;\r\n        if (a && a.id && (r = encodeURIComponent(a.id)),\r\n            V++,\r\n        0 != F.RCMVEvent && A >= F.RCMVEvent)\r\n            return;\r\n        if (!(F.RCInterval > 0 && V == F.RCInterval))\r\n            return;\r\n        var i, c;\r\n        o.pageX ? (i = o.pageX,\r\n            c = o.pageY) : (i = o.clientX + t.body.scrollLeft - t.body.clientLeft,\r\n            c = o.clientY + t.body.scrollTop - t.body.clientTop);\r\n        var r = \"\"\r\n            , a = o.target || o.srcElement;\r\n        a && a.id && (r = encodeURIComponent(a.id));\r\n        var f = (new Date).getTime() - q;\r\n        w.mouseMove += [i, c, f, r].join(\",\") + \"|\",\r\n            A++,\r\n            V = 0,\r\n            d(w)\r\n    } catch (u) {\r\n    }\r\n}\r\n\r\nfunction h(n) {\r\n    try {\r\n        if (F.RCMSEvent > 0 && j >= F.RCMSEvent)\r\n            return;\r\n        var r = n || e.event\r\n            , o = r.pageX\r\n            , a = r.pageY;\r\n        void 0 == o && (o = r.clientX + t.body.scrollLeft,\r\n            a = r.clientY + t.body.scrollTop);\r\n        var i = r.target || r.srcElement\r\n            , c = 0;\r\n        \"undefined\" != typeof r.which && r.which <= 3 ? c = [9, 0, 1, 2][r.which] : \"undefined\" != typeof r.button && r.button <= 4 && (c = [9, 0, 2, 9, 1][r.button]);\r\n        var f = \"\";\r\n        i && i.id && (f = encodeURIComponent(i.id));\r\n        var u = \"\";\r\n        if (\"shape\" != i.nodeName)\r\n            for (var l = 0; l < F.EltAttrs.length; l++) {\r\n                var v = i.getAttribute(F.EltAttrs[l]);\r\n                v && (u = 0 == u.length ? F.EltAttrs[l] + \"=\" + encodeURIComponent(v) : u + \"&\" + F.EltAttrs[l] + \"=\" + encodeURIComponent(v))\r\n            }\r\n        {\r\n            var s = [o, a];\r\n            (new Date).getTime() - q\r\n        }\r\n        j++,\r\n            w.mouseDown += [s[0], s[1], c, time, f, u].join(\",\") + \"|\",\r\n            d(w)\r\n    } catch (h) {\r\n    }\r\n}\r\n\r\nfunction m(t) {\r\n    try {\r\n        if (F.RCKSEvent > 0 && G >= F.RCKSEvent)\r\n            return;\r\n        var n = t || e.event\r\n            , r = n.target || n.srcElement\r\n            , o = n.keyCode\r\n            , a = 0;\r\n        n.ctrlKey && 17 != o && (a += 1),\r\n        n.altKey && 18 != o && (a += 2),\r\n        n.shiftKey && 16 != o && (a += 4);\r\n        var i = \"null\";\r\n        r && (i = r.id ? encodeURIComponent(r.id) : r.name ? encodeURIComponent(r.name) : i);\r\n        for (var c = 0; c < F.ExcludeTarget.length; c++)\r\n            if (F.ExcludeTarget[c] == i)\r\n                return;\r\n        var f = (new Date).getTime() - q;\r\n        G++,\r\n            w.keyDown += [o, a, i, f].join(\",\") + \"|\",\r\n            d(w)\r\n    } catch (u) {\r\n    }\r\n}\r\n\r\nfunction p() {\r\n}\r\n\r\nfunction g(e, t) {\r\n    return !e || 0 >= t ? void 0 : e.length <= t ? e : e.substr(0, length)\r\n}\r\n\r\nfunction E() {\r\n    try {\r\n        var n = t.referer;\r\n        return !n && e.opener ? (n = e.opener.location,\r\n        n || (n = \"\")) : n = \"\",\r\n            [encodeURI(g(e.location.toString(), 50)), encodeURI(g(n.toString(), 50))].join(\",\")\r\n    } catch (r) {\r\n    }\r\n}\r\n\r\nfunction y() {\r\n    X++;\r\n    var e = \"\"\r\n        , t = \"\";\r\n    try {\r\n        e = p().getos(),\r\n            t = p().getversion()\r\n    } catch (n) {\r\n        if (10 == X)\r\n            return;\r\n        return void setTimeout(y, 200)\r\n    }\r\n    return e + t\r\n}\r\n\r\nfunction I() {\r\n    w.mouseDown = \"\",\r\n        w.keyDown = \"\",\r\n        w.mouseMove = \"\",\r\n    0 == _ && (_ = 1,\r\n        i(),\r\n    (2 & F.SendMethod) > 0 && setInterval(Y, F.SendTimer),\r\n        w.version = l(),\r\n        w.loadTime = q / 1e3,\r\n    F.BrowserInfo && (w.browserInfo = u()),\r\n        w.token = F.PageToken,\r\n    F.Location && (w.location = E()),\r\n    F.ScreenInfo && (w.screenInfo = v()),\r\n    F.FlashInfo && (w.flashInfo = y()),\r\n        d(w))\r\n}\r\n\r\nfunction C(e) {\r\n    var n = new Object;\r\n    n.mousedown = h,\r\n        n.keydown = m,\r\n        n.mousemove = s,\r\n        n.load = I,\r\n        n.beforeunload = H,\r\n        n.unload = H;\r\n    var r = (e.document,\r\n            function (e, t) {\r\n                t.attachEvent ? t.attachEvent(\"on\" + e, n[e], !1) : t.addEventListener && t.addEventListener(e, n[e], !1)\r\n            }\r\n    )\r\n        , o = function (e) {\r\n        r(e, t)\r\n    }\r\n        , a = function (t) {\r\n        r(t, e)\r\n    };\r\n    U.add(I),\r\n    F.EnableMCEvent && o(\"mousedown\"),\r\n    F.EnableKSEvent && o(\"keydown\"),\r\n    F.EnableMPEvent && o(\"mousemove\"),\r\n    (2 & F.SendMethod) > 0 && (\"undefined\" != typeof e.onbeforeunload && a(\"beforeunload\"),\r\n    \"undefined\" != typeof e.onunload && a(\"unload\"))\r\n}\r\n\r\nfunction R() {\r\n    if (\"undefined\" == typeof b)\r\n        return 1;\r\n    if (\"number\" != typeof b.Flag)\r\n        return 1;\r\n    var e = new Object;\r\n    if (\"undefined\" != typeof b.FormId && \"\" != b.FormId && (e.FormId = b.FormId),\r\n    \"undefined\" != typeof b.RecordStr && \"\" != b.RecordStr && (e.RecordStr = b.RecordStr),\r\n        e.EnableKSEvent = b.Flag >> 1 & 1,\r\n        e.EnableMCEvent = b.Flag >> 2 & 1,\r\n        e.EnableMPEvent = b.Flag >> 3 & 1,\r\n        e.RecordTimeInterval = b.Flag >> 6 & 1,\r\n        e.BrowserInfo = b.Flag >> 7 & 1,\r\n        e.LSIDInfo = b.Flag >> 10 & 1,\r\n        e.Location = b.Flag >> 11 & 1,\r\n        e.Token = b.Flag >> 12 & 1,\r\n        e.ScreenInfo = b.Flag >> 13 & 1,\r\n        e.FlashInfo = b.Flag >> 16 & 1,\r\n        e.DVID = b.Flag >> 17 & 1,\r\n        \"string\" == typeof b.Token ? e.PageToken = b.Token : e.Token = 0,\r\n        e.ImgUrl = \"string\" == typeof b.ImgUrl ? b.ImgUrl : \"\",\r\n        e.EltAttrs = [],\r\n    \"undefined\" != typeof b.EltAttrs)\r\n        for (var t = 0; t < b.EltAttrs.length; t++)\r\n            e.EltAttrs.push(b.EltAttrs[t]);\r\n    if (e.ExcludeTarget = [],\r\n    \"undefined\" != typeof b.ExcludeTarget)\r\n        for (var t = 0; t < b.ExcludeTarget.length; t++)\r\n            e.ExcludeTarget.push(b.ExcludeTarget[t]);\r\n    return e.RCInterval = \"undefined\" != typeof b.RCInterval && b.RCInterval > 0 ? b.RCInterval : 50,\r\n        e.RCMSEvent = \"undefined\" != typeof b.RCMSEvent && b.RCMSEvent > 0 ? b.RCMSEvent : 5,\r\n        e.RCKSEvent = \"undefined\" != typeof b.RCKSEvent && b.RCKSEvent > 0 ? b.RCKSEvent : 5,\r\n        e.RCMVEvent = \"undefined\" != typeof b.RCMVEvent && b.RCMVEvent > 0 ? b.RCMVEvent : 5,\r\n        e.RCFCEvent = \"undefined\" != typeof b.RCFCEvent && b.RCFCEvent > 0 ? b.RCFCEvent : 0,\r\n        e.SendInterval = \"undefined\" != typeof b.SendInterval && b.SendInterval > 0 ? b.SendInterval : 1,\r\n        e.SendMethod = \"undefined\" != typeof b.SendMethod && b.SendMethod > 0 ? b.SendMethod : 0,\r\n        e.GYInterval = \"undefined\" != typeof b.GYInterval && b.GYInterval > 0 ? b.GYInterval : 50,\r\n        e.RCGPEvent = \"undefined\" != typeof b.RCGPEvent && b.RCGPEvent > 0 ? b.RCGPEvent : 5,\r\n        e.RCTVEvent = \"undefined\" != typeof b.RCTVEvent && b.RCTVEvent > 0 ? b.RCTVEvent : 5,\r\n        e.SendMethod |= 1,\r\n        e.DVHost = \"string\" == typeof b.DVHost ? b.DVHost : \"passport.baidu.com\",\r\n        e.SendTimer = \"number\" == typeof b.SendTimer ? b.SendTimer : 1e3,\r\n        F = e,\r\n        F.BrowserInfo = !0,\r\n        F.Location = !0,\r\n        F.ScreenInfo = !0,\r\n        F.FlashInfo = !0,\r\n        F.LSIDInfo = !0,\r\n        0\r\n}\r\n\r\nfunction S(e, t) {\r\n    var r = new n(t)\r\n        , o = {\r\n        flashInfo: 0,\r\n        mouseDown: 1,\r\n        keyDown: 2,\r\n        mouseMove: 3,\r\n        version: 4,\r\n        loadTime: 5,\r\n        browserInfo: 6,\r\n        token: 7,\r\n        location: 8,\r\n        screenInfo: 9\r\n    }\r\n        , a = [r.iary([2])];\r\n    for (var i in e) {\r\n        var d = e[i];\r\n        if (void 0 !== d && void 0 !== o[i]) {\r\n            var c;\r\n            \"number\" == typeof d ? (c = d >= 0 ? 1 : 2,\r\n                d = r.int(d)) : \"boolean\" == typeof d ? (c = 3,\r\n                d = r.int(d ? 1 : 0)) : \"object\" == typeof d && d instanceof Array ? (c = 4,\r\n                d = r.bary(d)) : (c = 0,\r\n                d = r.str(d + \"\")),\r\n            d && a.push(r.iary([o[i], c, d.length]) + d)\r\n        }\r\n    }\r\n    return a.join(\"\")\r\n}\r\n\r\n\"undefined\" == typeof e.LG_DV_ARG && (e.LG_DV_ARG = {\r\n    tpl: \"pp\"\r\n});\r\nvar b = e.LG_DV_ARG\r\n    , w = {};\r\nb.SendMethod = 9,\r\n    b.ExcludeTarget = [\"password\"],\r\n    b.Token = \"tk\" + Math.random() + (new Date).getTime(),\r\n    b.RCMSEvent = 5,\r\n    b.RCKSEvent = 5,\r\n    b.RCMVEvent = 5,\r\n    b.RCTVEvent = 5,\r\n    b.RCFCEvent = 5,\r\n    b.ImgUrl = \"//baidu.com/error.jsonp?n=\",\r\n    b.Flag = parseInt(\"111111111111111111111111\", 2);\r\nvar T, M, i, D, F, k, c, d, u, f, v, l, A, V, s, j, h, L, G, m, p, E, y, _, I, U, C, R, K, P, B, l, Y, H, O = 26, X = 0;\r\nif (n.prototype = {\r\n    \"int\": function (e) {\r\n        return a(e, this.dict)\r\n    },\r\n    iary: function (e) {\r\n        for (var t = \"\", n = 0; n < e.length; n++) {\r\n            var r = a(e[n], this.dict2);\r\n            t += r.length > 1 ? r.length - 2 + r : r\r\n        }\r\n        return t\r\n    },\r\n    bary: function (e) {\r\n        for (var t = 0, n = {}, r = 0; r < e.length; r++)\r\n            e[r] > t && (t = e[r],\r\n                n[e[r]] = !0);\r\n        var o = parseInt(t / 6);\r\n        o += t % 6 ? 1 : 0;\r\n        for (var a = \"\", r = 0; o > r; r++) {\r\n            for (var i = 6 * r, d = 0, c = 0; 6 > c; c++)\r\n                n[i] && (d += Math.pow(2, c)),\r\n                    i++;\r\n            a += this.dict[d]\r\n        }\r\n        return a\r\n    },\r\n    str: function (e) {\r\n        for (var t = [], n = 0; n < e.length; n++) {\r\n            var r = e.charCodeAt(n);\r\n            r >= 1 && 127 >= r ? t.push(r) : r > 2047 ? (t.push(224 | r >> 12 & 15),\r\n                t.push(128 | r >> 6 & 63),\r\n                t.push(128 | r >> 0 & 63)) : (t.push(192 | r >> 6 & 31),\r\n                t.push(128 | r >> 0 & 63))\r\n        }\r\n        for (var o = \"\", n = 0, a = t.length; a > n;) {\r\n            var i = t[n++];\r\n            if (n >= a) {\r\n                o += this.dict[i >> 2],\r\n                    o += this.dict[(3 & i) << 4],\r\n                    o += \"__\";\r\n                break\r\n            }\r\n            var d = t[n++];\r\n            if (n >= a) {\r\n                o += this.dict[i >> 2],\r\n                    o += this.dict[(3 & i) << 4 | (240 & d) >> 4],\r\n                    o += this.dict[(15 & d) << 2],\r\n                    o += \"_\";\r\n                break\r\n            }\r\n            var c = t[n++];\r\n            o += this.dict[i >> 2],\r\n                o += this.dict[(3 & i) << 4 | (240 & d) >> 4],\r\n                o += this.dict[(15 & d) << 2 | (192 & c) >> 6],\r\n                o += this.dict[63 & c]\r\n        }\r\n        return o\r\n    }\r\n},\r\n    !e.ncdvjs) {\r\n    T = new RegExp(\"^(\\\\d{4})-(\\\\d{2})-(\\\\d{2})T(\\\\d{2}):(\\\\d{2}):(\\\\d{2})Z$\");\r\n    var q = (new Date).getTime();\r\n    A = 0,\r\n        V = 0,\r\n        j = 0,\r\n        G = 0,\r\n        _ = 0,\r\n        U = function () {\r\n            var n = []\r\n                , r = !1\r\n                , o = null\r\n                , a = function (e, t) {\r\n                try {\r\n                    e.apply(this, t || [])\r\n                } catch (n) {\r\n                }\r\n            }\r\n                , i = function () {\r\n                r = !0;\r\n                for (var e = 0; e < n.length; e++)\r\n                    a(n[e].fn, n[e].args || []);\r\n                n = []\r\n            };\r\n            return this.setOnError = function (e) {\r\n                return o = e,\r\n                    this\r\n            }\r\n                ,\r\n                this.add = function (e, t) {\r\n                    return r ? a(e, t) : n[n.length] = {\r\n                        fn: e,\r\n                        args: t\r\n                    },\r\n                        this\r\n                }\r\n                ,\r\n                e.addEventListener ? t.addEventListener(\"DOMContentLoaded\", function () {\r\n                    i()\r\n                }, !1) : !function () {\r\n\r\n                }(),\r\n                this\r\n        }(),\r\n        K = function () {\r\n            q = (new Date).getTime(),\r\n                A = 0,\r\n                V = 0,\r\n                j = 0,\r\n                G = 0,\r\n                focus_count = 0,\r\n                _ = 0,\r\n                R(),\r\n                I()\r\n        }\r\n        ,\r\n        P = function () {\r\n            function n() {\r\n                if (e.passportDm) {\r\n                    var t = {\r\n                        page: \"nc\",\r\n                        source: \"nc\",\r\n                        tpl: b.tpl\r\n                    };\r\n                    e.passportDm.init(t)\r\n                }\r\n            }\r\n\r\n            var r = t.getElementsByTagName(\"HEAD\").item(0)\r\n                , o = t.createElement(\"script\");\r\n            o.type = \"text/javascript\",\r\n                o.src = \"//\" + F.DVHost + \"/static/passpc-base/js/dv/dm.min.js\",\r\n                r.appendChild(o),\r\n                o.readyState ? o.onreadystatechange = function () {\r\n                        (\"loaded\" == o.readyState || \"complete\" == o.readyState) && (o.onreadystatechange = null,\r\n                            n())\r\n                    }\r\n                    : o.onload = function () {\r\n                        n()\r\n                    }\r\n        }\r\n        ,\r\n        B = function () {\r\n            e.ncdvjs = 1,\r\n            0 == R() && (C(e),\r\n                b.attachEvents = C,\r\n                b.reload = K)\r\n        }\r\n        ,\r\n        B();\r\n    var W = function () {\r\n        //  return t.getElementById(\"dv_Input\")\r\n    }\r\n        , z = function () {\r\n\r\n    };\r\n    z()\r\n}\r\n\r\n\r\nfunction MakeDv(NowTime, toK) {\r\n    //顺序不能乱\r\n    e = {\r\n        flashInfo: undefined,\r\n        mouseDown: \"593,252,0,[object HTMLInputElement],,|\",    //模拟鼠标按下的点\r\n        keyDown: \"\",\r\n        mouseMove: \"495,262,1721,content|720,279,3354,|692,259,13737,veritycode|\",   //模拟鼠标移动的点\r\n        version: 26,  //固定\r\n        loadTime: NowTime,     //13位时间戳后3位加个点。\r\n        browserInfo: \"1,2,78\",//浏览器版本\r\n        token: toK,////后面13位时间戳和前面的要对应  前面的0.29后面的随机生成\r\n        location: \"https://passport.baidu.com/?getpassindex,undefined\",\r\n        screenInfo: \"0,0,1903,651,1920,1080,1920,1920,1040\"  //模拟窗口大小等信息\r\n    };\r\n    return e.token + \"@\" + S(e, e.token);\r\n}\r\n\r\n// 调用方法：test1()"
  },
  {
    "path": "其他实战/【百度】网页找回密码/encryp.js",
    "content": "window = {};\r\nvar _0xeaa3 = ['_keySchedule', '_invKeySchedule', '_doCryptBlock', '_createHelper', 'moonshadmoonshad', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', 'exports', 'call', 'defineProperty', 'undefined', 'toStringTag', 'Module', '__esModule', 'object', 'create', 'default', 'string', 'bind', 'prototype', 'hasOwnProperty', 'screen', 'width', 'height', 'alg', 'version', 'time', 'round', 'getTime', 'sig', 'traceid', 'encryption', 'moonshad', 'ajax', 'https://passport.baidu.com/v3/security/uploadLog', 'POST', 'application/json;\\x20charset=utf-8', 'json', 'log', 'push', 'sort', 'length', 'join', 'split', 'substring', 'fromCharCode', 'charCodeAt', 'concat', '0123456789abcdef', 'charAt', 'Pass', 'function', 'amd', 'CryptoJS', 'lib', 'Base', 'mixIn', 'init', '$super', 'apply', 'extend', 'toString', 'WordArray', 'words', 'sigBytes', 'stringify', 'clamp', 'ceil', 'clone', 'slice', 'random', 'enc', 'Hex', 'substr', 'Latin1', 'Utf8', 'Malformed\\x20UTF-8\\x20data', 'parse', 'BufferedBlockAlgorithm', '_data', '_nDataBytes', 'blockSize', 'max', '_minBufferSize', 'min', '_doProcessBlock', 'splice', 'Hasher', 'cfg', 'reset', '_doReset', '_append', '_process', '_doFinalize', 'finalize', 'HMAC', 'algo', './core.min', './sha1.min', './hmac.min', 'MD5', 'EvpKDF', 'hasher', 'keySize', 'iterations', 'update', 'compute', 'Base64', '_map', '_reverseMap', 'indexOf', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', './evpkdf.min', 'Cipher', '_ENC_XFORM_MODE', '_DEC_XFORM_MODE', '_xformMode', '_key', 'encrypt', 'decrypt', 'StreamCipher', 'mode', 'BlockCipherMode', 'Encryptor', 'Decryptor', '_cipher', '_iv', 'CBC', '_prevBlock', 'encryptBlock', 'decryptBlock', 'pad', 'Pkcs7', 'BlockCipher', 'createEncryptor', 'createDecryptor', '_mode', '__creator', 'processBlock', 'padding', 'unpad', 'CipherParams', 'formatter', 'format', 'OpenSSL', 'ciphertext', 'salt', 'SerializableCipher', '_parse', 'kdf', 'PasswordBasedCipher', 'execute', 'ivSize', 'key', '_hasher', '_oKey', '_iKey', './cipher-core.min', 'ECB', './enc-base64.min', './md5.min', 'AES', '_nRounds', '_keyPriorReset']; (function(_0x43908c, _0x521867) {\r\nvar _0x55beb7 = function(_0x253717) {\r\n    while (--_0x253717) {\r\n        _0x43908c['push'](_0x43908c['shift']());\r\n    }\r\n};\r\n_0x55beb7(++_0x521867);\r\n} (_0xeaa3, 0x14c));\r\nvar _0x5c17 = function(_0x2918d4, _0x5a6245) {\r\n_0x2918d4 = _0x2918d4 - 0x0;\r\nvar _0x13391e = _0xeaa3[_0x2918d4];\r\nreturn _0x13391e;\r\n}; (function(_0x43c17c, _0x664c2d) {\r\nfor (var _0x2e28db in _0x664c2d) _0x43c17c[_0x2e28db] = _0x664c2d[_0x2e28db];\r\n} (window,\r\nfunction(_0x1803b4) {\r\nvar _0xecf318 = {};\r\nfunction _0xe9f535(_0x175f6e) {\r\n    if (_0xecf318[_0x175f6e]) {\r\n        return _0xecf318[_0x175f6e][_0x5c17('0x0')];\r\n    }\r\n    var _0x3e2347 = _0xecf318[_0x175f6e] = {\r\n        'i': _0x175f6e,\r\n        'l': ![],\r\n        'exports': {}\r\n    };\r\n    _0x1803b4[_0x175f6e][_0x5c17('0x1')](_0x3e2347[_0x5c17('0x0')], _0x3e2347, _0x3e2347[_0x5c17('0x0')], _0xe9f535);\r\n    _0x3e2347['l'] = !![];\r\n    return _0x3e2347[_0x5c17('0x0')];\r\n}\r\n_0xe9f535['m'] = _0x1803b4;\r\n_0xe9f535['c'] = _0xecf318;\r\n_0xe9f535['d'] = function(_0x1f8451, _0x5afcb2, _0x432f96) {\r\n    if (!_0xe9f535['o'](_0x1f8451, _0x5afcb2)) {\r\n        Object[_0x5c17('0x2')](_0x1f8451, _0x5afcb2, {\r\n            'enumerable': !![],\r\n            'get': _0x432f96\r\n        });\r\n    }\r\n};\r\n_0xe9f535['r'] = function(_0x380c48) {\r\n    if (typeof Symbol !== _0x5c17('0x3') && Symbol[_0x5c17('0x4')]) {\r\n        Object[_0x5c17('0x2')](_0x380c48, Symbol[_0x5c17('0x4')], {\r\n            'value': _0x5c17('0x5')\r\n        });\r\n    }\r\n    Object[_0x5c17('0x2')](_0x380c48, _0x5c17('0x6'), {\r\n        'value': !![]\r\n    });\r\n};\r\n_0xe9f535['t'] = function(_0x173f6b, _0xcb759) {\r\n    if (_0xcb759 & 0x1) _0x173f6b = _0xe9f535(_0x173f6b);\r\n    if (_0xcb759 & 0x8) return _0x173f6b;\r\n    if (_0xcb759 & 0x4 && typeof _0x173f6b === _0x5c17('0x7') && _0x173f6b && _0x173f6b[_0x5c17('0x6')]) return _0x173f6b;\r\n    var _0x3e6e2d = Object[_0x5c17('0x8')](null);\r\n    _0xe9f535['r'](_0x3e6e2d);\r\n    Object[_0x5c17('0x2')](_0x3e6e2d, _0x5c17('0x9'), {\r\n        'enumerable': !![],\r\n        'value': _0x173f6b\r\n    });\r\n    if (_0xcb759 & 0x2 && typeof _0x173f6b != _0x5c17('0xa')) for (var _0x42f866 in _0x173f6b) _0xe9f535['d'](_0x3e6e2d, _0x42f866,\r\n    function(_0x5ce0cd) {\r\n        return _0x173f6b[_0x5ce0cd];\r\n    } [_0x5c17('0xb')](null, _0x42f866));\r\n    return _0x3e6e2d;\r\n};\r\n_0xe9f535['n'] = function(_0x1c46a8) {\r\n    var _0x27762e = _0x1c46a8 && _0x1c46a8[_0x5c17('0x6')] ?\r\n    function getDefault() {\r\n        return _0x1c46a8[_0x5c17('0x9')];\r\n    }: function getModuleExports() {\r\n        return _0x1c46a8;\r\n    };\r\n    _0xe9f535['d'](_0x27762e, 'a', _0x27762e);\r\n    return _0x27762e;\r\n};\r\n_0xe9f535['o'] = function(_0x3f845e, _0x1f8f3f) {\r\n    return Object[_0x5c17('0xc')][_0x5c17('0xd')][_0x5c17('0x1')](_0x3f845e, _0x1f8f3f);\r\n};\r\n_0xe9f535['p'] = '';\r\nreturn _0xe9f535(_0xe9f535['s'] = 0x0);\r\n} ([function(_0x54dec2, _0x38423b, _0x4794a3) {\r\nvar _0x33037a = _0x4794a3(0x1);\r\nfunction _0xaafd7a(_0x53730b, _0x5bdb4f) {\r\n    var _0x3ed435 = _0x53730b || {};\r\n    _0x3ed435[_0x5c17('0x11')] = _0x33037a[_0x5c17('0x12')];\r\n    _0x3ed435[_0x5c17('0x13')] = Math[_0x5c17('0x14')](new Date()[_0x5c17('0x15')]() / 0x3e8);\r\n    if (_0x3ed435[_0x5c17('0xd')](_0x5c17('0x16'))) {\r\n        delete _0x3ed435[_0x5c17('0x16')];\r\n    }\r\n    if (_0x3ed435[_0x5c17('0xd')](_0x5c17('0x17'))) {\r\n        delete _0x3ed435[_0x5c17('0x17')];\r\n    }\r\n    return {\r\n        'time': _0x3ed435[_0x5c17('0x13')],\r\n        'alg': _0x3ed435[_0x5c17('0x11')],\r\n        'sig': _0x33037a[_0x5c17('0x18')](_0x3ed435, _0x5bdb4f)\r\n    };\r\n}\r\n_0x38423b[_0x5c17('0x19')] = _0xaafd7a;\r\nxxoo = _0xaafd7a;\r\n},\r\nfunction(_0x363e8e, _0x503786, _0x1678c3) {\r\nvar _0x394c26 = _0x1678c3(0x2);\r\nvar _0x531e93 = _0x1678c3(0x4);\r\nvar _0x599e77 = _0x1678c3(0x5);\r\n_0x363e8e[_0x5c17('0x0')] = {\r\n    'version': 'v2',\r\n    'encryption': function(_0xbf07f5, _0x10fdb9) {\r\n        var _0x5c6408 = _0x394c26(_0xbf07f5);\r\n        if (_0x10fdb9 && _0x10fdb9[_0x5c17('0x1a')]) {\r\n            try {\r\n                _0x10fdb9[_0x5c17('0x1a')]({\r\n                    'url': _0x5c17('0x1b'),\r\n                    'type': _0x5c17('0x1c'),\r\n                    'data': {\r\n                        'json': _0x5c6408,\r\n                        'encryption': _0x599e77(_0x531e93(_0x5c6408))\r\n                    },\r\n                    'contentType': _0x5c17('0x1d'),\r\n                    'dataType': _0x5c17('0x1e')\r\n                });\r\n            } catch(_0x4c8bd9) {\r\n                console[_0x5c17('0x1f')](_0x4c8bd9);\r\n            }\r\n        }\r\n        return _0x599e77(_0x531e93(_0x5c6408));\r\n    }\r\n};\r\n},\r\nfunction(_0x201e3f, _0x54fb3d, _0x31145a) {\r\nvar _0x17e8ce = _0x31145a(0x3);\r\nvar _0x3d7ddb = {\r\n    'a': '3',\r\n    'b': '4',\r\n    'c': '5',\r\n    'd': '9',\r\n    'e': '8',\r\n    'f': '7',\r\n    'g': '1',\r\n    'h': '2',\r\n    'i': '6',\r\n    'j': '0',\r\n    'k': 'a',\r\n    'l': 'b',\r\n    'm': 'c',\r\n    'n': 'd',\r\n    'o': 'e',\r\n    'p': 'f',\r\n    'q': 'g',\r\n    'r': 'z',\r\n    's': 'y',\r\n    't': 'x',\r\n    'u': 'w',\r\n    'v': 'v',\r\n    'w': 'u',\r\n    'x': 'o',\r\n    'y': 'p',\r\n    'z': 'q',\r\n    0 : 's',\r\n    1 : 't',\r\n    2 : 'r',\r\n    3 : 'h',\r\n    4 : 'i',\r\n    5 : 'j',\r\n    6 : 'k',\r\n    7 : 'l',\r\n    8 : 'm',\r\n    9 : 'n'\r\n};\r\n_0x201e3f[_0x5c17('0x0')] = function(_0x34dd8c) {\r\n    var _0xcd0301 = [];\r\n    for (var _0x483a88 in _0x34dd8c) {\r\n        if (_0x34dd8c[_0x5c17('0xd')](_0x483a88)) {\r\n            _0xcd0301[_0x5c17('0x20')](_0x483a88);\r\n        }\r\n    }\r\n    _0xcd0301[_0x5c17('0x21')]();\r\n    var _0x4784a1 = [];\r\n    for (var _0x562bfe = 0x0,\r\n    _0x543b9e = _0xcd0301[_0x5c17('0x22')]; _0x562bfe < _0x543b9e; _0x562bfe++) {\r\n        var _0x34133b = _0xcd0301[_0x562bfe];\r\n        _0x4784a1[_0x5c17('0x20')](_0x34133b + '=' + _0x34dd8c[_0x34133b]);\r\n    }\r\n    var _0x3054cb = _0x17e8ce(_0x4784a1[_0x5c17('0x23')]('&'));\r\n    var _0x22a66a = '';\r\n\r\n    var _0x19c386 = _0x342595[_0x5c17('0x24')]('');\r\n    for (_0x562bfe = 0x0; _0x562bfe < _0x19c386[_0x5c17('0x22')]; _0x562bfe++) {\r\n        _0x22a66a += _0x3d7ddb[_0x19c386[_0x562bfe]];\r\n    }\r\n    return _0x241bfb(_0x3054cb, _0x22a66a);\r\n};\r\nfunction _0x241bfb(_0x4b518a, _0x2b5455) {\r\n    var _0x221bfb = '';\r\n    var _0x30e98a;\r\n    var _0x15947d = _0x4b518a[_0x5c17('0x24')]('');\r\n    var _0x409f59 = _0x2b5455[_0x5c17('0x24')]('');\r\n    if (_0x15947d[_0x5c17('0x22')] >= _0x409f59[_0x5c17('0x22')]) {\r\n        for (_0x30e98a = 0x0; _0x30e98a < _0x409f59[_0x5c17('0x22')]; _0x30e98a++) {\r\n            _0x221bfb += _0x15947d[_0x30e98a] + _0x409f59[_0x30e98a];\r\n        }\r\n        _0x221bfb += _0x4b518a[_0x5c17('0x25')](_0x30e98a);\r\n    } else {\r\n        for (_0x30e98a = 0x0; _0x30e98a < _0x15947d[_0x5c17('0x22')]; _0x30e98a++) {\r\n            _0x221bfb += _0x15947d[_0x30e98a] + _0x409f59[_0x30e98a];\r\n        }\r\n        _0x221bfb += _0x2b5455[_0x5c17('0x25')](_0x30e98a);\r\n    }\r\n    return _0x221bfb;\r\n}\r\n},\r\nfunction(_0x4a9c66, _0xb4e79e) {\r\nfunction _0x2f085d(_0x983486, _0x2a1cfc) {\r\n    var _0x4f40c2 = (_0x983486 & 0xffff) + (_0x2a1cfc & 0xffff),\r\n    _0x219fde = (_0x983486 >> 0x10) + (_0x2a1cfc >> 0x10) + (_0x4f40c2 >> 0x10);\r\n    return _0x219fde << 0x10 | _0x4f40c2 & 0xffff;\r\n}\r\nfunction _0x4d6b76(_0x51d502, _0x1c3ad7) {\r\n    return _0x51d502 << _0x1c3ad7 | _0x51d502 >>> 0x20 - _0x1c3ad7;\r\n}\r\nfunction _0x3b88e1(_0x24aaf2, _0x3d6d1e, _0x3c3773, _0x37b66f, _0x226bbc, _0x5ef95d) {\r\n    return _0x2f085d(_0x4d6b76(_0x2f085d(_0x2f085d(_0x3d6d1e, _0x24aaf2), _0x2f085d(_0x37b66f, _0x5ef95d)), _0x226bbc), _0x3c3773);\r\n}\r\nfunction _0x4fe096(_0x366642, _0x3bffde, _0x3b4d9c, _0x1a4cb6, _0x62c8e2, _0x4aa5cf, _0x37e7f8) {\r\n    return _0x3b88e1(_0x3bffde & _0x3b4d9c | ~_0x3bffde & _0x1a4cb6, _0x366642, _0x3bffde, _0x62c8e2, _0x4aa5cf, _0x37e7f8);\r\n}\r\nfunction _0x39c6c2(_0x462ab2, _0x2f87a4, _0x5b41a1, _0x2985b7, _0x357be0, _0x3040a6, _0x56e202) {\r\n    return _0x3b88e1(_0x2f87a4 & _0x2985b7 | _0x5b41a1 & ~_0x2985b7, _0x462ab2, _0x2f87a4, _0x357be0, _0x3040a6, _0x56e202);\r\n}\r\nfunction _0x225461(_0x5d9a0a, _0x3dff90, _0x565581, _0x2428af, _0x281ceb, _0x2de30d, _0x3dc980) {\r\n    return _0x3b88e1(_0x3dff90 ^ _0x565581 ^ _0x2428af, _0x5d9a0a, _0x3dff90, _0x281ceb, _0x2de30d, _0x3dc980);\r\n}\r\nfunction _0x184b61(_0x1ad69c, _0x378619, _0x4372c6, _0x1409c5, _0x47d5e9, _0xced5f2, _0x3e58d1) {\r\n    return _0x3b88e1(_0x4372c6 ^ (_0x378619 | ~_0x1409c5), _0x1ad69c, _0x378619, _0x47d5e9, _0xced5f2, _0x3e58d1);\r\n}\r\nfunction _0x3b130b(_0xc519bc, _0x536f44) {\r\n    _0xc519bc[_0x536f44 >> 0x5] |= 0x80 << _0x536f44 % 0x20;\r\n    _0xc519bc[(_0x536f44 + 0x40 >>> 0x9 << 0x4) + 0xe] = _0x536f44;\r\n    var _0x1eb61b, _0x272174, _0x1200fb, _0x5644a9, _0x2075bf, _0xc4ad8e = 0x67452301,\r\n    _0x2c335f = -0x10325477,\r\n    _0x4dd794 = -0x67452302,\r\n    _0x52d427 = 0x10325476;\r\n    for (_0x1eb61b = 0x0; _0x1eb61b < _0xc519bc[_0x5c17('0x22')]; _0x1eb61b += 0x10) {\r\n        _0x272174 = _0xc4ad8e;\r\n        _0x1200fb = _0x2c335f;\r\n        _0x5644a9 = _0x4dd794;\r\n        _0x2075bf = _0x52d427;\r\n        _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b], 0x7, -0x28955b88);\r\n        _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x1], 0xc, -0x173848aa);\r\n        _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x2], 0x11, 0x242070db);\r\n        _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x3], 0x16, -0x3e423112);\r\n        _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x4], 0x7, -0xa83f051);\r\n        _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x5], 0xc, 0x4787c62a);\r\n        _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x6], 0x11, -0x57cfb9ed);\r\n        _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x7], 0x16, -0x2b96aff);\r\n        _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x8], 0x7, 0x698098d8);\r\n        _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x9], 0xc, -0x74bb0851);\r\n        _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xa], 0x11, -0xa44f);\r\n        _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xb], 0x16, -0x76a32842);\r\n        _0xc4ad8e = _0x4fe096(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xc], 0x7, 0x6b901122);\r\n        _0x52d427 = _0x4fe096(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xd], 0xc, -0x2678e6d);\r\n        _0x4dd794 = _0x4fe096(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xe], 0x11, -0x5986bc72);\r\n        _0x2c335f = _0x4fe096(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xf], 0x16, 0x49b40821);\r\n        _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x1], 0x5, -0x9e1da9e);\r\n        _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x6], 0x9, -0x3fbf4cc0);\r\n        _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xb], 0xe, 0x265e5a51);\r\n        _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b], 0x14, -0x16493856);\r\n        _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x5], 0x5, -0x29d0efa3);\r\n        _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xa], 0x9, 0x2441453);\r\n        _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xf], 0xe, -0x275e197f);\r\n        _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x4], 0x14, -0x182c0438);\r\n        _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x9], 0x5, 0x21e1cde6);\r\n        _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xe], 0x9, -0x3cc8f82a);\r\n        _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x3], 0xe, -0xb2af279);\r\n        _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x8], 0x14, 0x455a14ed);\r\n        _0xc4ad8e = _0x39c6c2(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xd], 0x5, -0x561c16fb);\r\n        _0x52d427 = _0x39c6c2(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x2], 0x9, -0x3105c08);\r\n        _0x4dd794 = _0x39c6c2(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x7], 0xe, 0x676f02d9);\r\n        _0x2c335f = _0x39c6c2(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xc], 0x14, -0x72d5b376);\r\n        _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x5], 0x4, -0x5c6be);\r\n        _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x8], 0xb, -0x788e097f);\r\n        _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xb], 0x10, 0x6d9d6122);\r\n        _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xe], 0x17, -0x21ac7f4);\r\n        _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x1], 0x4, -0x5b4115bc);\r\n        _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x4], 0xb, 0x4bdecfa9);\r\n        _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x7], 0x10, -0x944b4a0);\r\n        _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xa], 0x17, -0x41404390);\r\n        _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xd], 0x4, 0x289b7ec6);\r\n        _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b], 0xb, -0x155ed806);\r\n        _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x3], 0x10, -0x2b10cf7b);\r\n        _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x6], 0x17, 0x4881d05);\r\n        _0xc4ad8e = _0x225461(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x9], 0x4, -0x262b2fc7);\r\n        _0x52d427 = _0x225461(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xc], 0xb, -0x1924661b);\r\n        _0x4dd794 = _0x225461(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xf], 0x10, 0x1fa27cf8);\r\n        _0x2c335f = _0x225461(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x2], 0x17, -0x3b53a99b);\r\n        _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b], 0x6, -0xbd6ddbc);\r\n        _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x7], 0xa, 0x432aff97);\r\n        _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xe], 0xf, -0x546bdc59);\r\n        _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x5], 0x15, -0x36c5fc7);\r\n        _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0xc], 0x6, 0x655b59c3);\r\n        _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0x3], 0xa, -0x70f3336e);\r\n        _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0xa], 0xf, -0x100b83);\r\n        _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x1], 0x15, -0x7a7ba22f);\r\n        _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x8], 0x6, 0x6fa87e4f);\r\n        _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xf], 0xa, -0x1d31920);\r\n        _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x6], 0xf, -0x5cfebcec);\r\n        _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0xd], 0x15, 0x4e0811a1);\r\n        _0xc4ad8e = _0x184b61(_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427, _0xc519bc[_0x1eb61b + 0x4], 0x6, -0x8ac817e);\r\n        _0x52d427 = _0x184b61(_0x52d427, _0xc4ad8e, _0x2c335f, _0x4dd794, _0xc519bc[_0x1eb61b + 0xb], 0xa, -0x42c50dcb);\r\n        _0x4dd794 = _0x184b61(_0x4dd794, _0x52d427, _0xc4ad8e, _0x2c335f, _0xc519bc[_0x1eb61b + 0x2], 0xf, 0x2ad7d2bb);\r\n        _0x2c335f = _0x184b61(_0x2c335f, _0x4dd794, _0x52d427, _0xc4ad8e, _0xc519bc[_0x1eb61b + 0x9], 0x15, -0x14792c6f);\r\n        _0xc4ad8e = _0x2f085d(_0xc4ad8e, _0x272174);\r\n        _0x2c335f = _0x2f085d(_0x2c335f, _0x1200fb);\r\n        _0x4dd794 = _0x2f085d(_0x4dd794, _0x5644a9);\r\n        _0x52d427 = _0x2f085d(_0x52d427, _0x2075bf);\r\n    }\r\n    return [_0xc4ad8e, _0x2c335f, _0x4dd794, _0x52d427];\r\n}\r\nfunction _0x5e828c(_0xb48cf1) {\r\n    var _0x46cdd5, _0x775955 = '';\r\n    for (_0x46cdd5 = 0x0; _0x46cdd5 < _0xb48cf1[_0x5c17('0x22')] * 0x20; _0x46cdd5 += 0x8) {\r\n        _0x775955 += String[_0x5c17('0x26')](_0xb48cf1[_0x46cdd5 >> 0x5] >>> _0x46cdd5 % 0x20 & 0xff);\r\n    }\r\n    return _0x775955;\r\n}\r\nfunction _0x2ce6c4(_0xd6dfa) {\r\n    var _0x4c787c, _0xb5a93a = [];\r\n    _0xb5a93a[(_0xd6dfa[_0x5c17('0x22')] >> 0x2) - 0x1] = undefined;\r\n    for (_0x4c787c = 0x0; _0x4c787c < _0xb5a93a[_0x5c17('0x22')]; _0x4c787c += 0x1) {\r\n        _0xb5a93a[_0x4c787c] = 0x0;\r\n    }\r\n    for (_0x4c787c = 0x0; _0x4c787c < _0xd6dfa[_0x5c17('0x22')] * 0x8; _0x4c787c += 0x8) {\r\n        _0xb5a93a[_0x4c787c >> 0x5] |= (_0xd6dfa[_0x5c17('0x27')](_0x4c787c / 0x8) & 0xff) << _0x4c787c % 0x20;\r\n    }\r\n    return _0xb5a93a;\r\n}\r\nfunction _0xeb07c8(_0x4c2541) {\r\n    return _0x5e828c(_0x3b130b(_0x2ce6c4(_0x4c2541), _0x4c2541[_0x5c17('0x22')] * 0x8));\r\n}\r\nfunction _0x19f155(_0x4fdfa9, _0x5be405) {\r\n    var _0xda4222, _0x47952f = _0x2ce6c4(_0x4fdfa9),\r\n    _0x45d42e = [],\r\n    _0x2a884c = [],\r\n    _0x383fb6;\r\n    _0x45d42e[0xf] = _0x2a884c[0xf] = undefined;\r\n    if (_0x47952f[_0x5c17('0x22')] > 0x10) {\r\n        _0x47952f = _0x3b130b(_0x47952f, _0x4fdfa9[_0x5c17('0x22')] * 0x8);\r\n    }\r\n    for (_0xda4222 = 0x0; _0xda4222 < 0x10; _0xda4222 += 0x1) {\r\n        _0x45d42e[_0xda4222] = _0x47952f[_0xda4222] ^ 0x36363636;\r\n        _0x2a884c[_0xda4222] = _0x47952f[_0xda4222] ^ 0x5c5c5c5c;\r\n    }\r\n    _0x383fb6 = _0x3b130b(_0x45d42e[_0x5c17('0x28')](_0x2ce6c4(_0x5be405)), 0x200 + _0x5be405[_0x5c17('0x22')] * 0x8);\r\n    return _0x5e828c(_0x3b130b(_0x2a884c[_0x5c17('0x28')](_0x383fb6), 0x200 + 0x80));\r\n}\r\nfunction _0x2ec482(_0x2125ec) {\r\n    var _0x25d5c2 = _0x5c17('0x29'),\r\n    _0x44ff8d = '',\r\n    _0x14bca0,\r\n    _0xd226f9;\r\n    for (_0xd226f9 = 0x0; _0xd226f9 < _0x2125ec[_0x5c17('0x22')]; _0xd226f9 += 0x1) {\r\n        _0x14bca0 = _0x2125ec[_0x5c17('0x27')](_0xd226f9);\r\n        _0x44ff8d += _0x25d5c2[_0x5c17('0x2a')](_0x14bca0 >>> 0x4 & 0xf) + _0x25d5c2[_0x5c17('0x2a')](_0x14bca0 & 0xf);\r\n    }\r\n    return _0x44ff8d;\r\n}\r\nfunction _0x2408fe(_0x57e352) {\r\n    return unescape(encodeURIComponent(_0x57e352));\r\n}\r\nfunction _0x213b1d(_0x59b900) {\r\n    return _0xeb07c8(_0x2408fe(_0x59b900));\r\n}\r\nfunction _0x19c6c8(_0x389df0) {\r\n    return _0x2ec482(_0x213b1d(_0x389df0));\r\n}\r\nfunction _0x3bbbba(_0x159b47, _0x34e632) {\r\n    return _0x19f155(_0x2408fe(_0x159b47), _0x2408fe(_0x34e632));\r\n}\r\nfunction _0x2ae50b(_0x4bfa50, _0x16cbfe) {\r\n    return _0x2ec482(_0x3bbbba(_0x4bfa50, _0x16cbfe));\r\n}\r\nfunction _0x55a320(_0x9a8c19, _0x547222, _0x326248) {\r\n    if (!_0x547222) {\r\n        if (!_0x326248) {\r\n            return _0x19c6c8(_0x9a8c19);\r\n        }\r\n        return _0x213b1d(_0x9a8c19);\r\n    }\r\n    if (!_0x326248) {\r\n        return _0x2ae50b(_0x547222, _0x9a8c19);\r\n    }\r\n    return _0x3bbbba(_0x547222, _0x9a8c19);\r\n}\r\n_0x4a9c66[_0x5c17('0x0')] = _0x55a320;\r\n},\r\nfunction(_0x13d108, _0x1f6ddf) {\r\nvar _0x1f8dc9 = typeof window[_0x5c17('0x2b')] === _0x5c17('0x3') ? {}: window[_0x5c17('0x2b')]; (function() {\r\n    var _0x5cd7d6 = null;\r\n    var _0x2a86b9 = null;\r\n    var _0x1f6ddf = undefined; !\r\n    function(_0x957762, _0xe6ca09) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0xe6ca09() : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([], _0xe6ca09) : _0x957762[_0x5c17('0x2e')] = _0xe6ca09();\r\n    } (this,\r\n    function() {\r\n        var _0x5a3970 = _0x5a3970 ||\r\n        function(_0x37accf, _0x1347a8) {\r\n            var _0x595369 = Object[_0x5c17('0x8')] ||\r\n            function() {\r\n                function _0x37accf() {}\r\n                return function(_0x54a072) {\r\n                    var _0x595369;\r\n                    return _0x37accf[_0x5c17('0xc')] = _0x54a072,\r\n                    _0x595369 = new _0x37accf(),\r\n                    _0x37accf[_0x5c17('0xc')] = null,\r\n                    _0x595369;\r\n                };\r\n            } (),\r\n            _0x4afd42 = {},\r\n            _0x2027a0 = _0x4afd42[_0x5c17('0x2f')] = {},\r\n            _0x23f6d9 = _0x2027a0[_0x5c17('0x30')] = function() {\r\n                return {\r\n                    'extend': function(_0x2ad977) {\r\n                        var _0x1347a8 = _0x595369(this);\r\n                        return _0x2ad977 && _0x1347a8[_0x5c17('0x31')](_0x2ad977),\r\n                        _0x1347a8[_0x5c17('0xd')](_0x5c17('0x32')) && this[_0x5c17('0x32')] !== _0x1347a8[_0x5c17('0x32')] || (_0x1347a8[_0x5c17('0x32')] = function() {\r\n                            _0x1347a8[_0x5c17('0x33')][_0x5c17('0x32')][_0x5c17('0x34')](this, arguments);\r\n                        }),\r\n                        _0x1347a8[_0x5c17('0x32')][_0x5c17('0xc')] = _0x1347a8,\r\n                        _0x1347a8[_0x5c17('0x33')] = this,\r\n                        _0x1347a8;\r\n                    },\r\n                    'create': function() {\r\n                        var _0x37accf = this[_0x5c17('0x35')]();\r\n                        return _0x37accf[_0x5c17('0x32')][_0x5c17('0x34')](_0x37accf, arguments),\r\n                        _0x37accf;\r\n                    },\r\n                    'init': function() {},\r\n                    'mixIn': function(_0x4556ab) {\r\n                        for (var _0x1347a8 in _0x4556ab) _0x4556ab[_0x5c17('0xd')](_0x1347a8) && (this[_0x1347a8] = _0x4556ab[_0x1347a8]);\r\n                        _0x4556ab[_0x5c17('0xd')](_0x5c17('0x36')) && (this[_0x5c17('0x36')] = _0x4556ab[_0x5c17('0x36')]);\r\n                    },\r\n                    'clone': function() {\r\n                        return this[_0x5c17('0x32')][_0x5c17('0xc')][_0x5c17('0x35')](this);\r\n                    }\r\n                };\r\n            } (),\r\n            _0x2753bd = _0x2027a0[_0x5c17('0x37')] = _0x23f6d9[_0x5c17('0x35')]({\r\n                'init': function(_0x1e49b8, _0x1eea41) {\r\n                    _0x1e49b8 = this[_0x5c17('0x38')] = _0x1e49b8 || [],\r\n                    _0x1eea41 != _0x1347a8 ? this[_0x5c17('0x39')] = _0x1eea41: this[_0x5c17('0x39')] = 0x4 * _0x1e49b8[_0x5c17('0x22')];\r\n                },\r\n                'toString': function(_0x2ee436) {\r\n                    return (_0x2ee436 || _0x5befb8)[_0x5c17('0x3a')](this);\r\n                },\r\n                'concat': function(_0x1fc954) {\r\n                    var _0x1347a8 = this[_0x5c17('0x38')],\r\n                    _0x595369 = _0x1fc954[_0x5c17('0x38')],\r\n                    _0x4afd42 = this[_0x5c17('0x39')],\r\n                    _0x2027a0 = _0x1fc954[_0x5c17('0x39')];\r\n                    if (this[_0x5c17('0x3b')](), _0x4afd42 % 0x4) for (var _0x23f6d9 = 0x0; _0x23f6d9 < _0x2027a0; _0x23f6d9++) {\r\n                        var _0x2753bd = _0x595369[_0x23f6d9 >>> 0x2] >>> 0x18 - _0x23f6d9 % 0x4 * 0x8 & 0xff;\r\n                        _0x1347a8[_0x4afd42 + _0x23f6d9 >>> 0x2] |= _0x2753bd << 0x18 - (_0x4afd42 + _0x23f6d9) % 0x4 * 0x8;\r\n                    } else for (var _0x23f6d9 = 0x0; _0x23f6d9 < _0x2027a0; _0x23f6d9 += 0x4) _0x1347a8[_0x4afd42 + _0x23f6d9 >>> 0x2] = _0x595369[_0x23f6d9 >>> 0x2];\r\n                    return this[_0x5c17('0x39')] += _0x2027a0,\r\n                    this;\r\n                },\r\n                'clamp': function() {\r\n                    var _0x1347a8 = this[_0x5c17('0x38')],\r\n                    _0x595369 = this[_0x5c17('0x39')];\r\n                    _0x1347a8[_0x595369 >>> 0x2] &= 0xffffffff << 0x20 - _0x595369 % 0x4 * 0x8,\r\n                    _0x1347a8[_0x5c17('0x22')] = _0x37accf[_0x5c17('0x3c')](_0x595369 / 0x4);\r\n                },\r\n                'clone': function() {\r\n                    var _0x37accf = _0x23f6d9[_0x5c17('0x3d')][_0x5c17('0x1')](this);\r\n                    return _0x37accf[_0x5c17('0x38')] = this[_0x5c17('0x38')][_0x5c17('0x3e')](0x0),\r\n                    _0x37accf;\r\n                },\r\n                'random': function(_0xe1034d) {\r\n                    for (var _0x595369, _0x4afd42 = [], _0x2027a0 = function(_0x5c4cc1) {\r\n                        var _0x5c4cc1 = _0x5c4cc1,\r\n                        _0x595369 = 0x3ade68b1,\r\n                        _0x4afd42 = 0xffffffff;\r\n                        return function() {\r\n                            _0x595369 = 0x9069 * (0xffff & _0x595369) + (_0x595369 >> 0x10) & _0x4afd42,\r\n                            _0x5c4cc1 = 0x4650 * (0xffff & _0x5c4cc1) + (_0x5c4cc1 >> 0x10) & _0x4afd42;\r\n                            var _0x2027a0 = (_0x595369 << 0x10) + _0x5c4cc1 & _0x4afd42;\r\n                            return _0x2027a0 /= 0x100000000,\r\n                            _0x2027a0 += 0.5,\r\n                            _0x2027a0 * (_0x37accf[_0x5c17('0x3f')]() > 0.5 ? 0x1: -0x1);\r\n                        };\r\n                    },\r\n                    _0x23f6d9 = 0x0; _0x23f6d9 < _0xe1034d; _0x23f6d9 += 0x4) {\r\n                        var _0x4da57e = _0x2027a0(0x100000000 * (_0x595369 || _0x37accf[_0x5c17('0x3f')]()));\r\n                        _0x595369 = 0x3ade67b7 * _0x4da57e(),\r\n                        _0x4afd42[_0x5c17('0x20')](0x100000000 * _0x4da57e() | 0x0);\r\n                    }\r\n                    return new _0x2753bd[(_0x5c17('0x32'))](_0x4afd42, _0xe1034d);\r\n                }\r\n            }),\r\n            _0x4da57e = _0x4afd42[_0x5c17('0x40')] = {},\r\n            _0x5befb8 = _0x4da57e[_0x5c17('0x41')] = {\r\n                'stringify': function(_0x327470) {\r\n                    for (var _0x1347a8 = _0x327470[_0x5c17('0x38')], _0x595369 = _0x327470[_0x5c17('0x39')], _0x4afd42 = [], _0x2027a0 = 0x0; _0x2027a0 < _0x595369; _0x2027a0++) {\r\n                        var _0x23f6d9 = _0x1347a8[_0x2027a0 >>> 0x2] >>> 0x18 - _0x2027a0 % 0x4 * 0x8 & 0xff;\r\n                        _0x4afd42[_0x5c17('0x20')]((_0x23f6d9 >>> 0x4)[_0x5c17('0x36')](0x10)),\r\n                        _0x4afd42[_0x5c17('0x20')]((0xf & _0x23f6d9)[_0x5c17('0x36')](0x10));\r\n                    }\r\n                    return _0x4afd42[_0x5c17('0x23')]('');\r\n                },\r\n                'parse': function(_0x5d272) {\r\n                    for (var _0x1347a8 = _0x5d272[_0x5c17('0x22')], _0x595369 = [], _0x4afd42 = 0x0; _0x4afd42 < _0x1347a8; _0x4afd42 += 0x2) _0x595369[_0x4afd42 >>> 0x3] |= parseInt(_0x5d272[_0x5c17('0x42')](_0x4afd42, 0x2), 0x10) << 0x18 - _0x4afd42 % 0x8 * 0x4;\r\n                    return new _0x2753bd[(_0x5c17('0x32'))](_0x595369, _0x1347a8 / 0x2);\r\n                }\r\n            },\r\n            _0x59605f = _0x4da57e[_0x5c17('0x43')] = {\r\n                'stringify': function(_0x22db6e) {\r\n                    for (var _0x1347a8 = _0x22db6e[_0x5c17('0x38')], _0x595369 = _0x22db6e[_0x5c17('0x39')], _0x4afd42 = [], _0x2027a0 = 0x0; _0x2027a0 < _0x595369; _0x2027a0++) {\r\n                        var _0x23f6d9 = _0x1347a8[_0x2027a0 >>> 0x2] >>> 0x18 - _0x2027a0 % 0x4 * 0x8 & 0xff;\r\n                        _0x4afd42[_0x5c17('0x20')](String[_0x5c17('0x26')](_0x23f6d9));\r\n                    }\r\n                    return _0x4afd42[_0x5c17('0x23')]('');\r\n                },\r\n                'parse': function(_0x8e1876) {\r\n                    for (var _0x1347a8 = _0x8e1876[_0x5c17('0x22')], _0x595369 = [], _0x4afd42 = 0x0; _0x4afd42 < _0x1347a8; _0x4afd42++) _0x595369[_0x4afd42 >>> 0x2] |= (0xff & _0x8e1876[_0x5c17('0x27')](_0x4afd42)) << 0x18 - _0x4afd42 % 0x4 * 0x8;\r\n                    return new _0x2753bd[(_0x5c17('0x32'))](_0x595369, _0x1347a8);\r\n                }\r\n            },\r\n            _0x3021fa = _0x4da57e[_0x5c17('0x44')] = {\r\n                'stringify': function(_0x173e56) {\r\n                    try {\r\n                        return decodeURIComponent(escape(_0x59605f[_0x5c17('0x3a')](_0x173e56)));\r\n                    } catch(_0x52bba9) {\r\n                        throw new Error(_0x5c17('0x45'));\r\n                    }\r\n                },\r\n                'parse': function(_0x1802e8) {\r\n                    return _0x59605f[_0x5c17('0x46')](unescape(encodeURIComponent(_0x1802e8)));\r\n                }\r\n            },\r\n            _0x3508b4 = _0x2027a0[_0x5c17('0x47')] = _0x23f6d9[_0x5c17('0x35')]({\r\n                'reset': function() {\r\n                    this[_0x5c17('0x48')] = new _0x2753bd[(_0x5c17('0x32'))](),\r\n                    this[_0x5c17('0x49')] = 0x0;\r\n                },\r\n                '_append': function(_0x22be3d) {\r\n                    _0x5c17('0xa') == typeof _0x22be3d && (_0x22be3d = _0x3021fa[_0x5c17('0x46')](_0x22be3d)),\r\n                    this[_0x5c17('0x48')][_0x5c17('0x28')](_0x22be3d),\r\n                    this[_0x5c17('0x49')] += _0x22be3d[_0x5c17('0x39')];\r\n                },\r\n                '_process': function(_0x54afa7) {\r\n                    var _0x595369 = this[_0x5c17('0x48')],\r\n                    _0x4afd42 = _0x595369[_0x5c17('0x38')],\r\n                    _0x2027a0 = _0x595369[_0x5c17('0x39')],\r\n                    _0x23f6d9 = this[_0x5c17('0x4a')],\r\n                    _0x4da57e = 0x4 * _0x23f6d9,\r\n                    _0x5befb8 = _0x2027a0 / _0x4da57e;\r\n                    _0x5befb8 = _0x54afa7 ? _0x37accf[_0x5c17('0x3c')](_0x5befb8) : _0x37accf[_0x5c17('0x4b')]((0x0 | _0x5befb8) - this[_0x5c17('0x4c')], 0x0);\r\n                    var _0x59605f = _0x5befb8 * _0x23f6d9,\r\n                    _0x3021fa = _0x37accf[_0x5c17('0x4d')](0x4 * _0x59605f, _0x2027a0);\r\n                    if (_0x59605f) {\r\n                        for (var _0x3508b4 = 0x0; _0x3508b4 < _0x59605f; _0x3508b4 += _0x23f6d9) this[_0x5c17('0x4e')](_0x4afd42, _0x3508b4);\r\n                        var _0x46281c = _0x4afd42[_0x5c17('0x4f')](0x0, _0x59605f);\r\n                        _0x595369[_0x5c17('0x39')] -= _0x3021fa;\r\n                    }\r\n                    return new _0x2753bd[(_0x5c17('0x32'))](_0x46281c, _0x3021fa);\r\n                },\r\n                'clone': function() {\r\n                    var _0x37accf = _0x23f6d9[_0x5c17('0x3d')][_0x5c17('0x1')](this);\r\n                    return _0x37accf[_0x5c17('0x48')] = this[_0x5c17('0x48')][_0x5c17('0x3d')](),\r\n                    _0x37accf;\r\n                },\r\n                '_minBufferSize': 0x0\r\n            }),\r\n            _0x46281c = (_0x2027a0[_0x5c17('0x50')] = _0x3508b4[_0x5c17('0x35')]({\r\n                'cfg': _0x23f6d9[_0x5c17('0x35')](),\r\n                'init': function(_0x58602c) {\r\n                    this[_0x5c17('0x51')] = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x58602c),\r\n                    this[_0x5c17('0x52')]();\r\n                },\r\n                'reset': function() {\r\n                    _0x3508b4[_0x5c17('0x52')][_0x5c17('0x1')](this),\r\n                    this[_0x5c17('0x53')]();\r\n                },\r\n                'update': function(_0x1237c2) {\r\n                    return this[_0x5c17('0x54')](_0x1237c2),\r\n                    this[_0x5c17('0x55')](),\r\n                    this;\r\n                },\r\n                'finalize': function(_0x59dacb) {\r\n                    _0x59dacb && this[_0x5c17('0x54')](_0x59dacb);\r\n                    var _0x1347a8 = this[_0x5c17('0x56')]();\r\n                    return _0x1347a8;\r\n                },\r\n                'blockSize': 0x10,\r\n                '_createHelper': function(_0x1e863a) {\r\n                    return function(_0x11c014, _0x3a6317) {\r\n                        return new _0x1e863a[(_0x5c17('0x32'))](_0x3a6317)[_0x5c17('0x57')](_0x11c014);\r\n                    };\r\n                },\r\n                '_createHmacHelper': function(_0x328d38) {\r\n                    return function(_0x39d055, _0x322730) {\r\n                        return new _0x46281c[(_0x5c17('0x58'))][(_0x5c17('0x32'))](_0x328d38, _0x322730)[_0x5c17('0x57')](_0x39d055);\r\n                    };\r\n                }\r\n            }), _0x4afd42[_0x5c17('0x59')] = {});\r\n            return _0x4afd42;\r\n        } (Math);\r\n        return _0x5a3970;\r\n    }); !\r\n    function(_0x3cc0b5, _0x5ed2a8, _0x4e2604) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x5ed2a8(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x5b')), _0x2a86b9(_0x5c17('0x5c'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x5b'), _0x5c17('0x5c')], _0x5ed2a8) : _0x5ed2a8(_0x3cc0b5[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x62f09a) {\r\n        return function() {\r\n            var _0x5dc018 = _0x62f09a,\r\n            _0x2961b8 = _0x5dc018[_0x5c17('0x2f')],\r\n            _0x1c4e56 = _0x2961b8[_0x5c17('0x30')],\r\n            _0x2db829 = _0x2961b8[_0x5c17('0x37')],\r\n            _0x137c5b = _0x5dc018[_0x5c17('0x59')],\r\n            _0x268c22 = _0x137c5b[_0x5c17('0x5d')],\r\n            _0x187185 = _0x137c5b[_0x5c17('0x5e')] = _0x1c4e56[_0x5c17('0x35')]({\r\n                'cfg': _0x1c4e56[_0x5c17('0x35')]({\r\n                    'keySize': 0x4,\r\n                    'hasher': _0x268c22,\r\n                    'iterations': 0x1\r\n                }),\r\n                'init': function(_0x129b28) {\r\n                    this[_0x5c17('0x51')] = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x129b28);\r\n                },\r\n                'compute': function(_0x3b2a09, _0x81066b) {\r\n                    for (var _0x2961b8 = this[_0x5c17('0x51')], _0x1c4e56 = _0x2961b8[_0x5c17('0x5f')][_0x5c17('0x8')](), _0x137c5b = _0x2db829[_0x5c17('0x8')](), _0x268c22 = _0x137c5b[_0x5c17('0x38')], _0x187185 = _0x2961b8[_0x5c17('0x60')], _0x3ac8ab = _0x2961b8[_0x5c17('0x61')]; _0x268c22[_0x5c17('0x22')] < _0x187185;) {\r\n                        _0x2509e9 && _0x1c4e56[_0x5c17('0x62')](_0x2509e9);\r\n                        var _0x2509e9 = _0x1c4e56[_0x5c17('0x62')](_0x3b2a09)[_0x5c17('0x57')](_0x81066b);\r\n                        _0x1c4e56[_0x5c17('0x52')]();\r\n                        for (var _0x2f4877 = 0x1; _0x2f4877 < _0x3ac8ab; _0x2f4877++) _0x2509e9 = _0x1c4e56[_0x5c17('0x57')](_0x2509e9),\r\n                        _0x1c4e56[_0x5c17('0x52')]();\r\n                        _0x137c5b[_0x5c17('0x28')](_0x2509e9);\r\n                    }\r\n                    return _0x137c5b[_0x5c17('0x39')] = 0x4 * _0x187185,\r\n                    _0x137c5b;\r\n                }\r\n            });\r\n            _0x5dc018[_0x5c17('0x5e')] = function(_0x474590, _0x383fa1, _0xaf8095) {\r\n                return _0x187185[_0x5c17('0x8')](_0xaf8095)[_0x5c17('0x63')](_0x474590, _0x383fa1);\r\n            };\r\n        } (),\r\n        _0x62f09a[_0x5c17('0x5e')];\r\n    }); !\r\n    function(_0x550f33, _0x2344da) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x2344da(_0x2a86b9(_0x5c17('0x5a'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a')], _0x2344da) : _0x2344da(_0x550f33[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x43ffb5) {\r\n        return function() {\r\n            function _0x111baf(_0xf363be, _0x197bb8, _0x146d5c) {\r\n                for (var _0x61d1c6 = [], _0x32ae3e = 0x0, _0xb08a4c = 0x0; _0xb08a4c < _0x197bb8; _0xb08a4c++) if (_0xb08a4c % 0x4) {\r\n                    var _0x3570bd = _0x146d5c[_0xf363be[_0x5c17('0x27')](_0xb08a4c - 0x1)] << _0xb08a4c % 0x4 * 0x2,\r\n                    _0x2c87b5 = _0x146d5c[_0xf363be[_0x5c17('0x27')](_0xb08a4c)] >>> 0x6 - _0xb08a4c % 0x4 * 0x2;\r\n                    _0x61d1c6[_0x32ae3e >>> 0x2] |= (_0x3570bd | _0x2c87b5) << 0x18 - _0x32ae3e % 0x4 * 0x8,\r\n                    _0x32ae3e++;\r\n                }\r\n                return _0x57946e[_0x5c17('0x8')](_0x61d1c6, _0x32ae3e);\r\n            }\r\n            var _0x3f7c38 = _0x43ffb5,\r\n            _0x1157a8 = _0x3f7c38[_0x5c17('0x2f')],\r\n            _0x57946e = _0x1157a8[_0x5c17('0x37')],\r\n            _0x53dd3d = _0x3f7c38[_0x5c17('0x40')];\r\n            _0x53dd3d[_0x5c17('0x64')] = {\r\n                'stringify': function(_0x5c68b8) {\r\n                    var _0x111baf = _0x5c68b8[_0x5c17('0x38')],\r\n                    _0x3f7c38 = _0x5c68b8[_0x5c17('0x39')],\r\n                    _0x1157a8 = this[_0x5c17('0x65')];\r\n                    _0x5c68b8[_0x5c17('0x3b')]();\r\n                    for (var _0x57946e = [], _0x53dd3d = 0x0; _0x53dd3d < _0x3f7c38; _0x53dd3d += 0x3) for (var _0x5707f1 = _0x111baf[_0x53dd3d >>> 0x2] >>> 0x18 - _0x53dd3d % 0x4 * 0x8 & 0xff, _0x404639 = _0x111baf[_0x53dd3d + 0x1 >>> 0x2] >>> 0x18 - (_0x53dd3d + 0x1) % 0x4 * 0x8 & 0xff, _0x54673a = _0x111baf[_0x53dd3d + 0x2 >>> 0x2] >>> 0x18 - (_0x53dd3d + 0x2) % 0x4 * 0x8 & 0xff, _0x564ab4 = _0x5707f1 << 0x10 | _0x404639 << 0x8 | _0x54673a, _0x10ec50 = 0x0; _0x10ec50 < 0x4 && _0x53dd3d + 0.75 * _0x10ec50 < _0x3f7c38; _0x10ec50++) _0x57946e[_0x5c17('0x20')](_0x1157a8[_0x5c17('0x2a')](_0x564ab4 >>> 0x6 * (0x3 - _0x10ec50) & 0x3f));\r\n                    var _0x4da8a9 = _0x1157a8[_0x5c17('0x2a')](0x40);\r\n                    if (_0x4da8a9) for (; _0x57946e[_0x5c17('0x22')] % 0x4;) _0x57946e[_0x5c17('0x20')](_0x4da8a9);\r\n                    return _0x57946e[_0x5c17('0x23')]('');\r\n                },\r\n                'parse': function(_0x346362) {\r\n                    var _0x3f7c38 = _0x346362[_0x5c17('0x22')],\r\n                    _0x1157a8 = this[_0x5c17('0x65')],\r\n                    _0x57946e = this[_0x5c17('0x66')];\r\n                    if (!_0x57946e) {\r\n                        _0x57946e = this[_0x5c17('0x66')] = [];\r\n                        for (var _0x53dd3d = 0x0; _0x53dd3d < _0x1157a8[_0x5c17('0x22')]; _0x53dd3d++) _0x57946e[_0x1157a8[_0x5c17('0x27')](_0x53dd3d)] = _0x53dd3d;\r\n                    }\r\n                    var _0x229142 = _0x1157a8[_0x5c17('0x2a')](0x40);\r\n                    if (_0x229142) {\r\n                        var _0xd1ff57 = _0x346362[_0x5c17('0x67')](_0x229142);\r\n                        _0xd1ff57 !== -0x1 && (_0x3f7c38 = _0xd1ff57);\r\n                    }\r\n                    return _0x111baf(_0x346362, _0x3f7c38, _0x57946e);\r\n                },\r\n                '_map': _0x5c17('0x68')\r\n            };\r\n        } (),\r\n        _0x43ffb5[_0x5c17('0x40')][_0x5c17('0x64')];\r\n    }); !\r\n    function(_0x26cbb1, _0x58ec37, _0x177ee0) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x58ec37(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x69'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x69')], _0x58ec37) : _0x58ec37(_0x26cbb1[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x2ef51a) {\r\n        _0x2ef51a[_0x5c17('0x2f')][_0x5c17('0x6a')] ||\r\n        function(_0x169cbd) {\r\n            var _0x2a64aa = _0x2ef51a,\r\n            _0x23d019 = _0x2a64aa[_0x5c17('0x2f')],\r\n            _0x501953 = _0x23d019[_0x5c17('0x30')],\r\n            _0x31b7fe = _0x23d019[_0x5c17('0x37')],\r\n            _0x1eada5 = _0x23d019[_0x5c17('0x47')],\r\n            _0x270113 = _0x2a64aa[_0x5c17('0x40')],\r\n            _0x5a6dac = (_0x270113[_0x5c17('0x44')], _0x270113[_0x5c17('0x64')]),\r\n            _0x6b9c83 = _0x2a64aa[_0x5c17('0x59')],\r\n            _0x101ee3 = _0x6b9c83[_0x5c17('0x5e')],\r\n            _0x2f16d9 = _0x23d019[_0x5c17('0x6a')] = _0x1eada5[_0x5c17('0x35')]({\r\n                'cfg': _0x501953[_0x5c17('0x35')](),\r\n                'createEncryptor': function(_0x25e901, _0x26733b) {\r\n                    return this[_0x5c17('0x8')](this[_0x5c17('0x6b')], _0x25e901, _0x26733b);\r\n                },\r\n                'createDecryptor': function(_0x5c4bcb, _0x2cbbc5) {\r\n                    return this[_0x5c17('0x8')](this[_0x5c17('0x6c')], _0x5c4bcb, _0x2cbbc5);\r\n                },\r\n                'init': function(_0x26a337, _0x6984e3, _0xc7e15b) {\r\n                    this[_0x5c17('0x51')] = this[_0x5c17('0x51')][_0x5c17('0x35')](_0xc7e15b),\r\n                    this[_0x5c17('0x6d')] = _0x26a337,\r\n                    this[_0x5c17('0x6e')] = _0x6984e3,\r\n                    this[_0x5c17('0x52')]();\r\n                },\r\n                'reset': function() {\r\n                    _0x1eada5[_0x5c17('0x52')][_0x5c17('0x1')](this),\r\n                    this[_0x5c17('0x53')]();\r\n                },\r\n                'process': function(_0x3e0d21) {\r\n                    return this[_0x5c17('0x54')](_0x3e0d21),\r\n                    this[_0x5c17('0x55')]();\r\n                },\r\n                'finalize': function(_0x1e86e0) {\r\n                    _0x1e86e0 && this[_0x5c17('0x54')](_0x1e86e0);\r\n                    var _0x169cbd = this[_0x5c17('0x56')]();\r\n                    return _0x169cbd;\r\n                },\r\n                'keySize': 0x4,\r\n                'ivSize': 0x4,\r\n                '_ENC_XFORM_MODE': 0x1,\r\n                '_DEC_XFORM_MODE': 0x2,\r\n                '_createHelper': function() {\r\n                    function _0x2ef51a(_0x20e8c2) {\r\n                        return _0x5c17('0xa') == typeof _0x20e8c2 ? _0x207c7b: _0x1c2015;\r\n                    }\r\n                    return function(_0x5f48d9) {\r\n                        return {\r\n                            'encrypt': function(_0x42e1c9, _0x3ef2ec, _0x50dbd8) {\r\n                                return _0x2ef51a(_0x3ef2ec)[_0x5c17('0x6f')](_0x5f48d9, _0x42e1c9, _0x3ef2ec, _0x50dbd8);\r\n                            },\r\n                            'decrypt': function(_0x28a30c, _0x28864f, _0x4c7512) {\r\n                                return _0x2ef51a(_0x28864f)[_0x5c17('0x70')](_0x5f48d9, _0x28a30c, _0x28864f, _0x4c7512);\r\n                            }\r\n                        };\r\n                    };\r\n                } ()\r\n            }),\r\n            _0x2685a7 = (_0x23d019[_0x5c17('0x71')] = _0x2f16d9[_0x5c17('0x35')]({\r\n                '_doFinalize': function() {\r\n                    var _0x2ef51a = this[_0x5c17('0x55')](!0x0);\r\n                    return _0x2ef51a;\r\n                },\r\n                'blockSize': 0x1\r\n            }), _0x2a64aa[_0x5c17('0x72')] = {}),\r\n            _0x2666cf = _0x23d019[_0x5c17('0x73')] = _0x501953[_0x5c17('0x35')]({\r\n                'createEncryptor': function(_0x22557c, _0x545c1e) {\r\n                    return this[_0x5c17('0x74')][_0x5c17('0x8')](_0x22557c, _0x545c1e);\r\n                },\r\n                'createDecryptor': function(_0x30fa7b, _0x3bf4fd) {\r\n                    return this[_0x5c17('0x75')][_0x5c17('0x8')](_0x30fa7b, _0x3bf4fd);\r\n                },\r\n                'init': function(_0x40ddd4, _0x1da2e1) {\r\n                    this[_0x5c17('0x76')] = _0x40ddd4,\r\n                    this[_0x5c17('0x77')] = _0x1da2e1;\r\n                }\r\n            }),\r\n            _0x68c111 = _0x2685a7[_0x5c17('0x78')] = function() {\r\n                function _0x2ef51a(_0x453890, _0x579063, _0x368bda) {\r\n                    var _0x501953 = this[_0x5c17('0x77')];\r\n                    if (_0x501953) {\r\n                        var _0x31b7fe = _0x501953;\r\n                        this[_0x5c17('0x77')] = _0x169cbd;\r\n                    } else var _0x31b7fe = this[_0x5c17('0x79')];\r\n                    for (var _0x1eada5 = 0x0; _0x1eada5 < _0x368bda; _0x1eada5++) _0x453890[_0x579063 + _0x1eada5] ^= _0x31b7fe[_0x1eada5];\r\n                }\r\n                var _0x2a64aa = _0x2666cf[_0x5c17('0x35')]();\r\n                return _0x2a64aa[_0x5c17('0x74')] = _0x2a64aa[_0x5c17('0x35')]({\r\n                    'processBlock': function(_0x5cf30b, _0x4e7a01) {\r\n                        var _0x23d019 = this[_0x5c17('0x76')],\r\n                        _0x501953 = _0x23d019[_0x5c17('0x4a')];\r\n                        _0x2ef51a[_0x5c17('0x1')](this, _0x5cf30b, _0x4e7a01, _0x501953),\r\n                        _0x23d019[_0x5c17('0x7a')](_0x5cf30b, _0x4e7a01),\r\n                        this[_0x5c17('0x79')] = _0x5cf30b[_0x5c17('0x3e')](_0x4e7a01, _0x4e7a01 + _0x501953);\r\n                    }\r\n                }),\r\n                _0x2a64aa[_0x5c17('0x75')] = _0x2a64aa[_0x5c17('0x35')]({\r\n                    'processBlock': function(_0x44f656, _0x5aa12d) {\r\n                        var _0x23d019 = this[_0x5c17('0x76')],\r\n                        _0x501953 = _0x23d019[_0x5c17('0x4a')],\r\n                        _0x31b7fe = _0x44f656[_0x5c17('0x3e')](_0x5aa12d, _0x5aa12d + _0x501953);\r\n                        _0x23d019[_0x5c17('0x7b')](_0x44f656, _0x5aa12d),\r\n                        _0x2ef51a[_0x5c17('0x1')](this, _0x44f656, _0x5aa12d, _0x501953),\r\n                        this[_0x5c17('0x79')] = _0x31b7fe;\r\n                    }\r\n                }),\r\n                _0x2a64aa;\r\n            } (),\r\n            _0x255e67 = _0x2a64aa[_0x5c17('0x7c')] = {},\r\n            _0x5ca1fe = _0x255e67[_0x5c17('0x7d')] = {\r\n                'pad': function(_0x38405f, _0xe6ec82) {\r\n                    for (var _0x2a64aa = 0x4 * _0xe6ec82,\r\n                    _0x23d019 = _0x2a64aa - _0x38405f[_0x5c17('0x39')] % _0x2a64aa, _0x501953 = _0x23d019 << 0x18 | _0x23d019 << 0x10 | _0x23d019 << 0x8 | _0x23d019, _0x1eada5 = [], _0x270113 = 0x0; _0x270113 < _0x23d019; _0x270113 += 0x4) _0x1eada5[_0x5c17('0x20')](_0x501953);\r\n                    var _0x5a6dac = _0x31b7fe[_0x5c17('0x8')](_0x1eada5, _0x23d019);\r\n                    _0x38405f[_0x5c17('0x28')](_0x5a6dac);\r\n                },\r\n                'unpad': function(_0x576be7) {\r\n                    var _0x169cbd = 0xff & _0x576be7[_0x5c17('0x38')][_0x576be7[_0x5c17('0x39')] - 0x1 >>> 0x2];\r\n                    _0x576be7[_0x5c17('0x39')] -= _0x169cbd;\r\n                }\r\n            },\r\n            _0x1de457 = (_0x23d019[_0x5c17('0x7e')] = _0x2f16d9[_0x5c17('0x35')]({\r\n                'cfg': _0x2f16d9[_0x5c17('0x51')][_0x5c17('0x35')]({\r\n                    'mode': _0x68c111,\r\n                    'padding': _0x5ca1fe\r\n                }),\r\n                'reset': function() {\r\n                    _0x2f16d9[_0x5c17('0x52')][_0x5c17('0x1')](this);\r\n                    var _0x2ef51a = this[_0x5c17('0x51')],\r\n                    _0x169cbd = _0x2ef51a['iv'],\r\n                    _0x2a64aa = _0x2ef51a[_0x5c17('0x72')];\r\n                    if (this[_0x5c17('0x6d')] == this[_0x5c17('0x6b')]) var _0x23d019 = _0x2a64aa[_0x5c17('0x7f')];\r\n                    else {\r\n                        var _0x23d019 = _0x2a64aa[_0x5c17('0x80')];\r\n                        this[_0x5c17('0x4c')] = 0x1;\r\n                    }\r\n                    this[_0x5c17('0x81')] && this[_0x5c17('0x81')][_0x5c17('0x82')] == _0x23d019 ? this[_0x5c17('0x81')][_0x5c17('0x32')](this, _0x169cbd && _0x169cbd[_0x5c17('0x38')]) : (this[_0x5c17('0x81')] = _0x23d019[_0x5c17('0x1')](_0x2a64aa, this, _0x169cbd && _0x169cbd[_0x5c17('0x38')]), this[_0x5c17('0x81')][_0x5c17('0x82')] = _0x23d019);\r\n                },\r\n                '_doProcessBlock': function(_0x2973e0, _0xa57e0f) {\r\n                    this[_0x5c17('0x81')][_0x5c17('0x83')](_0x2973e0, _0xa57e0f);\r\n                },\r\n                '_doFinalize': function() {\r\n                    var _0x2ef51a = this[_0x5c17('0x51')][_0x5c17('0x84')];\r\n                    if (this[_0x5c17('0x6d')] == this[_0x5c17('0x6b')]) {\r\n                        _0x2ef51a[_0x5c17('0x7c')](this[_0x5c17('0x48')], this[_0x5c17('0x4a')]);\r\n                        var _0x169cbd = this[_0x5c17('0x55')](!0x0);\r\n                    } else {\r\n                        var _0x169cbd = this[_0x5c17('0x55')](!0x0);\r\n                        _0x2ef51a[_0x5c17('0x85')](_0x169cbd);\r\n                    }\r\n                    return _0x169cbd;\r\n                },\r\n                'blockSize': 0x4\r\n            }), _0x23d019[_0x5c17('0x86')] = _0x501953[_0x5c17('0x35')]({\r\n                'init': function(_0x349aaf) {\r\n                    this[_0x5c17('0x31')](_0x349aaf);\r\n                },\r\n                'toString': function(_0x589d81) {\r\n                    return (_0x589d81 || this[_0x5c17('0x87')])[_0x5c17('0x3a')](this);\r\n                }\r\n            })),\r\n            _0x43cced = _0x2a64aa[_0x5c17('0x88')] = {},\r\n            _0x504a2e = _0x43cced[_0x5c17('0x89')] = {\r\n                'stringify': function(_0x4dc57e) {\r\n                    var _0x169cbd = _0x4dc57e[_0x5c17('0x8a')],\r\n                    _0x2a64aa = _0x4dc57e[_0x5c17('0x8b')];\r\n                    if (_0x2a64aa) var _0x23d019 = _0x31b7fe[_0x5c17('0x8')]([0x53616c74, 0x65645f5f])[_0x5c17('0x28')](_0x2a64aa)[_0x5c17('0x28')](_0x169cbd);\r\n                    else var _0x23d019 = _0x169cbd;\r\n                    return _0x23d019[_0x5c17('0x36')](_0x5a6dac);\r\n                },\r\n                'parse': function(_0x123534) {\r\n                    var _0x169cbd = _0x5a6dac[_0x5c17('0x46')](_0x123534),\r\n                    _0x2a64aa = _0x169cbd[_0x5c17('0x38')];\r\n                    if (0x53616c74 == _0x2a64aa[0x0] && 0x65645f5f == _0x2a64aa[0x1]) {\r\n                        var _0x23d019 = _0x31b7fe[_0x5c17('0x8')](_0x2a64aa[_0x5c17('0x3e')](0x2, 0x4));\r\n                        _0x2a64aa[_0x5c17('0x4f')](0x0, 0x4),\r\n                        _0x169cbd[_0x5c17('0x39')] -= 0x10;\r\n                    }\r\n                    return _0x1de457[_0x5c17('0x8')]({\r\n                        'ciphertext': _0x169cbd,\r\n                        'salt': _0x23d019\r\n                    });\r\n                }\r\n            },\r\n            _0x1c2015 = _0x23d019[_0x5c17('0x8c')] = _0x501953[_0x5c17('0x35')]({\r\n                'cfg': _0x501953[_0x5c17('0x35')]({\r\n                    'format': _0x504a2e\r\n                }),\r\n                'encrypt': function(_0x22a253, _0x101960, _0x1338e8, _0x40decb) {\r\n                    _0x40decb = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x40decb);\r\n                    var _0x501953 = _0x22a253[_0x5c17('0x7f')](_0x1338e8, _0x40decb),\r\n                    _0x31b7fe = _0x501953[_0x5c17('0x57')](_0x101960),\r\n                    _0x1eada5 = _0x501953[_0x5c17('0x51')];\r\n                    return _0x1de457[_0x5c17('0x8')]({\r\n                        'ciphertext': _0x31b7fe,\r\n                        'key': _0x1338e8,\r\n                        'iv': _0x1eada5['iv'],\r\n                        'algorithm': _0x22a253,\r\n                        'mode': _0x1eada5[_0x5c17('0x72')],\r\n                        'padding': _0x1eada5[_0x5c17('0x84')],\r\n                        'blockSize': _0x22a253[_0x5c17('0x4a')],\r\n                        'formatter': _0x40decb[_0x5c17('0x88')]\r\n                    });\r\n                },\r\n                'decrypt': function(_0xc64031, _0x337e65, _0x13cb1e, _0x17589d) {\r\n                    _0x17589d = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x17589d),\r\n                    _0x337e65 = this[_0x5c17('0x8d')](_0x337e65, _0x17589d[_0x5c17('0x88')]);\r\n                    var _0x501953 = _0xc64031[_0x5c17('0x80')](_0x13cb1e, _0x17589d)[_0x5c17('0x57')](_0x337e65[_0x5c17('0x8a')]);\r\n                    return _0x501953;\r\n                },\r\n                '_parse': function(_0x5ca638, _0x4d9875) {\r\n                    return _0x5c17('0xa') == typeof _0x5ca638 ? _0x4d9875[_0x5c17('0x46')](_0x5ca638, this) : _0x5ca638;\r\n                }\r\n            }),\r\n            _0x34c872 = _0x2a64aa[_0x5c17('0x8e')] = {},\r\n            _0x40953 = _0x34c872[_0x5c17('0x89')] = {\r\n                'execute': function(_0x4c9fc6, _0x2084bd, _0x3dde5e, _0xe816f) {\r\n                    _0xe816f || (_0xe816f = _0x31b7fe[_0x5c17('0x3f')](0x8));\r\n                    var _0x501953 = _0x101ee3[_0x5c17('0x8')]({\r\n                        'keySize': _0x2084bd + _0x3dde5e\r\n                    })[_0x5c17('0x63')](_0x4c9fc6, _0xe816f),\r\n                    _0x1eada5 = _0x31b7fe[_0x5c17('0x8')](_0x501953[_0x5c17('0x38')][_0x5c17('0x3e')](_0x2084bd), 0x4 * _0x3dde5e);\r\n                    return _0x501953[_0x5c17('0x39')] = 0x4 * _0x2084bd,\r\n                    _0x1de457[_0x5c17('0x8')]({\r\n                        'key': _0x501953,\r\n                        'iv': _0x1eada5,\r\n                        'salt': _0xe816f\r\n                    });\r\n                }\r\n            },\r\n            _0x207c7b = _0x23d019[_0x5c17('0x8f')] = _0x1c2015[_0x5c17('0x35')]({\r\n                'cfg': _0x1c2015[_0x5c17('0x51')][_0x5c17('0x35')]({\r\n                    'kdf': _0x40953\r\n                }),\r\n                'encrypt': function(_0x3eafef, _0x52fe24, _0x50a07e, _0x1e987e) {\r\n                    _0x1e987e = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x1e987e);\r\n                    var _0x501953 = _0x1e987e[_0x5c17('0x8e')][_0x5c17('0x90')](_0x50a07e, _0x3eafef[_0x5c17('0x60')], _0x3eafef[_0x5c17('0x91')]);\r\n                    _0x1e987e['iv'] = _0x501953['iv'];\r\n                    var _0x31b7fe = _0x1c2015[_0x5c17('0x6f')][_0x5c17('0x1')](this, _0x3eafef, _0x52fe24, _0x501953[_0x5c17('0x92')], _0x1e987e);\r\n                    return _0x31b7fe[_0x5c17('0x31')](_0x501953),\r\n                    _0x31b7fe;\r\n                },\r\n                'decrypt': function(_0x35b0e1, _0x343811, _0x37876b, _0x34993e) {\r\n                    _0x34993e = this[_0x5c17('0x51')][_0x5c17('0x35')](_0x34993e),\r\n                    _0x343811 = this[_0x5c17('0x8d')](_0x343811, _0x34993e[_0x5c17('0x88')]);\r\n                    var _0x501953 = _0x34993e[_0x5c17('0x8e')][_0x5c17('0x90')](_0x37876b, _0x35b0e1[_0x5c17('0x60')], _0x35b0e1[_0x5c17('0x91')], _0x343811[_0x5c17('0x8b')]);\r\n                    _0x34993e['iv'] = _0x501953['iv'];\r\n                    var _0x31b7fe = _0x1c2015[_0x5c17('0x70')][_0x5c17('0x1')](this, _0x35b0e1, _0x343811, _0x501953[_0x5c17('0x92')], _0x34993e);\r\n                    return _0x31b7fe;\r\n                }\r\n            });\r\n        } ();\r\n    }); !\r\n    function(_0x4ad04c, _0xaf4055) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0xaf4055(_0x2a86b9(_0x5c17('0x5a'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a')], _0xaf4055) : _0xaf4055(_0x4ad04c[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x6d4400) { !\r\n        function() {\r\n            var _0x403cc0 = _0x6d4400,\r\n            _0x5e943c = _0x403cc0[_0x5c17('0x2f')],\r\n            _0xb10719 = _0x5e943c[_0x5c17('0x30')],\r\n            _0x4504c5 = _0x403cc0[_0x5c17('0x40')],\r\n            _0x25368e = _0x4504c5[_0x5c17('0x44')],\r\n            _0x57b44b = _0x403cc0[_0x5c17('0x59')];\r\n            _0x57b44b[_0x5c17('0x58')] = _0xb10719[_0x5c17('0x35')]({\r\n                'init': function(_0x40715d, _0x3c6d2e) {\r\n                    _0x40715d = this[_0x5c17('0x93')] = new _0x40715d[(_0x5c17('0x32'))](),\r\n                    _0x5c17('0xa') == typeof _0x3c6d2e && (_0x3c6d2e = _0x25368e[_0x5c17('0x46')](_0x3c6d2e));\r\n                    var _0x5e943c = _0x40715d[_0x5c17('0x4a')],\r\n                    _0xb10719 = 0x4 * _0x5e943c;\r\n                    _0x3c6d2e[_0x5c17('0x39')] > _0xb10719 && (_0x3c6d2e = _0x40715d[_0x5c17('0x57')](_0x3c6d2e)),\r\n                    _0x3c6d2e[_0x5c17('0x3b')]();\r\n                    for (var _0x4504c5 = this[_0x5c17('0x94')] = _0x3c6d2e[_0x5c17('0x3d')](), _0x57b44b = this[_0x5c17('0x95')] = _0x3c6d2e[_0x5c17('0x3d')](), _0x35f047 = _0x4504c5[_0x5c17('0x38')], _0x43eef3 = _0x57b44b[_0x5c17('0x38')], _0x5058c0 = 0x0; _0x5058c0 < _0x5e943c; _0x5058c0++) _0x35f047[_0x5058c0] ^= 0x5c5c5c5c,\r\n                    _0x43eef3[_0x5058c0] ^= 0x36363636;\r\n                    _0x4504c5[_0x5c17('0x39')] = _0x57b44b[_0x5c17('0x39')] = _0xb10719,\r\n                    this[_0x5c17('0x52')]();\r\n                },\r\n                'reset': function() {\r\n                    var _0x6d4400 = this[_0x5c17('0x93')];\r\n                    _0x6d4400[_0x5c17('0x52')](),\r\n                    _0x6d4400[_0x5c17('0x62')](this[_0x5c17('0x95')]);\r\n                },\r\n                'update': function(_0xc1a4d2) {\r\n                    return this[_0x5c17('0x93')][_0x5c17('0x62')](_0xc1a4d2),\r\n                    this;\r\n                },\r\n                'finalize': function(_0x5f511f) {\r\n                    var _0x403cc0 = this[_0x5c17('0x93')],\r\n                    _0x5e943c = _0x403cc0[_0x5c17('0x57')](_0x5f511f);\r\n                    _0x403cc0[_0x5c17('0x52')]();\r\n                    var _0xb10719 = _0x403cc0[_0x5c17('0x57')](this[_0x5c17('0x94')][_0x5c17('0x3d')]()[_0x5c17('0x28')](_0x5e943c));\r\n                    return _0xb10719;\r\n                }\r\n            });\r\n        } ();\r\n    }); !\r\n    function(_0x5ee32e, _0x5d1288, _0x11ba5f) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x5d1288(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x96'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x96')], _0x5d1288) : _0x5d1288(_0x5ee32e[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x2d9b33) {\r\n        return _0x2d9b33[_0x5c17('0x72')][_0x5c17('0x97')] = function() {\r\n            var _0x32845d = _0x2d9b33[_0x5c17('0x2f')][_0x5c17('0x73')][_0x5c17('0x35')]();\r\n            return _0x32845d[_0x5c17('0x74')] = _0x32845d[_0x5c17('0x35')]({\r\n                'processBlock': function(_0x381384, _0x3a484f) {\r\n                    this[_0x5c17('0x76')][_0x5c17('0x7a')](_0x381384, _0x3a484f);\r\n                }\r\n            }),\r\n            _0x32845d[_0x5c17('0x75')] = _0x32845d[_0x5c17('0x35')]({\r\n                'processBlock': function(_0x28252b, _0x20eaab) {\r\n                    this[_0x5c17('0x76')][_0x5c17('0x7b')](_0x28252b, _0x20eaab);\r\n                }\r\n            }),\r\n            _0x32845d;\r\n        } (),\r\n        _0x2d9b33[_0x5c17('0x72')][_0x5c17('0x97')];\r\n    }); !\r\n    function(_0x476363, _0x4468bc, _0x1bde73) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x4468bc(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x96'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x96')], _0x4468bc) : _0x4468bc(_0x476363[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x36bfbe) {\r\n        return _0x36bfbe[_0x5c17('0x7c')][_0x5c17('0x7d')];\r\n    }); !\r\n    function(_0x568778, _0xdf3a12, _0x1dc20e) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0xdf3a12(_0x2a86b9(_0x5c17('0x5a')), _0x2a86b9(_0x5c17('0x98')), _0x2a86b9(_0x5c17('0x99')), _0x2a86b9(_0x5c17('0x69')), _0x2a86b9(_0x5c17('0x96'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a'), _0x5c17('0x98'), _0x5c17('0x99'), _0x5c17('0x69'), _0x5c17('0x96')], _0xdf3a12) : _0xdf3a12(_0x568778[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x5cb03f) {\r\n        return function() {\r\n            var _0x23acee = _0x5cb03f,\r\n            _0x20aaa = _0x23acee[_0x5c17('0x2f')],\r\n            _0x4bc2fd = _0x20aaa[_0x5c17('0x7e')],\r\n            _0x91a3c2 = _0x23acee[_0x5c17('0x59')],\r\n            _0x1772c6 = [],\r\n            _0x4a4108 = [],\r\n            _0x316708 = [],\r\n            _0x3bc835 = [],\r\n            _0x4c8fef = [],\r\n            _0x3fdc2e = [],\r\n            _0x26df84 = [],\r\n            _0x264b21 = [],\r\n            _0x58d84f = [],\r\n            _0x5b9ed5 = []; !\r\n            function() {\r\n                for (var _0x5cb03f = [], _0x23acee = 0x0; _0x23acee < 0x100; _0x23acee++) _0x23acee < 0x80 ? _0x5cb03f[_0x23acee] = _0x23acee << 0x1: _0x5cb03f[_0x23acee] = _0x23acee << 0x1 ^ 0x11b;\r\n                for (var _0x20aaa = 0x0,\r\n                _0x4bc2fd = 0x0,\r\n                _0x23acee = 0x0; _0x23acee < 0x100; _0x23acee++) {\r\n                    var _0x91a3c2 = _0x4bc2fd ^ _0x4bc2fd << 0x1 ^ _0x4bc2fd << 0x2 ^ _0x4bc2fd << 0x3 ^ _0x4bc2fd << 0x4;\r\n                    _0x91a3c2 = _0x91a3c2 >>> 0x8 ^ 0xff & _0x91a3c2 ^ 0x63,\r\n                    _0x1772c6[_0x20aaa] = _0x91a3c2,\r\n                    _0x4a4108[_0x91a3c2] = _0x20aaa;\r\n                    var _0xccc8b7 = _0x5cb03f[_0x20aaa],\r\n                    _0x66c2b = _0x5cb03f[_0xccc8b7],\r\n                    _0x1633b6 = _0x5cb03f[_0x66c2b],\r\n                    _0xea2314 = 0x101 * _0x5cb03f[_0x91a3c2] ^ 0x1010100 * _0x91a3c2;\r\n                    _0x316708[_0x20aaa] = _0xea2314 << 0x18 | _0xea2314 >>> 0x8,\r\n                    _0x3bc835[_0x20aaa] = _0xea2314 << 0x10 | _0xea2314 >>> 0x10,\r\n                    _0x4c8fef[_0x20aaa] = _0xea2314 << 0x8 | _0xea2314 >>> 0x18,\r\n                    _0x3fdc2e[_0x20aaa] = _0xea2314;\r\n                    var _0xea2314 = 0x1010101 * _0x1633b6 ^ 0x10001 * _0x66c2b ^ 0x101 * _0xccc8b7 ^ 0x1010100 * _0x20aaa;\r\n                    _0x26df84[_0x91a3c2] = _0xea2314 << 0x18 | _0xea2314 >>> 0x8,\r\n                    _0x264b21[_0x91a3c2] = _0xea2314 << 0x10 | _0xea2314 >>> 0x10,\r\n                    _0x58d84f[_0x91a3c2] = _0xea2314 << 0x8 | _0xea2314 >>> 0x18,\r\n                    _0x5b9ed5[_0x91a3c2] = _0xea2314,\r\n                    _0x20aaa ? (_0x20aaa = _0xccc8b7 ^ _0x5cb03f[_0x5cb03f[_0x5cb03f[_0x1633b6 ^ _0xccc8b7]]], _0x4bc2fd ^= _0x5cb03f[_0x5cb03f[_0x4bc2fd]]) : _0x20aaa = _0x4bc2fd = 0x1;\r\n                }\r\n            } ();\r\n            var _0x20778b = [0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36],\r\n            _0x3a6f08 = _0x91a3c2[_0x5c17('0x9a')] = _0x4bc2fd[_0x5c17('0x35')]({\r\n                '_doReset': function() {\r\n                    if (!this[_0x5c17('0x9b')] || this[_0x5c17('0x9c')] !== this[_0x5c17('0x6e')]) {\r\n                        for (var _0x5cb03f = this[_0x5c17('0x9c')] = this[_0x5c17('0x6e')], _0x23acee = _0x5cb03f[_0x5c17('0x38')], _0x20aaa = _0x5cb03f[_0x5c17('0x39')] / 0x4, _0x4bc2fd = this[_0x5c17('0x9b')] = _0x20aaa + 0x6, _0x91a3c2 = 0x4 * (_0x4bc2fd + 0x1), _0x4a4108 = this[_0x5c17('0x9d')] = [], _0x316708 = 0x0; _0x316708 < _0x91a3c2; _0x316708++) if (_0x316708 < _0x20aaa) _0x4a4108[_0x316708] = _0x23acee[_0x316708];\r\n                        else {\r\n                            var _0x3bc835 = _0x4a4108[_0x316708 - 0x1];\r\n                            _0x316708 % _0x20aaa ? _0x20aaa > 0x6 && _0x316708 % _0x20aaa == 0x4 && (_0x3bc835 = _0x1772c6[_0x3bc835 >>> 0x18] << 0x18 | _0x1772c6[_0x3bc835 >>> 0x10 & 0xff] << 0x10 | _0x1772c6[_0x3bc835 >>> 0x8 & 0xff] << 0x8 | _0x1772c6[0xff & _0x3bc835]) : (_0x3bc835 = _0x3bc835 << 0x8 | _0x3bc835 >>> 0x18, _0x3bc835 = _0x1772c6[_0x3bc835 >>> 0x18] << 0x18 | _0x1772c6[_0x3bc835 >>> 0x10 & 0xff] << 0x10 | _0x1772c6[_0x3bc835 >>> 0x8 & 0xff] << 0x8 | _0x1772c6[0xff & _0x3bc835], _0x3bc835 ^= _0x20778b[_0x316708 / _0x20aaa | 0x0] << 0x18),\r\n                            _0x4a4108[_0x316708] = _0x4a4108[_0x316708 - _0x20aaa] ^ _0x3bc835;\r\n                        }\r\n                        for (var _0x4c8fef = this[_0x5c17('0x9e')] = [], _0x3fdc2e = 0x0; _0x3fdc2e < _0x91a3c2; _0x3fdc2e++) {\r\n                            var _0x316708 = _0x91a3c2 - _0x3fdc2e;\r\n                            if (_0x3fdc2e % 0x4) var _0x3bc835 = _0x4a4108[_0x316708];\r\n                            else var _0x3bc835 = _0x4a4108[_0x316708 - 0x4];\r\n                            _0x3fdc2e < 0x4 || _0x316708 <= 0x4 ? _0x4c8fef[_0x3fdc2e] = _0x3bc835: _0x4c8fef[_0x3fdc2e] = _0x26df84[_0x1772c6[_0x3bc835 >>> 0x18]] ^ _0x264b21[_0x1772c6[_0x3bc835 >>> 0x10 & 0xff]] ^ _0x58d84f[_0x1772c6[_0x3bc835 >>> 0x8 & 0xff]] ^ _0x5b9ed5[_0x1772c6[0xff & _0x3bc835]];\r\n                        }\r\n                    }\r\n                },\r\n                'encryptBlock': function(_0x2c1ba9, _0x58ff29) {\r\n                    this[_0x5c17('0x9f')](_0x2c1ba9, _0x58ff29, this[_0x5c17('0x9d')], _0x316708, _0x3bc835, _0x4c8fef, _0x3fdc2e, _0x1772c6);\r\n                },\r\n                'decryptBlock': function(_0xfabd84, _0x2b34d9) {\r\n                    var _0x20aaa = _0xfabd84[_0x2b34d9 + 0x1];\r\n                    _0xfabd84[_0x2b34d9 + 0x1] = _0xfabd84[_0x2b34d9 + 0x3],\r\n                    _0xfabd84[_0x2b34d9 + 0x3] = _0x20aaa,\r\n                    this[_0x5c17('0x9f')](_0xfabd84, _0x2b34d9, this[_0x5c17('0x9e')], _0x26df84, _0x264b21, _0x58d84f, _0x5b9ed5, _0x4a4108);\r\n                    var _0x20aaa = _0xfabd84[_0x2b34d9 + 0x1];\r\n                    _0xfabd84[_0x2b34d9 + 0x1] = _0xfabd84[_0x2b34d9 + 0x3],\r\n                    _0xfabd84[_0x2b34d9 + 0x3] = _0x20aaa;\r\n                },\r\n                '_doCryptBlock': function(_0x3f8f27, _0x18c46f, _0xab13f3, _0x55e8f7, _0x633e12, _0x3426da, _0x282c3b, _0x39e3b5) {\r\n                    for (var _0x3bc835 = this[_0x5c17('0x9b')], _0x4c8fef = _0x3f8f27[_0x18c46f] ^ _0xab13f3[0x0], _0x3fdc2e = _0x3f8f27[_0x18c46f + 0x1] ^ _0xab13f3[0x1], _0x26df84 = _0x3f8f27[_0x18c46f + 0x2] ^ _0xab13f3[0x2], _0x264b21 = _0x3f8f27[_0x18c46f + 0x3] ^ _0xab13f3[0x3], _0x58d84f = 0x4, _0x5b9ed5 = 0x1; _0x5b9ed5 < _0x3bc835; _0x5b9ed5++) {\r\n                        var _0x20778b = _0x55e8f7[_0x4c8fef >>> 0x18] ^ _0x633e12[_0x3fdc2e >>> 0x10 & 0xff] ^ _0x3426da[_0x26df84 >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x264b21] ^ _0xab13f3[_0x58d84f++],\r\n                        _0x3a6f08 = _0x55e8f7[_0x3fdc2e >>> 0x18] ^ _0x633e12[_0x26df84 >>> 0x10 & 0xff] ^ _0x3426da[_0x264b21 >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x4c8fef] ^ _0xab13f3[_0x58d84f++],\r\n                        _0x5bd6cc = _0x55e8f7[_0x26df84 >>> 0x18] ^ _0x633e12[_0x264b21 >>> 0x10 & 0xff] ^ _0x3426da[_0x4c8fef >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x3fdc2e] ^ _0xab13f3[_0x58d84f++],\r\n                        _0x2859a6 = _0x55e8f7[_0x264b21 >>> 0x18] ^ _0x633e12[_0x4c8fef >>> 0x10 & 0xff] ^ _0x3426da[_0x3fdc2e >>> 0x8 & 0xff] ^ _0x282c3b[0xff & _0x26df84] ^ _0xab13f3[_0x58d84f++];\r\n                        _0x4c8fef = _0x20778b,\r\n                        _0x3fdc2e = _0x3a6f08,\r\n                        _0x26df84 = _0x5bd6cc,\r\n                        _0x264b21 = _0x2859a6;\r\n                    }\r\n                    var _0x20778b = (_0x39e3b5[_0x4c8fef >>> 0x18] << 0x18 | _0x39e3b5[_0x3fdc2e >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x26df84 >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x264b21]) ^ _0xab13f3[_0x58d84f++],\r\n                    _0x3a6f08 = (_0x39e3b5[_0x3fdc2e >>> 0x18] << 0x18 | _0x39e3b5[_0x26df84 >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x264b21 >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x4c8fef]) ^ _0xab13f3[_0x58d84f++],\r\n                    _0x5bd6cc = (_0x39e3b5[_0x26df84 >>> 0x18] << 0x18 | _0x39e3b5[_0x264b21 >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x4c8fef >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x3fdc2e]) ^ _0xab13f3[_0x58d84f++],\r\n                    _0x2859a6 = (_0x39e3b5[_0x264b21 >>> 0x18] << 0x18 | _0x39e3b5[_0x4c8fef >>> 0x10 & 0xff] << 0x10 | _0x39e3b5[_0x3fdc2e >>> 0x8 & 0xff] << 0x8 | _0x39e3b5[0xff & _0x26df84]) ^ _0xab13f3[_0x58d84f++];\r\n                    _0x3f8f27[_0x18c46f] = _0x20778b,\r\n                    _0x3f8f27[_0x18c46f + 0x1] = _0x3a6f08,\r\n                    _0x3f8f27[_0x18c46f + 0x2] = _0x5bd6cc,\r\n                    _0x3f8f27[_0x18c46f + 0x3] = _0x2859a6;\r\n                },\r\n                'keySize': 0x8\r\n            });\r\n            _0x23acee[_0x5c17('0x9a')] = _0x4bc2fd[_0x5c17('0xa0')](_0x3a6f08);\r\n        } (),\r\n        _0x5cb03f[_0x5c17('0x9a')];\r\n    }); !\r\n    function(_0x10e1c0, _0x1f2cc5) {\r\n        _0x5c17('0x7') == typeof _0x1f6ddf ? _0x13d108[_0x5c17('0x0')] = _0x1f6ddf = _0x1f2cc5(_0x2a86b9(_0x5c17('0x5a'))) : _0x5c17('0x2c') == typeof _0x5cd7d6 && _0x5cd7d6[_0x5c17('0x2d')] ? _0x5cd7d6([_0x5c17('0x5a')], _0x1f2cc5) : _0x1f2cc5(_0x10e1c0[_0x5c17('0x2e')]);\r\n    } (this,\r\n    function(_0x8fb41f) {\r\n        return _0x8fb41f[_0x5c17('0x40')][_0x5c17('0x44')];\r\n    });\r\n} [_0x5c17('0x1')](_0x1f8dc9));\r\n_0x13d108[_0x5c17('0x0')] = function(_0x4b4298) {\r\n    var _0x1e484e = _0x5c17('0xa1');\r\n    var _0x1402a9 = _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x40')][_0x5c17('0x44')][_0x5c17('0x46')](_0x1e484e);\r\n    var _0x2d8d25 = _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x40')][_0x5c17('0x44')][_0x5c17('0x46')](_0x4b4298);\r\n    var _0x3aa8f9 = _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x9a')][_0x5c17('0x6f')](_0x2d8d25, _0x1402a9, {\r\n        'mode': _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x72')][_0x5c17('0x97')],\r\n        'padding': _0x1f8dc9[_0x5c17('0x2e')][_0x5c17('0x7c')][_0x5c17('0x7d')]\r\n    });\r\n    return _0x3aa8f9[_0x5c17('0x36')]();\r\n};\r\n},\r\nfunction(_0x1df6e4, _0x5482b3) {\r\n_0x1df6e4[_0x5c17('0x0')] = function(_0x4d378d) {\r\n    var _0x204ca3 = _0x5c17('0xa2');\r\n    var _0x577208;\r\n    var _0x4bae58;\r\n    var _0x4c4ae9;\r\n    var _0x151ea2;\r\n    var _0x23ae53;\r\n    var _0x56f3ce;\r\n    _0x4c4ae9 = _0x4d378d[_0x5c17('0x22')];\r\n    _0x4bae58 = 0x0;\r\n    _0x577208 = '';\r\n    while (_0x4bae58 < _0x4c4ae9) {\r\n        _0x151ea2 = _0x4d378d[_0x5c17('0x27')](_0x4bae58++) & 0xff;\r\n        if (_0x4bae58 === _0x4c4ae9) {\r\n            _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x151ea2 >> 0x2);\r\n            _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x151ea2 & 0x3) << 0x4);\r\n            _0x577208 += '==';\r\n            break;\r\n        }\r\n        _0x23ae53 = _0x4d378d[_0x5c17('0x27')](_0x4bae58++);\r\n        if (_0x4bae58 === _0x4c4ae9) {\r\n            _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x151ea2 >> 0x2);\r\n            _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x151ea2 & 0x3) << 0x4 | (_0x23ae53 & 0xf0) >> 0x4);\r\n            _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x23ae53 & 0xf) << 0x2);\r\n            _0x577208 += '=';\r\n            break;\r\n        }\r\n        _0x56f3ce = _0x4d378d[_0x5c17('0x27')](_0x4bae58++);\r\n        _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x151ea2 >> 0x2);\r\n        _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x151ea2 & 0x3) << 0x4 | (_0x23ae53 & 0xf0) >> 0x4);\r\n        _0x577208 += _0x204ca3[_0x5c17('0x2a')]((_0x23ae53 & 0xf) << 0x2 | (_0x56f3ce & 0xc0) >> 0x6);\r\n        _0x577208 += _0x204ca3[_0x5c17('0x2a')](_0x56f3ce & 0x3f);\r\n    }\r\n    return _0x577208;\r\n};\r\n}])));\r\n\r\nfunction zh(bdstoken,captcha_str,dv,username, yanzhengma) {\r\n_0x342595 = '19201080';\r\ncc = {\r\n    alg: \"v2\",\r\n    bdstoken: bdstoken,\r\n    captcha_str: captcha_str,\r\n    countrycode: \"\",\r\n    dv: dv,\r\n    index: \"username\",\r\n    time: 1574478478,\r\n    tpl: \"\",\r\n    username: username,\r\n    veritycode: yanzhengma\r\n};\r\nbb = xxoo(cc);\r\nreturn bb.time + '|' + bb.sig;\r\n}"
  },
  {
    "path": "其他实战/【百度】网页找回密码/header.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-12-23  Python: 3.7\r\n\r\nUA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'\r\nREFERER = 'https://passport.baidu.com/?getpassindex'\r\nLANGUAGE = 'zh-CN,zh;q=0.9'\r\nCONNECTION = 'keep-alive'\r\n\r\nheaders_get_phone = {\r\n    'Connection': CONNECTION,\r\n    'User-Agent': UA,\r\n    'Accept': '*/*',\r\n    'Sec-Fetch-Site': 'same-origin',\r\n    'Sec-Fetch-Mode': 'no-cors',\r\n    'Referer': REFERER,\r\n    'Accept-Language': LANGUAGE\r\n}\r\n\r\n\r\nheaders_token = {\r\n    \"Connection\": CONNECTION,\r\n    \"Content-Lengt\": '999',\r\n    \"Cache-Control\": 'max-age=0',\r\n    \"Origin\": \"https://passport.baidu.com\",\r\n    \"Upgrade-Insecure-Requests\": '1',\r\n    \"Content-Type\": \"application/x-www-form-urlencoded\",\r\n    \"User-Agent\": UA,\r\n    \"Sec-Fetch-User\": \"?1\",\r\n    \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\",\r\n    \"Sec-Fetch-Site\": \"same-origin\",\r\n    \"Sec-Fetch-Mode\": \"navigate\",\r\n    \"Referer\": REFERER,\r\n    \"Accept-Language\": LANGUAGE,\r\n}\r\n\r\nheaders_img = {\r\n    'Connection': CONNECTION,\r\n    'User-Agent': UA,\r\n    'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',\r\n    'Sec-Fetch-Site': 'same-origin',\r\n    'Sec-Fetch-Mode': 'no-cors',\r\n    'Referer': REFERER,\r\n    'Accept-Language': LANGUAGE,\r\n}\r\n\r\nheaders_bds_token = {\r\n    'Connection': CONNECTION,\r\n    'Upgrade-Insecure-Requests': '1',\r\n    'User-Agent': UA,\r\n    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',\r\n    'Sec-Fetch-Site': 'none',\r\n    'Sec-Fetch-Mode': 'navigate',\r\n    'Accept-Language': LANGUAGE,\r\n}\r\n\r\nheaders_verify_str = {\r\n    'Connection': CONNECTION,\r\n    'User-Agent': UA,\r\n    'Accept': '*/*',\r\n    'Sec-Fetch-Site': 'same-origin',\r\n    'Sec-Fetch-Mode': 'no-cors',\r\n    'Referer': REFERER,\r\n    'Accept-Language': LANGUAGE,\r\n}\r\n"
  },
  {
    "path": "其他实战/【百度】翻译/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-11-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【百度】翻译/translate.js",
    "content": "var i = \"320305.131321201\"\n\n\nfunction n(r, o) {\n    for (var t = 0; t < o.length - 2; t += 3) {\n        var e = o.charAt(t + 2);\n        e = e >= \"a\" ? e.charCodeAt(0) - 87 : Number(e),\n            e = \"+\" === o.charAt(t + 1) ? r >>> e : r << e,\n            r = \"+\" === o.charAt(t) ? r + e & 4294967295 : r ^ e\n    }\n    return r\n}\n\nfunction a(r) {\n    var t = r.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g);\n    if (null === t) {\n        var a = r.length;\n        a > 30 && (r = \"\" + r.substr(0, 10) + r.substr(Math.floor(a / 2) - 5, 10) + r.substr(-10, 10))\n    } else {\n        for (var C = r.split(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/), h = 0, f = C.length, u = []; f > h; h++)\n            \"\" !== C[h] && u.push.apply(u, e(C[h].split(\"\"))),\n            h !== f - 1 && u.push(t[h]);\n        var g = u.length;\n        g > 30 && (r = u.slice(0, 10).join(\"\") + u.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join(\"\") + u.slice(-10).join(\"\"))\n    }\n    var l = void 0\n        , d = \"\" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);\n    l = null !== i ? i : (i = o.common[d] || \"\") || \"\";\n    for (var m = l.split(\".\"), S = Number(m[0]) || 0, s = Number(m[1]) || 0, c = [], v = 0, F = 0; F < r.length; F++) {\n        var p = r.charCodeAt(F);\n        128 > p ? c[v++] = p : (2048 > p ? c[v++] = p >> 6 | 192 : (55296 === (64512 & p) && F + 1 < r.length && 56320 === (64512 & r.charCodeAt(F + 1)) ? (p = 65536 + ((1023 & p) << 10) + (1023 & r.charCodeAt(++F)),\n            c[v++] = p >> 18 | 240,\n            c[v++] = p >> 12 & 63 | 128) : c[v++] = p >> 12 | 224,\n            c[v++] = p >> 6 & 63 | 128),\n            c[v++] = 63 & p | 128)\n    }\n    for (var w = S, A = \"\" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + (\"\" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), b = \"\" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + (\"\" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + (\"\" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), D = 0; D < c.length; D++)\n        w += c[D],\n            w = n(w, A);\n    return w = n(w, b),\n        w ^= s,\n    0 > w && (w = (2147483647 & w) + 2147483648),\n        w %= 1e6,\n    w.toString() + \".\" + (w ^ S)\n}"
  },
  {
    "path": "其他实战/【百度】翻译/translation.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-26  Python: 3.7\n\n# 本代码参考  github作者：CriseLYJ\n\nimport requests\nimport js2py\n\n\nclass FanYiSpider(object):\n    \"\"\"\n    翻译\n    \"\"\"\n    context = js2py.EvalJs()  # python中使用js\n\n    def __init__(self, query):\n        # 初始化\n        self.url = \"https://fanyi.baidu.com/basetrans\"\n        self.query = query\n        self.headers = {\n            \"User-Agent\": \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36\",\n            \"Referer\": \"https://fanyi.baidu.com/\",\n            \"Cookie\": \"BAIDUID=714BFAAF02DA927F583935C7A354949A:FG=1; BIDUPSID=714BFAAF02DA927F583935C7A354949A; PSTM=1553390486; delPer=0; PSINO=5; H_PS_PSSID=28742_1463_21125_18559_28723_28557_28697_28585_28640_28604_28626_22160; locale=zh; from_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; to_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1553658863,1553766321,1553769980,1553770442; Hm_lpvt_afd111fa62852d1f37001d1f980b6800=1553770442; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1553766258,1553766321,1553769980,1553770442; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1553770442\",\n            \"Content-Type\": \"application/x-www-form-urlencoded\",\n            \"Origin\": \"https://fanyi.baidu.com\",\n            \"X-Requested-With\": \"XMLHttpRequest\",\n        }\n\n    def make_sign(self):\n        with open(\"translate.js\", \"r\", encoding=\"utf-8\") as f:\n            self.context.execute(f.read())\n\n        sign = self.context.a(self.query)\n        return sign\n\n    def make_data(self, sign):\n        data = {\n            \"query\": self.query,\n            \"from\": \"en\",\n            \"to\": \"zh\",\n            \"token\": \"6f5c83b84d69ad3633abdf18abcb030d\",\n            \"sign\": sign\n        }\n        return data\n\n    def get_content(self, data):\n        response = requests.post(\n            url=self.url,\n            headers=self.headers,\n            data=data\n        )\n        return response.json()[\"trans\"][0][\"dst\"]\n\n    @property\n    def run(self):\n        sign = self.make_sign() # 获取sign的值\n        data = self.make_data(sign)  # 构建参数\n        content = self.get_content(data)  # 获取翻译内容\n        return content\n\n\nif __name__ == '__main__':\n    key = input(\"输入翻译内容:\")\n    translate = FanYiSpider(key)\n    print(translate.run)\n"
  },
  {
    "path": "其他实战/【百度】自动登录/README.md",
    "content": "# 解密过程参考博客\n\n[博客链接](https://www.zhangkunzhi.com/?p=216)"
  },
  {
    "path": "其他实战/【百度】自动登录/encryp.js",
    "content": "// const jsdom = require(\"jsdom\");\n// const { JSDOM } = jsdom;\n// const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);\n// window = dom.window;\n// document = window.document;\n// XMLHttpRequest = window.XMLHttpRequest;\n\nvar navigator = {};\nvar windows = {};\n\npassport = {},\n\tpassport.lib = passport.lib || {},\n\tpassport.lib.RSAExport = {},\n\tfunction(e) {\n\t\tfunction t(e, t, n) {\n\t\t\tnull != e && (\"number\" == typeof e ? this.fromNumber(e, t, n) : null == t && \"string\" != typeof e ? this.fromString(\n\t\t\t\te, 256) : this.fromString(e, t))\n\t\t}\n\n\t\tfunction n() {\n\t\t\treturn new t(null)\n\t\t}\n\n\t\tfunction i(e, t, n, i, s, o) {\n\t\t\tfor (; --o >= 0;) {\n\t\t\t\tvar r = t * this[e++] + n[i] + s;\n\t\t\t\ts = Math.floor(r / 67108864),\n\t\t\t\t\tn[i++] = 67108863 & r\n\t\t\t}\n\t\t\treturn s\n\t\t}\n\n\t\tfunction s(e, t, n, i, s, o) {\n\t\t\tfor (var r = 32767 & t, a = t >> 15; --o >= 0;) {\n\t\t\t\tvar c = 32767 & this[e],\n\t\t\t\t\tl = this[e++] >> 15,\n\t\t\t\t\td = a * c + l * r;\n\t\t\t\tc = r * c + ((32767 & d) << 15) + n[i] + (1073741823 & s),\n\t\t\t\t\ts = (c >>> 30) + (d >>> 15) + a * l + (s >>> 30),\n\t\t\t\t\tn[i++] = 1073741823 & c\n\t\t\t}\n\t\t\treturn s\n\t\t}\n\n\t\tfunction o(e, t, n, i, s, o) {\n\t\t\tfor (var r = 16383 & t, a = t >> 14; --o >= 0;) {\n\t\t\t\tvar c = 16383 & this[e],\n\t\t\t\t\tl = this[e++] >> 14,\n\t\t\t\t\td = a * c + l * r;\n\t\t\t\tc = r * c + ((16383 & d) << 14) + n[i] + s,\n\t\t\t\t\ts = (c >> 28) + (d >> 14) + a * l,\n\t\t\t\t\tn[i++] = 268435455 & c\n\t\t\t}\n\t\t\treturn s\n\t\t}\n\n\t\tfunction r(e) {\n\t\t\treturn xn.charAt(e)\n\t\t}\n\n\t\tfunction a(e, t) {\n\t\t\tvar n = Ln[e.charCodeAt(t)];\n\t\t\treturn null == n ? -1 : n\n\t\t}\n\n\t\tfunction c(e) {\n\t\t\tfor (var t = this.t - 1; t >= 0; --t)\n\t\t\t\te[t] = this[t];\n\t\t\te.t = this.t,\n\t\t\t\te.s = this.s\n\t\t}\n\n\t\tfunction l(e) {\n\t\t\tthis.t = 1,\n\t\t\t\tthis.s = 0 > e ? -1 : 0,\n\t\t\t\te > 0 ? this[0] = e : -1 > e ? this[0] = e + DV : this.t = 0\n\t\t}\n\n\t\tfunction d(e) {\n\t\t\tvar t = n();\n\t\t\treturn t.fromInt(e),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction u(e, n) {\n\t\t\tvar i;\n\t\t\tif (16 == n)\n\t\t\t\ti = 4;\n\t\t\telse if (8 == n)\n\t\t\t\ti = 3;\n\t\t\telse if (256 == n)\n\t\t\t\ti = 8;\n\t\t\telse if (2 == n)\n\t\t\t\ti = 1;\n\t\t\telse if (32 == n)\n\t\t\t\ti = 5;\n\t\t\telse {\n\t\t\t\tif (4 != n)\n\t\t\t\t\treturn void this.fromRadix(e, n);\n\t\t\t\ti = 2\n\t\t\t}\n\t\t\tthis.t = 0,\n\t\t\t\tthis.s = 0;\n\t\t\tfor (var s = e.length, o = !1, r = 0; --s >= 0;) {\n\t\t\t\tvar c = 8 == i ? 255 & e[s] : a(e, s);\n\t\t\t\t0 > c ? \"-\" == e.charAt(s) && (o = !0) : (o = !1,\n\t\t\t\t\t0 == r ? this[this.t++] = c : r + i > this.DB ? (this[this.t - 1] |= (c & (1 << this.DB - r) - 1) << r,\n\t\t\t\t\t\tthis[this.t++] = c >> this.DB - r) : this[this.t - 1] |= c << r,\n\t\t\t\t\tr += i,\n\t\t\t\t\tr >= this.DB && (r -= this.DB))\n\t\t\t}\n\t\t\t8 == i && 0 != (128 & e[0]) && (this.s = -1,\n\t\t\t\t\tr > 0 && (this[this.t - 1] |= (1 << this.DB - r) - 1 << r)),\n\t\t\t\tthis.clamp(),\n\t\t\t\to && t.ZERO.subTo(this, this)\n\t\t}\n\n\t\tfunction p() {\n\t\t\tfor (var e = this.s & this.DM; this.t > 0 && this[this.t - 1] == e;)\n\t\t\t\t--this.t\n\t\t}\n\n\t\tfunction g(e) {\n\t\t\tif (this.s < 0)\n\t\t\t\treturn \"-\" + this.negate().toString(e);\n\t\t\tvar t;\n\t\t\tif (16 == e)\n\t\t\t\tt = 4;\n\t\t\telse if (8 == e)\n\t\t\t\tt = 3;\n\t\t\telse if (2 == e)\n\t\t\t\tt = 1;\n\t\t\telse if (32 == e)\n\t\t\t\tt = 5;\n\t\t\telse {\n\t\t\t\tif (4 != e)\n\t\t\t\t\treturn this.toRadix(e);\n\t\t\t\tt = 2\n\t\t\t}\n\t\t\tvar n, i = (1 << t) - 1,\n\t\t\t\ts = !1,\n\t\t\t\to = \"\",\n\t\t\t\ta = this.t,\n\t\t\t\tc = this.DB - a * this.DB % t;\n\t\t\tif (a-- > 0)\n\t\t\t\tfor (c < this.DB && (n = this[a] >> c) > 0 && (s = !0,\n\t\t\t\t\t\to = r(n)); a >= 0;)\n\t\t\t\t\tt > c ? (n = (this[a] & (1 << c) - 1) << t - c,\n\t\t\t\t\t\tn |= this[--a] >> (c += this.DB - t)) : (n = this[a] >> (c -= t) & i,\n\t\t\t\t\t\t0 >= c && (c += this.DB,\n\t\t\t\t\t\t\t--a)),\n\t\t\t\t\tn > 0 && (s = !0),\n\t\t\t\t\ts && (o += r(n));\n\t\t\treturn s ? o : \"0\"\n\t\t}\n\n\t\tfunction h() {\n\t\t\tvar e = n();\n\t\t\treturn t.ZERO.subTo(this, e),\n\t\t\t\te\n\t\t}\n\n\t\tfunction m() {\n\t\t\treturn this.s < 0 ? this.negate() : this\n\t\t}\n\n\t\tfunction f(e) {\n\t\t\tvar t = this.s - e.s;\n\t\t\tif (0 != t)\n\t\t\t\treturn t;\n\t\t\tvar n = this.t;\n\t\t\tif (t = n - e.t,\n\t\t\t\t0 != t)\n\t\t\t\treturn this.s < 0 ? -t : t;\n\t\t\tfor (; --n >= 0;)\n\t\t\t\tif (0 != (t = this[n] - e[n]))\n\t\t\t\t\treturn t;\n\t\t\treturn 0\n\t\t}\n\n\t\tfunction b(e) {\n\t\t\tvar t, n = 1;\n\t\t\treturn 0 != (t = e >>> 16) && (e = t,\n\t\t\t\t\tn += 16),\n\t\t\t\t0 != (t = e >> 8) && (e = t,\n\t\t\t\t\tn += 8),\n\t\t\t\t0 != (t = e >> 4) && (e = t,\n\t\t\t\t\tn += 4),\n\t\t\t\t0 != (t = e >> 2) && (e = t,\n\t\t\t\t\tn += 2),\n\t\t\t\t0 != (t = e >> 1) && (e = t,\n\t\t\t\t\tn += 1),\n\t\t\t\tn\n\t\t}\n\n\t\tfunction y() {\n\t\t\treturn this.t <= 0 ? 0 : this.DB * (this.t - 1) + b(this[this.t - 1] ^ this.s & this.DM)\n\t\t}\n\n\t\tfunction _(e, t) {\n\t\t\tvar n;\n\t\t\tfor (n = this.t - 1; n >= 0; --n)\n\t\t\t\tt[n + e] = this[n];\n\t\t\tfor (n = e - 1; n >= 0; --n)\n\t\t\t\tt[n] = 0;\n\t\t\tt.t = this.t + e,\n\t\t\t\tt.s = this.s\n\t\t}\n\n\t\tfunction E(e, t) {\n\t\t\tfor (var n = e; n < this.t; ++n)\n\t\t\t\tt[n - e] = this[n];\n\t\t\tt.t = Math.max(this.t - e, 0),\n\t\t\t\tt.s = this.s\n\t\t}\n\n\t\tfunction w(e, t) {\n\t\t\tvar n, i = e % this.DB,\n\t\t\t\ts = this.DB - i,\n\t\t\t\to = (1 << s) - 1,\n\t\t\t\tr = Math.floor(e / this.DB),\n\t\t\t\ta = this.s << i & this.DM;\n\t\t\tfor (n = this.t - 1; n >= 0; --n)\n\t\t\t\tt[n + r + 1] = this[n] >> s | a,\n\t\t\t\ta = (this[n] & o) << i;\n\t\t\tfor (n = r - 1; n >= 0; --n)\n\t\t\t\tt[n] = 0;\n\t\t\tt[r] = a,\n\t\t\t\tt.t = this.t + r + 1,\n\t\t\t\tt.s = this.s,\n\t\t\t\tt.clamp()\n\t\t}\n\n\t\tfunction C(e, t) {\n\t\t\tt.s = this.s;\n\t\t\tvar n = Math.floor(e / this.DB);\n\t\t\tif (n >= this.t)\n\t\t\t\treturn void(t.t = 0);\n\t\t\tvar i = e % this.DB,\n\t\t\t\ts = this.DB - i,\n\t\t\t\to = (1 << i) - 1;\n\t\t\tt[0] = this[n] >> i;\n\t\t\tfor (var r = n + 1; r < this.t; ++r)\n\t\t\t\tt[r - n - 1] |= (this[r] & o) << s,\n\t\t\t\tt[r - n] = this[r] >> i;\n\t\t\ti > 0 && (t[this.t - n - 1] |= (this.s & o) << s),\n\t\t\t\tt.t = this.t - n,\n\t\t\t\tt.clamp()\n\t\t}\n\n\t\tfunction S(e, t) {\n\t\t\tfor (var n = 0, i = 0, s = Math.min(e.t, this.t); s > n;)\n\t\t\t\ti += this[n] - e[n],\n\t\t\t\tt[n++] = i & this.DM,\n\t\t\t\ti >>= this.DB;\n\t\t\tif (e.t < this.t) {\n\t\t\t\tfor (i -= e.s; n < this.t;)\n\t\t\t\t\ti += this[n],\n\t\t\t\t\tt[n++] = i & this.DM,\n\t\t\t\t\ti >>= this.DB;\n\t\t\t\ti += this.s\n\t\t\t} else {\n\t\t\t\tfor (i += this.s; n < e.t;)\n\t\t\t\t\ti -= e[n],\n\t\t\t\t\tt[n++] = i & this.DM,\n\t\t\t\t\ti >>= this.DB;\n\t\t\t\ti -= e.s\n\t\t\t}\n\t\t\tt.s = 0 > i ? -1 : 0,\n\t\t\t\t-1 > i ? t[n++] = this.DV + i : i > 0 && (t[n++] = i),\n\t\t\t\tt.t = n,\n\t\t\t\tt.clamp()\n\t\t}\n\n\t\tfunction I(e, n) {\n\t\t\tvar i = this.abs(),\n\t\t\t\ts = e.abs(),\n\t\t\t\to = i.t;\n\t\t\tfor (n.t = o + s.t; --o >= 0;)\n\t\t\t\tn[o] = 0;\n\t\t\tfor (o = 0; o < s.t; ++o)\n\t\t\t\tn[o + i.t] = i.am(0, s[o], n, o, 0, i.t);\n\t\t\tn.s = 0,\n\t\t\t\tn.clamp(),\n\t\t\t\tthis.s != e.s && t.ZERO.subTo(n, n)\n\t\t}\n\n\t\tfunction T(e) {\n\t\t\tfor (var t = this.abs(), n = e.t = 2 * t.t; --n >= 0;)\n\t\t\t\te[n] = 0;\n\t\t\tfor (n = 0; n < t.t - 1; ++n) {\n\t\t\t\tvar i = t.am(n, t[n], e, 2 * n, 0, 1);\n\t\t\t\t(e[n + t.t] += t.am(n + 1, 2 * t[n], e, 2 * n + 1, i, t.t - n - 1)) >= t.DV && (e[n + t.t] -= t.DV,\n\t\t\t\t\te[n + t.t + 1] = 1)\n\t\t\t}\n\t\t\te.t > 0 && (e[e.t - 1] += t.am(n, t[n], e, 2 * n, 0, 1)),\n\t\t\t\te.s = 0,\n\t\t\t\te.clamp()\n\t\t}\n\n\t\tfunction D(e, i, s) {\n\t\t\tvar o = e.abs();\n\t\t\tif (!(o.t <= 0)) {\n\t\t\t\tvar r = this.abs();\n\t\t\t\tif (r.t < o.t)\n\t\t\t\t\treturn null != i && i.fromInt(0),\n\t\t\t\t\t\tvoid(null != s && this.copyTo(s));\n\t\t\t\tnull == s && (s = n());\n\t\t\t\tvar a = n(),\n\t\t\t\t\tc = this.s,\n\t\t\t\t\tl = e.s,\n\t\t\t\t\td = this.DB - b(o[o.t - 1]);\n\t\t\t\td > 0 ? (o.lShiftTo(d, a),\n\t\t\t\t\tr.lShiftTo(d, s)) : (o.copyTo(a),\n\t\t\t\t\tr.copyTo(s));\n\t\t\t\tvar u = a.t,\n\t\t\t\t\tp = a[u - 1];\n\t\t\t\tif (0 != p) {\n\t\t\t\t\tvar g = p * (1 << this.F1) + (u > 1 ? a[u - 2] >> this.F2 : 0),\n\t\t\t\t\t\th = this.FV / g,\n\t\t\t\t\t\tm = (1 << this.F1) / g,\n\t\t\t\t\t\tf = 1 << this.F2,\n\t\t\t\t\t\tv = s.t,\n\t\t\t\t\t\ty = v - u,\n\t\t\t\t\t\t_ = null == i ? n() : i;\n\t\t\t\t\tfor (a.dlShiftTo(y, _),\n\t\t\t\t\t\ts.compareTo(_) >= 0 && (s[s.t++] = 1,\n\t\t\t\t\t\t\ts.subTo(_, s)),\n\t\t\t\t\t\tt.ONE.dlShiftTo(u, _),\n\t\t\t\t\t\t_.subTo(a, a); a.t < u;)\n\t\t\t\t\t\ta[a.t++] = 0;\n\t\t\t\t\tfor (; --y >= 0;) {\n\t\t\t\t\t\tvar E = s[--v] == p ? this.DM : Math.floor(s[v] * h + (s[v - 1] + f) * m);\n\t\t\t\t\t\tif ((s[v] += a.am(0, E, s, y, 0, u)) < E)\n\t\t\t\t\t\t\tfor (a.dlShiftTo(y, _),\n\t\t\t\t\t\t\t\ts.subTo(_, s); s[v] < --E;)\n\t\t\t\t\t\t\t\ts.subTo(_, s)\n\t\t\t\t\t}\n\t\t\t\t\tnull != i && (s.drShiftTo(u, i),\n\t\t\t\t\t\t\tc != l && t.ZERO.subTo(i, i)),\n\t\t\t\t\t\ts.t = u,\n\t\t\t\t\t\ts.clamp(),\n\t\t\t\t\t\td > 0 && s.rShiftTo(d, s),\n\t\t\t\t\t\t0 > c && t.ZERO.subTo(s, s)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction R(e) {\n\t\t\tvar i = n();\n\t\t\treturn this.abs().divRemTo(e, null, i),\n\t\t\t\tthis.s < 0 && i.compareTo(t.ZERO) > 0 && e.subTo(i, i),\n\t\t\t\ti\n\t\t}\n\n\t\tfunction k(e) {\n\t\t\tthis.m = e\n\t\t}\n\n\t\tfunction x(e) {\n\t\t\treturn e.s < 0 || e.compareTo(this.m) >= 0 ? e.mod(this.m) : e\n\t\t}\n\n\t\tfunction L(e) {\n\t\t\treturn e\n\t\t}\n\n\t\tfunction P(e) {\n\t\t\te.divRemTo(this.m, null, e)\n\t\t}\n\n\t\tfunction A(e, t, n) {\n\t\t\te.multiplyTo(t, n),\n\t\t\t\tthis.reduce(n)\n\t\t}\n\n\t\tfunction B(e, t) {\n\t\t\te.squareTo(t),\n\t\t\t\tthis.reduce(t)\n\t\t}\n\n\t\tfunction M() {\n\t\t\tif (this.t < 1)\n\t\t\t\treturn 0;\n\t\t\tvar e = this[0];\n\t\t\tif (0 == (1 & e))\n\t\t\t\treturn 0;\n\t\t\tvar t = 3 & e;\n\t\t\treturn t = t * (2 - (15 & e) * t) & 15,\n\t\t\t\tt = t * (2 - (255 & e) * t) & 255,\n\t\t\t\tt = t * (2 - ((65535 & e) * t & 65535)) & 65535,\n\t\t\t\tt = t * (2 - e * t % this.DV) % this.DV,\n\t\t\t\tt > 0 ? this.DV - t : -t\n\t\t}\n\n\t\tfunction V(e) {\n\t\t\tthis.m = e,\n\t\t\t\tthis.mp = e.invDigit(),\n\t\t\t\tthis.mpl = 32767 & this.mp,\n\t\t\t\tthis.mph = this.mp >> 15,\n\t\t\t\tthis.um = (1 << e.DB - 15) - 1,\n\t\t\t\tthis.mt2 = 2 * e.t\n\t\t}\n\n\t\tfunction $(e) {\n\t\t\tvar i = n();\n\t\t\treturn e.abs().dlShiftTo(this.m.t, i),\n\t\t\t\ti.divRemTo(this.m, null, i),\n\t\t\t\te.s < 0 && i.compareTo(t.ZERO) > 0 && this.m.subTo(i, i),\n\t\t\t\ti\n\t\t}\n\n\t\tfunction O(e) {\n\t\t\tvar t = n();\n\t\t\treturn e.copyTo(t),\n\t\t\t\tthis.reduce(t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction U(e) {\n\t\t\tfor (; e.t <= this.mt2;)\n\t\t\t\te[e.t++] = 0;\n\t\t\tfor (var t = 0; t < this.m.t; ++t) {\n\t\t\t\tvar n = 32767 & e[t],\n\t\t\t\t\ti = n * this.mpl + ((n * this.mph + (e[t] >> 15) * this.mpl & this.um) << 15) & e.DM;\n\t\t\t\tfor (n = t + this.m.t,\n\t\t\t\t\te[n] += this.m.am(0, i, e, t, 0, this.m.t); e[n] >= e.DV;)\n\t\t\t\t\te[n] -= e.DV,\n\t\t\t\t\te[++n]++\n\t\t\t}\n\t\t\te.clamp(),\n\t\t\t\te.drShiftTo(this.m.t, e),\n\t\t\t\te.compareTo(this.m) >= 0 && e.subTo(this.m, e)\n\t\t}\n\n\t\tfunction N(e, t) {\n\t\t\te.squareTo(t),\n\t\t\t\tthis.reduce(t)\n\t\t}\n\n\t\tfunction q(e, t, n) {\n\t\t\te.multiplyTo(t, n),\n\t\t\t\tthis.reduce(n)\n\t\t}\n\n\t\tfunction H() {\n\t\t\treturn 0 == (this.t > 0 ? 1 & this[0] : this.s)\n\t\t}\n\n\t\tfunction F(e, i) {\n\t\t\tif (e > 4294967295 || 1 > e)\n\t\t\t\treturn t.ONE;\n\t\t\tvar s = n(),\n\t\t\t\to = n(),\n\t\t\t\tr = i.convert(this),\n\t\t\t\ta = b(e) - 1;\n\t\t\tfor (r.copyTo(s); --a >= 0;)\n\t\t\t\tif (i.sqrTo(s, o),\n\t\t\t\t\t(e & 1 << a) > 0)\n\t\t\t\t\ti.mulTo(o, r, s);\n\t\t\t\telse {\n\t\t\t\t\tvar c = s;\n\t\t\t\t\ts = o,\n\t\t\t\t\t\to = c\n\t\t\t\t}\n\t\t\treturn i.revert(s)\n\t\t}\n\n\t\tfunction W(e, t) {\n\t\t\tvar n;\n\t\t\treturn n = 256 > e || t.isEven() ? new k(t) : new V(t),\n\t\t\t\tthis.exp(e, n)\n\t\t}\n\n\t\tfunction K() {\n\t\t\tvar e = n();\n\t\t\treturn this.copyTo(e),\n\t\t\t\te\n\t\t}\n\n\t\tfunction j() {\n\t\t\tif (this.s < 0) {\n\t\t\t\tif (1 == this.t)\n\t\t\t\t\treturn this[0] - this.DV;\n\t\t\t\tif (0 == this.t)\n\t\t\t\t\treturn -1\n\t\t\t} else {\n\t\t\t\tif (1 == this.t)\n\t\t\t\t\treturn this[0];\n\t\t\t\tif (0 == this.t)\n\t\t\t\t\treturn 0\n\t\t\t}\n\t\t\treturn (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]\n\t\t}\n\n\t\tfunction J() {\n\t\t\treturn 0 == this.t ? this.s : this[0] << 24 >> 24\n\t\t}\n\n\t\tfunction G() {\n\t\t\treturn 0 == this.t ? this.s : this[0] << 16 >> 16\n\t\t}\n\n\t\tfunction Q(e) {\n\t\t\treturn Math.floor(Math.LN2 * this.DB / Math.log(e))\n\t\t}\n\n\t\tfunction z() {\n\t\t\treturn this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1\n\t\t}\n\n\t\tfunction Z(e) {\n\t\t\tif (null == e && (e = 10),\n\t\t\t\t0 == this.signum() || 2 > e || e > 36)\n\t\t\t\treturn \"0\";\n\t\t\tvar t = this.chunkSize(e),\n\t\t\t\ti = Math.pow(e, t),\n\t\t\t\ts = d(i),\n\t\t\t\to = n(),\n\t\t\t\tr = n(),\n\t\t\t\ta = \"\";\n\t\t\tfor (this.divRemTo(s, o, r); o.signum() > 0;)\n\t\t\t\ta = (i + r.intValue()).toString(e).substr(1) + a,\n\t\t\t\to.divRemTo(s, o, r);\n\t\t\treturn r.intValue().toString(e) + a\n\t\t}\n\n\t\tfunction Y(e, n) {\n\t\t\tthis.fromInt(0),\n\t\t\t\tnull == n && (n = 10);\n\t\t\tfor (var i = this.chunkSize(n), s = Math.pow(n, i), o = !1, r = 0, c = 0, l = 0; l < e.length; ++l) {\n\t\t\t\tvar d = a(e, l);\n\t\t\t\t0 > d ? \"-\" == e.charAt(l) && 0 == this.signum() && (o = !0) : (c = n * c + d,\n\t\t\t\t\t++r >= i && (this.dMultiply(s),\n\t\t\t\t\t\tthis.dAddOffset(c, 0),\n\t\t\t\t\t\tr = 0,\n\t\t\t\t\t\tc = 0))\n\t\t\t}\n\t\t\tr > 0 && (this.dMultiply(Math.pow(n, r)),\n\t\t\t\t\tthis.dAddOffset(c, 0)),\n\t\t\t\to && t.ZERO.subTo(this, this)\n\t\t}\n\n\t\tfunction X(e, n, i) {\n\t\t\tif (\"number\" == typeof n)\n\t\t\t\tif (2 > e)\n\t\t\t\t\tthis.fromInt(1);\n\t\t\t\telse\n\t\t\t\t\tfor (this.fromNumber(e, i),\n\t\t\t\t\t\tthis.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), at, this),\n\t\t\t\t\t\tthis.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(n);)\n\t\t\t\t\t\tthis.dAddOffset(2, 0),\n\t\t\t\t\t\tthis.bitLength() > e && this.subTo(t.ONE.shiftLeft(e - 1), this);\n\t\t\telse {\n\t\t\t\tvar s = new Array,\n\t\t\t\t\to = 7 & e;\n\t\t\t\ts.length = (e >> 3) + 1,\n\t\t\t\t\tn.nextBytes(s),\n\t\t\t\t\to > 0 ? s[0] &= (1 << o) - 1 : s[0] = 0,\n\t\t\t\t\tthis.fromString(s, 256)\n\t\t\t}\n\t\t}\n\n\t\tfunction et() {\n\t\t\tvar e = this.t,\n\t\t\t\tt = new Array;\n\t\t\tt[0] = this.s;\n\t\t\tvar n, i = this.DB - e * this.DB % 8,\n\t\t\t\ts = 0;\n\t\t\tif (e-- > 0)\n\t\t\t\tfor (i < this.DB && (n = this[e] >> i) != (this.s & this.DM) >> i && (t[s++] = n | this.s << this.DB - i); e >= 0;)\n\t\t\t\t\t8 > i ? (n = (this[e] & (1 << i) - 1) << 8 - i,\n\t\t\t\t\t\tn |= this[--e] >> (i += this.DB - 8)) : (n = this[e] >> (i -= 8) & 255,\n\t\t\t\t\t\t0 >= i && (i += this.DB,\n\t\t\t\t\t\t\t--e)),\n\t\t\t\t\t0 != (128 & n) && (n |= -256),\n\t\t\t\t\t0 == s && (128 & this.s) != (128 & n) && ++s,\n\t\t\t\t\t(s > 0 || n != this.s) && (t[s++] = n);\n\t\t\treturn t\n\t\t}\n\n\t\tfunction tt(e) {\n\t\t\treturn 0 == this.compareTo(e)\n\t\t}\n\n\t\tfunction nt(e) {\n\t\t\treturn this.compareTo(e) < 0 ? this : e\n\t\t}\n\n\t\tfunction it(e) {\n\t\t\treturn this.compareTo(e) > 0 ? this : e\n\t\t}\n\n\t\tfunction st(e, t, n) {\n\t\t\tvar i, s, o = Math.min(e.t, this.t);\n\t\t\tfor (i = 0; o > i; ++i)\n\t\t\t\tn[i] = t(this[i], e[i]);\n\t\t\tif (e.t < this.t) {\n\t\t\t\tfor (s = e.s & this.DM,\n\t\t\t\t\ti = o; i < this.t; ++i)\n\t\t\t\t\tn[i] = t(this[i], s);\n\t\t\t\tn.t = this.t\n\t\t\t} else {\n\t\t\t\tfor (s = this.s & this.DM,\n\t\t\t\t\ti = o; i < e.t; ++i)\n\t\t\t\t\tn[i] = t(s, e[i]);\n\t\t\t\tn.t = e.t\n\t\t\t}\n\t\t\tn.s = t(this.s, e.s),\n\t\t\t\tn.clamp()\n\t\t}\n\n\t\tfunction ot(e, t) {\n\t\t\treturn e & t\n\t\t}\n\n\t\tfunction rt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.bitwiseTo(e, ot, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction at(e, t) {\n\t\t\treturn e | t\n\t\t}\n\n\t\tfunction ct(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.bitwiseTo(e, at, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction lt(e, t) {\n\t\t\treturn e ^ t\n\t\t}\n\n\t\tfunction dt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.bitwiseTo(e, lt, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction ut(e, t) {\n\t\t\treturn e & ~t\n\t\t}\n\n\t\tfunction pt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.bitwiseTo(e, ut, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction gt() {\n\t\t\tfor (var e = n(), t = 0; t < this.t; ++t)\n\t\t\t\te[t] = this.DM & ~this[t];\n\t\t\treturn e.t = this.t,\n\t\t\t\te.s = ~this.s,\n\t\t\t\te\n\t\t}\n\n\t\tfunction ht(e) {\n\t\t\tvar t = n();\n\t\t\treturn 0 > e ? this.rShiftTo(-e, t) : this.lShiftTo(e, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction mt(e) {\n\t\t\tvar t = n();\n\t\t\treturn 0 > e ? this.lShiftTo(-e, t) : this.rShiftTo(e, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction ft(e) {\n\t\t\tif (0 == e)\n\t\t\t\treturn -1;\n\t\t\tvar t = 0;\n\t\t\treturn 0 == (65535 & e) && (e >>= 16,\n\t\t\t\t\tt += 16),\n\t\t\t\t0 == (255 & e) && (e >>= 8,\n\t\t\t\t\tt += 8),\n\t\t\t\t0 == (15 & e) && (e >>= 4,\n\t\t\t\t\tt += 4),\n\t\t\t\t0 == (3 & e) && (e >>= 2,\n\t\t\t\t\tt += 2),\n\t\t\t\t0 == (1 & e) && ++t,\n\t\t\t\tt\n\t\t}\n\n\t\tfunction vt() {\n\t\t\tfor (var e = 0; e < this.t; ++e)\n\t\t\t\tif (0 != this[e])\n\t\t\t\t\treturn e * this.DB + ft(this[e]);\n\t\t\treturn this.s < 0 ? this.t * this.DB : -1\n\t\t}\n\n\t\tfunction bt(e) {\n\t\t\tfor (var t = 0; 0 != e;)\n\t\t\t\te &= e - 1,\n\t\t\t\t++t;\n\t\t\treturn t\n\t\t}\n\n\t\tfunction yt() {\n\t\t\tfor (var e = 0, t = this.s & this.DM, n = 0; n < this.t; ++n)\n\t\t\t\te += bt(this[n] ^ t);\n\t\t\treturn e\n\t\t}\n\n\t\tfunction _t(e) {\n\t\t\tvar t = Math.floor(e / this.DB);\n\t\t\treturn t >= this.t ? 0 != this.s : 0 != (this[t] & 1 << e % this.DB)\n\t\t}\n\n\t\tfunction Et(e, n) {\n\t\t\tvar i = t.ONE.shiftLeft(e);\n\t\t\treturn this.bitwiseTo(i, n, i),\n\t\t\t\ti\n\t\t}\n\n\t\tfunction wt(e) {\n\t\t\treturn this.changeBit(e, at)\n\t\t}\n\n\t\tfunction Ct(e) {\n\t\t\treturn this.changeBit(e, ut)\n\t\t}\n\n\t\tfunction St(e) {\n\t\t\treturn this.changeBit(e, lt)\n\t\t}\n\n\t\tfunction It(e, t) {\n\t\t\tfor (var n = 0, i = 0, s = Math.min(e.t, this.t); s > n;)\n\t\t\t\ti += this[n] + e[n],\n\t\t\t\tt[n++] = i & this.DM,\n\t\t\t\ti >>= this.DB;\n\t\t\tif (e.t < this.t) {\n\t\t\t\tfor (i += e.s; n < this.t;)\n\t\t\t\t\ti += this[n],\n\t\t\t\t\tt[n++] = i & this.DM,\n\t\t\t\t\ti >>= this.DB;\n\t\t\t\ti += this.s\n\t\t\t} else {\n\t\t\t\tfor (i += this.s; n < e.t;)\n\t\t\t\t\ti += e[n],\n\t\t\t\t\tt[n++] = i & this.DM,\n\t\t\t\t\ti >>= this.DB;\n\t\t\t\ti += e.s\n\t\t\t}\n\t\t\tt.s = 0 > i ? -1 : 0,\n\t\t\t\ti > 0 ? t[n++] = i : -1 > i && (t[n++] = this.DV + i),\n\t\t\t\tt.t = n,\n\t\t\t\tt.clamp()\n\t\t}\n\n\t\tfunction Tt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.addTo(e, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction Dt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.subTo(e, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction Rt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.multiplyTo(e, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction kt() {\n\t\t\tvar e = n();\n\t\t\treturn this.squareTo(e),\n\t\t\t\te\n\t\t}\n\n\t\tfunction xt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.divRemTo(e, t, null),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction Lt(e) {\n\t\t\tvar t = n();\n\t\t\treturn this.divRemTo(e, null, t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction Pt(e) {\n\t\t\tvar t = n(),\n\t\t\t\ti = n();\n\t\t\treturn this.divRemTo(e, t, i),\n\t\t\t\tnew Array(t, i)\n\t\t}\n\n\t\tfunction At(e) {\n\t\t\tthis[this.t] = this.am(0, e - 1, this, 0, 0, this.t),\n\t\t\t\t++this.t,\n\t\t\t\tthis.clamp()\n\t\t}\n\n\t\tfunction Bt(e, t) {\n\t\t\tif (0 != e) {\n\t\t\t\tfor (; this.t <= t;)\n\t\t\t\t\tthis[this.t++] = 0;\n\t\t\t\tfor (this[t] += e; this[t] >= this.DV;)\n\t\t\t\t\tthis[t] -= this.DV,\n\t\t\t\t\t++t >= this.t && (this[this.t++] = 0),\n\t\t\t\t\t++this[t]\n\t\t\t}\n\t\t}\n\n\t\tfunction Mt() {}\n\n\t\tfunction Vt(e) {\n\t\t\treturn e\n\t\t}\n\n\t\tfunction $t(e, t, n) {\n\t\t\te.multiplyTo(t, n)\n\t\t}\n\n\t\tfunction Ot(e, t) {\n\t\t\te.squareTo(t)\n\t\t}\n\n\t\tfunction Ut(e) {\n\t\t\treturn this.exp(e, new Mt)\n\t\t}\n\n\t\tfunction Nt(e, t, n) {\n\t\t\tvar i = Math.min(this.t + e.t, t);\n\t\t\tfor (n.s = 0,\n\t\t\t\tn.t = i; i > 0;)\n\t\t\t\tn[--i] = 0;\n\t\t\tvar s;\n\t\t\tfor (s = n.t - this.t; s > i; ++i)\n\t\t\t\tn[i + this.t] = this.am(0, e[i], n, i, 0, this.t);\n\t\t\tfor (s = Math.min(e.t, t); s > i; ++i)\n\t\t\t\tthis.am(0, e[i], n, i, 0, t - i);\n\t\t\tn.clamp()\n\t\t}\n\n\t\tfunction qt(e, t, n) {\n\t\t\t--t;\n\t\t\tvar i = n.t = this.t + e.t - t;\n\t\t\tfor (n.s = 0; --i >= 0;)\n\t\t\t\tn[i] = 0;\n\t\t\tfor (i = Math.max(t - this.t, 0); i < e.t; ++i)\n\t\t\t\tn[this.t + i - t] = this.am(t - i, e[i], n, 0, 0, this.t + i - t);\n\t\t\tn.clamp(),\n\t\t\t\tn.drShiftTo(1, n)\n\t\t}\n\n\t\tfunction Ht(e) {\n\t\t\tthis.r2 = n(),\n\t\t\t\tthis.q3 = n(),\n\t\t\t\tt.ONE.dlShiftTo(2 * e.t, this.r2),\n\t\t\t\tthis.mu = this.r2.divide(e),\n\t\t\t\tthis.m = e\n\t\t}\n\n\t\tfunction Ft(e) {\n\t\t\tif (e.s < 0 || e.t > 2 * this.m.t)\n\t\t\t\treturn e.mod(this.m);\n\t\t\tif (e.compareTo(this.m) < 0)\n\t\t\t\treturn e;\n\t\t\tvar t = n();\n\t\t\treturn e.copyTo(t),\n\t\t\t\tthis.reduce(t),\n\t\t\t\tt\n\t\t}\n\n\t\tfunction Wt(e) {\n\t\t\treturn e\n\t\t}\n\n\t\tfunction Kt(e) {\n\t\t\tfor (e.drShiftTo(this.m.t - 1, this.r2),\n\t\t\t\te.t > this.m.t + 1 && (e.t = this.m.t + 1,\n\t\t\t\t\te.clamp()),\n\t\t\t\tthis.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3),\n\t\t\t\tthis.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); e.compareTo(this.r2) < 0;)\n\t\t\t\te.dAddOffset(1, this.m.t + 1);\n\t\t\tfor (e.subTo(this.r2, e); e.compareTo(this.m) >= 0;)\n\t\t\t\te.subTo(this.m, e)\n\t\t}\n\n\t\tfunction jt(e, t) {\n\t\t\te.squareTo(t),\n\t\t\t\tthis.reduce(t)\n\t\t}\n\n\t\tfunction Jt(e, t, n) {\n\t\t\te.multiplyTo(t, n),\n\t\t\t\tthis.reduce(n)\n\t\t}\n\n\t\tfunction Gt(e, t) {\n\t\t\tvar i, s, o = e.bitLength(),\n\t\t\t\tr = d(1);\n\t\t\tif (0 >= o)\n\t\t\t\treturn r;\n\t\t\ti = 18 > o ? 1 : 48 > o ? 3 : 144 > o ? 4 : 768 > o ? 5 : 6,\n\t\t\t\ts = 8 > o ? new k(t) : t.isEven() ? new Ht(t) : new V(t);\n\t\t\tvar a = new Array,\n\t\t\t\tc = 3,\n\t\t\t\tl = i - 1,\n\t\t\t\tu = (1 << i) - 1;\n\t\t\tif (a[1] = s.convert(this),\n\t\t\t\ti > 1) {\n\t\t\t\tvar p = n();\n\t\t\t\tfor (s.sqrTo(a[1], p); u >= c;)\n\t\t\t\t\ta[c] = n(),\n\t\t\t\t\ts.mulTo(p, a[c - 2], a[c]),\n\t\t\t\t\tc += 2\n\t\t\t}\n\t\t\tvar g, h, m = e.t - 1,\n\t\t\t\tf = !0,\n\t\t\t\tv = n();\n\t\t\tfor (o = b(e[m]) - 1; m >= 0;) {\n\t\t\t\tfor (o >= l ? g = e[m] >> o - l & u : (g = (e[m] & (1 << o + 1) - 1) << l - o,\n\t\t\t\t\t\tm > 0 && (g |= e[m - 1] >> this.DB + o - l)),\n\t\t\t\t\tc = i; 0 == (1 & g);)\n\t\t\t\t\tg >>= 1,\n\t\t\t\t\t--c;\n\t\t\t\tif ((o -= c) < 0 && (o += this.DB,\n\t\t\t\t\t\t--m),\n\t\t\t\t\tf)\n\t\t\t\t\ta[g].copyTo(r),\n\t\t\t\t\tf = !1;\n\t\t\t\telse {\n\t\t\t\t\tfor (; c > 1;)\n\t\t\t\t\t\ts.sqrTo(r, v),\n\t\t\t\t\t\ts.sqrTo(v, r),\n\t\t\t\t\t\tc -= 2;\n\t\t\t\t\tc > 0 ? s.sqrTo(r, v) : (h = r,\n\t\t\t\t\t\t\tr = v,\n\t\t\t\t\t\t\tv = h),\n\t\t\t\t\t\ts.mulTo(v, a[g], r)\n\t\t\t\t}\n\t\t\t\tfor (; m >= 0 && 0 == (e[m] & 1 << o);)\n\t\t\t\t\ts.sqrTo(r, v),\n\t\t\t\t\th = r,\n\t\t\t\t\tr = v,\n\t\t\t\t\tv = h,\n\t\t\t\t\t--o < 0 && (o = this.DB - 1,\n\t\t\t\t\t\t--m)\n\t\t\t}\n\t\t\treturn s.revert(r)\n\t\t}\n\n\t\tfunction Qt(e) {\n\t\t\tvar t = this.s < 0 ? this.negate() : this.clone(),\n\t\t\t\tn = e.s < 0 ? e.negate() : e.clone();\n\t\t\tif (t.compareTo(n) < 0) {\n\t\t\t\tvar i = t;\n\t\t\t\tt = n,\n\t\t\t\t\tn = i\n\t\t\t}\n\t\t\tvar s = t.getLowestSetBit(),\n\t\t\t\to = n.getLowestSetBit();\n\t\t\tif (0 > o)\n\t\t\t\treturn t;\n\t\t\tfor (o > s && (o = s),\n\t\t\t\to > 0 && (t.rShiftTo(o, t),\n\t\t\t\t\tn.rShiftTo(o, n)); t.signum() > 0;)\n\t\t\t\t(s = t.getLowestSetBit()) > 0 && t.rShiftTo(s, t),\n\t\t\t\t(s = n.getLowestSetBit()) > 0 && n.rShiftTo(s, n),\n\t\t\t\tt.compareTo(n) >= 0 ? (t.subTo(n, t),\n\t\t\t\t\tt.rShiftTo(1, t)) : (n.subTo(t, n),\n\t\t\t\t\tn.rShiftTo(1, n));\n\t\t\treturn o > 0 && n.lShiftTo(o, n),\n\t\t\t\tn\n\t\t}\n\n\t\tfunction zt(e) {\n\t\t\tif (0 >= e)\n\t\t\t\treturn 0;\n\t\t\tvar t = this.DV % e,\n\t\t\t\tn = this.s < 0 ? e - 1 : 0;\n\t\t\tif (this.t > 0)\n\t\t\t\tif (0 == t)\n\t\t\t\t\tn = this[0] % e;\n\t\t\t\telse\n\t\t\t\t\tfor (var i = this.t - 1; i >= 0; --i)\n\t\t\t\t\t\tn = (t * n + this[i]) % e;\n\t\t\treturn n\n\t\t}\n\n\t\tfunction Zt(e) {\n\t\t\tvar n = e.isEven();\n\t\t\tif (this.isEven() && n || 0 == e.signum())\n\t\t\t\treturn t.ZERO;\n\t\t\tfor (var i = e.clone(), s = this.clone(), o = d(1), r = d(0), a = d(0), c = d(1); 0 != i.signum();) {\n\t\t\t\tfor (; i.isEven();)\n\t\t\t\t\ti.rShiftTo(1, i),\n\t\t\t\t\tn ? (o.isEven() && r.isEven() || (o.addTo(this, o),\n\t\t\t\t\t\t\tr.subTo(e, r)),\n\t\t\t\t\t\to.rShiftTo(1, o)) : r.isEven() || r.subTo(e, r),\n\t\t\t\t\tr.rShiftTo(1, r);\n\t\t\t\tfor (; s.isEven();)\n\t\t\t\t\ts.rShiftTo(1, s),\n\t\t\t\t\tn ? (a.isEven() && c.isEven() || (a.addTo(this, a),\n\t\t\t\t\t\t\tc.subTo(e, c)),\n\t\t\t\t\t\ta.rShiftTo(1, a)) : c.isEven() || c.subTo(e, c),\n\t\t\t\t\tc.rShiftTo(1, c);\n\t\t\t\ti.compareTo(s) >= 0 ? (i.subTo(s, i),\n\t\t\t\t\tn && o.subTo(a, o),\n\t\t\t\t\tr.subTo(c, r)) : (s.subTo(i, s),\n\t\t\t\t\tn && a.subTo(o, a),\n\t\t\t\t\tc.subTo(r, c))\n\t\t\t}\n\t\t\treturn 0 != s.compareTo(t.ONE) ? t.ZERO : c.compareTo(e) >= 0 ? c.subtract(e) : c.signum() < 0 ? (c.addTo(e, c),\n\t\t\t\tc.signum() < 0 ? c.add(e) : c) : c\n\t\t}\n\n\t\tfunction Yt(e) {\n\t\t\tvar t, n = this.abs();\n\t\t\tif (1 == n.t && n[0] <= Pn[Pn.length - 1]) {\n\t\t\t\tfor (t = 0; t < Pn.length; ++t)\n\t\t\t\t\tif (n[0] == Pn[t])\n\t\t\t\t\t\treturn !0;\n\t\t\t\treturn !1\n\t\t\t}\n\t\t\tif (n.isEven())\n\t\t\t\treturn !1;\n\t\t\tfor (t = 1; t < Pn.length;) {\n\t\t\t\tfor (var i = Pn[t], s = t + 1; s < Pn.length && An > i;)\n\t\t\t\t\ti *= Pn[s++];\n\t\t\t\tfor (i = n.modInt(i); s > t;)\n\t\t\t\t\tif (i % Pn[t++] == 0)\n\t\t\t\t\t\treturn !1\n\t\t\t}\n\t\t\treturn n.millerRabin(e)\n\t\t}\n\n\t\tfunction Xt(e) {\n\t\t\tvar i = this.subtract(t.ONE),\n\t\t\t\ts = i.getLowestSetBit();\n\t\t\tif (0 >= s)\n\t\t\t\treturn !1;\n\t\t\tvar o = i.shiftRight(s);\n\t\t\te = e + 1 >> 1,\n\t\t\t\te > Pn.length && (e = Pn.length);\n\t\t\tfor (var r = n(), a = 0; e > a; ++a) {\n\t\t\t\tr.fromInt(Pn[Math.floor(Math.random() * Pn.length)]);\n\t\t\t\tvar c = r.modPow(o, this);\n\t\t\t\tif (0 != c.compareTo(t.ONE) && 0 != c.compareTo(i)) {\n\t\t\t\t\tfor (var l = 1; l++ < s && 0 != c.compareTo(i);)\n\t\t\t\t\t\tif (c = c.modPowInt(2, this),\n\t\t\t\t\t\t\t0 == c.compareTo(t.ONE))\n\t\t\t\t\t\t\treturn !1;\n\t\t\t\t\tif (0 != c.compareTo(i))\n\t\t\t\t\t\treturn !1\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !0\n\t\t}\n\n\t\tfunction en() {\n\t\t\tthis.i = 0,\n\t\t\t\tthis.j = 0,\n\t\t\t\tthis.S = new Array\n\t\t}\n\n\t\tfunction tn(e) {\n\t\t\tvar t, n, i;\n\t\t\tfor (t = 0; 256 > t; ++t)\n\t\t\t\tthis.S[t] = t;\n\t\t\tfor (n = 0,\n\t\t\t\tt = 0; 256 > t; ++t)\n\t\t\t\tn = n + this.S[t] + e[t % e.length] & 255,\n\t\t\t\ti = this.S[t],\n\t\t\t\tthis.S[t] = this.S[n],\n\t\t\t\tthis.S[n] = i;\n\t\t\tthis.i = 0,\n\t\t\t\tthis.j = 0\n\t\t}\n\n\t\tfunction nn() {\n\t\t\tvar e;\n\t\t\treturn this.i = this.i + 1 & 255,\n\t\t\t\tthis.j = this.j + this.S[this.i] & 255,\n\t\t\t\te = this.S[this.i],\n\t\t\t\tthis.S[this.i] = this.S[this.j],\n\t\t\t\tthis.S[this.j] = e,\n\t\t\t\tthis.S[e + this.S[this.i] & 255]\n\t\t}\n\n\t\tfunction sn() {\n\t\t\treturn new en\n\t\t}\n\n\t\tfunction on(e) {\n\t\t\tMn[Vn++] ^= 255 & e,\n\t\t\t\tMn[Vn++] ^= e >> 8 & 255,\n\t\t\t\tMn[Vn++] ^= e >> 16 & 255,\n\t\t\t\tMn[Vn++] ^= e >> 24 & 255,\n\t\t\t\tVn >= $n && (Vn -= $n)\n\t\t}\n\n\t\tfunction rn() {\n\t\t\ton((new Date).getTime())\n\t\t}\n\n\t\tfunction an() {\n\t\t\tif (null == Bn) {\n\t\t\t\tfor (rn(),\n\t\t\t\t\tBn = sn(),\n\t\t\t\t\tBn.init(Mn),\n\t\t\t\t\tVn = 0; Vn < Mn.length; ++Vn)\n\t\t\t\t\tMn[Vn] = 0;\n\t\t\t\tVn = 0\n\t\t\t}\n\t\t\treturn Bn.next()\n\t\t}\n\n\t\tfunction cn(e) {\n\t\t\tvar t;\n\t\t\tfor (t = 0; t < e.length; ++t)\n\t\t\t\te[t] = an()\n\t\t}\n\n\t\tfunction ln() {}\n\n\t\tfunction dn(e, n) {\n\t\t\treturn new t(e, n)\n\t\t}\n\n\t\tfunction un(e, n) {\n\t\t\tif (n < e.length + 11)\n\t\t\t\treturn console.error(\"Message too long for RSA\"),\n\t\t\t\t\tnull;\n\t\t\tfor (var i = new Array, s = e.length - 1; s >= 0 && n > 0;) {\n\t\t\t\tvar o = e.charCodeAt(s--);\n\t\t\t\t128 > o ? i[--n] = o : o > 127 && 2048 > o ? (i[--n] = 63 & o | 128,\n\t\t\t\t\ti[--n] = o >> 6 | 192) : (i[--n] = 63 & o | 128,\n\t\t\t\t\ti[--n] = o >> 6 & 63 | 128,\n\t\t\t\t\ti[--n] = o >> 12 | 224)\n\t\t\t}\n\t\t\ti[--n] = 0;\n\t\t\tfor (var r = new ln, a = new Array; n > 2;) {\n\t\t\t\tfor (a[0] = 0; 0 == a[0];)\n\t\t\t\t\tr.nextBytes(a);\n\t\t\t\ti[--n] = a[0]\n\t\t\t}\n\t\t\treturn i[--n] = 2,\n\t\t\t\ti[--n] = 0,\n\t\t\t\tnew t(i)\n\t\t}\n\n\t\tfunction pn() {\n\t\t\tthis.n = null,\n\t\t\t\tthis.e = 0,\n\t\t\t\tthis.d = null,\n\t\t\t\tthis.p = null,\n\t\t\t\tthis.q = null,\n\t\t\t\tthis.dmp1 = null,\n\t\t\t\tthis.dmq1 = null,\n\t\t\t\tthis.coeff = null\n\t\t}\n\n\t\tfunction gn(e, t) {\n\t\t\tnull != e && null != t && e.length > 0 && t.length > 0 ? (this.n = dn(e, 16),\n\t\t\t\tthis.e = parseInt(t, 16)) : console.error(\"Invalid RSA public key\")\n\t\t}\n\n\t\tfunction hn(e) {\n\t\t\treturn e.modPowInt(this.e, this.n)\n\t\t}\n\n\t\tfunction mn(e) {\n\t\t\tvar t = un(e, this.n.bitLength() + 7 >> 3);\n\t\t\tif (null == t)\n\t\t\t\treturn null;\n\t\t\tvar n = this.doPublic(t);\n\t\t\tif (null == n)\n\t\t\t\treturn null;\n\t\t\tvar i = n.toString(16);\n\t\t\treturn 0 == (1 & i.length) ? i : \"0\" + i\n\t\t}\n\n\t\tfunction fn(e, t) {\n\t\t\tfor (var n = e.toByteArray(), i = 0; i < n.length && 0 == n[i];)\n\t\t\t\t++i;\n\t\t\tif (n.length - i != t - 1 || 2 != n[i])\n\t\t\t\treturn null;\n\t\t\tfor (++i; 0 != n[i];)\n\t\t\t\tif (++i >= n.length)\n\t\t\t\t\treturn null;\n\t\t\tfor (var s = \"\"; ++i < n.length;) {\n\t\t\t\tvar o = 255 & n[i];\n\t\t\t\t128 > o ? s += String.fromCharCode(o) : o > 191 && 224 > o ? (s += String.fromCharCode((31 & o) << 6 | 63 & n[i +\n\t\t\t\t\t\t1]),\n\t\t\t\t\t++i) : (s += String.fromCharCode((15 & o) << 12 | (63 & n[i + 1]) << 6 | 63 & n[i + 2]),\n\t\t\t\t\ti += 2)\n\t\t\t}\n\t\t\treturn s\n\t\t}\n\n\t\tfunction vn(e, t, n) {\n\t\t\tnull != e && null != t && e.length > 0 && t.length > 0 ? (this.n = dn(e, 16),\n\t\t\t\tthis.e = parseInt(t, 16),\n\t\t\t\tthis.d = dn(n, 16)) : console.error(\"Invalid RSA private key\")\n\t\t}\n\n\t\tfunction bn(e, t, n, i, s, o, r, a) {\n\t\t\tnull != e && null != t && e.length > 0 && t.length > 0 ? (this.n = dn(e, 16),\n\t\t\t\tthis.e = parseInt(t, 16),\n\t\t\t\tthis.d = dn(n, 16),\n\t\t\t\tthis.p = dn(i, 16),\n\t\t\t\tthis.q = dn(s, 16),\n\t\t\t\tthis.dmp1 = dn(o, 16),\n\t\t\t\tthis.dmq1 = dn(r, 16),\n\t\t\t\tthis.coeff = dn(a, 16)) : console.error(\"Invalid RSA private key\")\n\t\t}\n\n\t\tfunction yn(e, n) {\n\t\t\tvar i = new ln,\n\t\t\t\ts = e >> 1;\n\t\t\tthis.e = parseInt(n, 16);\n\t\t\tfor (var o = new t(n, 16);;) {\n\t\t\t\tfor (; this.p = new t(e - s, 1, i),\n\t\t\t\t\t0 != this.p.subtract(t.ONE).gcd(o).compareTo(t.ONE) || !this.p.isProbablePrime(10);)\n\t\t\t\t;\n\t\t\t\tfor (; this.q = new t(s, 1, i),\n\t\t\t\t\t0 != this.q.subtract(t.ONE).gcd(o).compareTo(t.ONE) || !this.q.isProbablePrime(10);)\n\t\t\t\t;\n\t\t\t\tif (this.p.compareTo(this.q) <= 0) {\n\t\t\t\t\tvar r = this.p;\n\t\t\t\t\tthis.p = this.q,\n\t\t\t\t\t\tthis.q = r\n\t\t\t\t}\n\t\t\t\tvar a = this.p.subtract(t.ONE),\n\t\t\t\t\tc = this.q.subtract(t.ONE),\n\t\t\t\t\tl = a.multiply(c);\n\t\t\t\tif (0 == l.gcd(o).compareTo(t.ONE)) {\n\t\t\t\t\tthis.n = this.p.multiply(this.q),\n\t\t\t\t\t\tthis.d = o.modInverse(l),\n\t\t\t\t\t\tthis.dmp1 = this.d.mod(a),\n\t\t\t\t\t\tthis.dmq1 = this.d.mod(c),\n\t\t\t\t\t\tthis.coeff = this.q.modInverse(this.p);\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction _n(e) {\n\t\t\tif (null == this.p || null == this.q)\n\t\t\t\treturn e.modPow(this.d, this.n);\n\t\t\tfor (var t = e.mod(this.p).modPow(this.dmp1, this.p), n = e.mod(this.q).modPow(this.dmq1, this.q); t.compareTo(n) <\n\t\t\t\t0;)\n\t\t\t\tt = t.add(this.p);\n\t\t\treturn t.subtract(n).multiply(this.coeff).mod(this.p).multiply(this.q).add(n)\n\t\t}\n\n\t\tfunction En(e) {\n\t\t\tvar t = dn(e, 16),\n\t\t\t\tn = this.doPrivate(t);\n\t\t\treturn null == n ? null : fn(n, this.n.bitLength() + 7 >> 3)\n\t\t}\n\n\t\tfunction wn(e) {\n\t\t\tvar t, n, i = \"\";\n\t\t\tfor (t = 0; t + 3 <= e.length; t += 3)\n\t\t\t\tn = parseInt(e.substring(t, t + 3), 16),\n\t\t\t\ti += Nn.charAt(n >> 6) + Nn.charAt(63 & n);\n\t\t\tfor (t + 1 == e.length ? (n = parseInt(e.substring(t, t + 1), 16),\n\t\t\t\t\ti += Nn.charAt(n << 2)) : t + 2 == e.length && (n = parseInt(e.substring(t, t + 2), 16),\n\t\t\t\t\ti += Nn.charAt(n >> 2) + Nn.charAt((3 & n) << 4));\n\t\t\t\t(3 & i.length) > 0;)\n\t\t\t\ti += qn;\n\t\t\treturn i\n\t\t}\n\n\t\tfunction Cn(e) {\n\t\t\tvar t, n, i = \"\",\n\t\t\t\ts = 0;\n\t\t\tfor (t = 0; t < e.length && e.charAt(t) != qn; ++t)\n\t\t\t\tv = Nn.indexOf(e.charAt(t)),\n\t\t\t\t0 > v || (0 == s ? (i += r(v >> 2),\n\t\t\t\t\tn = 3 & v,\n\t\t\t\t\ts = 1) : 1 == s ? (i += r(n << 2 | v >> 4),\n\t\t\t\t\tn = 15 & v,\n\t\t\t\t\ts = 2) : 2 == s ? (i += r(n),\n\t\t\t\t\ti += r(v >> 2),\n\t\t\t\t\tn = 3 & v,\n\t\t\t\t\ts = 3) : (i += r(n << 2 | v >> 4),\n\t\t\t\t\ti += r(15 & v),\n\t\t\t\t\ts = 0));\n\t\t\treturn 1 == s && (i += r(n << 2)),\n\t\t\t\ti\n\t\t}\n\t\tvar Sn, In = 0xdeadbeefcafe,\n\t\t\tTn = 15715070 == (16777215 & In);\n\t\tTn && \"Microsoft Internet Explorer\" == navigator.appName ? (t.prototype.am = s,\n\t\t\t\tSn = 30) : Tn && \"Netscape\" != navigator.appName ? (t.prototype.am = i,\n\t\t\t\tSn = 26) : (t.prototype.am = o,\n\t\t\t\tSn = 28),\n\t\t\tt.prototype.DB = Sn,\n\t\t\tt.prototype.DM = (1 << Sn) - 1,\n\t\t\tt.prototype.DV = 1 << Sn;\n\t\tvar Dn = 52;\n\t\tt.prototype.FV = Math.pow(2, Dn),\n\t\t\tt.prototype.F1 = Dn - Sn,\n\t\t\tt.prototype.F2 = 2 * Sn - Dn;\n\t\tvar Rn, kn, xn = \"0123456789abcdefghijklmnopqrstuvwxyz\",\n\t\t\tLn = new Array;\n\t\tfor (Rn = \"0\".charCodeAt(0),\n\t\t\tkn = 0; 9 >= kn; ++kn)\n\t\t\tLn[Rn++] = kn;\n\t\tfor (Rn = \"a\".charCodeAt(0),\n\t\t\tkn = 10; 36 > kn; ++kn)\n\t\t\tLn[Rn++] = kn;\n\t\tfor (Rn = \"A\".charCodeAt(0),\n\t\t\tkn = 10; 36 > kn; ++kn)\n\t\t\tLn[Rn++] = kn;\n\t\tk.prototype.convert = x,\n\t\t\tk.prototype.revert = L,\n\t\t\tk.prototype.reduce = P,\n\t\t\tk.prototype.mulTo = A,\n\t\t\tk.prototype.sqrTo = B,\n\t\t\tV.prototype.convert = $,\n\t\t\tV.prototype.revert = O,\n\t\t\tV.prototype.reduce = U,\n\t\t\tV.prototype.mulTo = q,\n\t\t\tV.prototype.sqrTo = N,\n\t\t\tt.prototype.copyTo = c,\n\t\t\tt.prototype.fromInt = l,\n\t\t\tt.prototype.fromString = u,\n\t\t\tt.prototype.clamp = p,\n\t\t\tt.prototype.dlShiftTo = _,\n\t\t\tt.prototype.drShiftTo = E,\n\t\t\tt.prototype.lShiftTo = w,\n\t\t\tt.prototype.rShiftTo = C,\n\t\t\tt.prototype.subTo = S,\n\t\t\tt.prototype.multiplyTo = I,\n\t\t\tt.prototype.squareTo = T,\n\t\t\tt.prototype.divRemTo = D,\n\t\t\tt.prototype.invDigit = M,\n\t\t\tt.prototype.isEven = H,\n\t\t\tt.prototype.exp = F,\n\t\t\tt.prototype.toString = g,\n\t\t\tt.prototype.negate = h,\n\t\t\tt.prototype.abs = m,\n\t\t\tt.prototype.compareTo = f,\n\t\t\tt.prototype.bitLength = y,\n\t\t\tt.prototype.mod = R,\n\t\t\tt.prototype.modPowInt = W,\n\t\t\tt.ZERO = d(0),\n\t\t\tt.ONE = d(1),\n\t\t\tMt.prototype.convert = Vt,\n\t\t\tMt.prototype.revert = Vt,\n\t\t\tMt.prototype.mulTo = $t,\n\t\t\tMt.prototype.sqrTo = Ot,\n\t\t\tHt.prototype.convert = Ft,\n\t\t\tHt.prototype.revert = Wt,\n\t\t\tHt.prototype.reduce = Kt,\n\t\t\tHt.prototype.mulTo = Jt,\n\t\t\tHt.prototype.sqrTo = jt;\n\t\tvar Pn = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103,\n\t\t\t\t107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229,\n\t\t\t\t233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367,\n\t\t\t\t373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,\n\t\t\t\t509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653,\n\t\t\t\t659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821,\n\t\t\t\t823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977,\n\t\t\t\t983, 991, 997\n\t\t\t],\n\t\t\tAn = (1 << 26) / Pn[Pn.length - 1];\n\t\tt.prototype.chunkSize = Q,\n\t\t\tt.prototype.toRadix = Z,\n\t\t\tt.prototype.fromRadix = Y,\n\t\t\tt.prototype.fromNumber = X,\n\t\t\tt.prototype.bitwiseTo = st,\n\t\t\tt.prototype.changeBit = Et,\n\t\t\tt.prototype.addTo = It,\n\t\t\tt.prototype.dMultiply = At,\n\t\t\tt.prototype.dAddOffset = Bt,\n\t\t\tt.prototype.multiplyLowerTo = Nt,\n\t\t\tt.prototype.multiplyUpperTo = qt,\n\t\t\tt.prototype.modInt = zt,\n\t\t\tt.prototype.millerRabin = Xt,\n\t\t\tt.prototype.clone = K,\n\t\t\tt.prototype.intValue = j,\n\t\t\tt.prototype.byteValue = J,\n\t\t\tt.prototype.shortValue = G,\n\t\t\tt.prototype.signum = z,\n\t\t\tt.prototype.toByteArray = et,\n\t\t\tt.prototype.equals = tt,\n\t\t\tt.prototype.min = nt,\n\t\t\tt.prototype.max = it,\n\t\t\tt.prototype.and = rt,\n\t\t\tt.prototype.or = ct,\n\t\t\tt.prototype.xor = dt,\n\t\t\tt.prototype.andNot = pt,\n\t\t\tt.prototype.not = gt,\n\t\t\tt.prototype.shiftLeft = ht,\n\t\t\tt.prototype.shiftRight = mt,\n\t\t\tt.prototype.getLowestSetBit = vt,\n\t\t\tt.prototype.bitCount = yt,\n\t\t\tt.prototype.testBit = _t,\n\t\t\tt.prototype.setBit = wt,\n\t\t\tt.prototype.clearBit = Ct,\n\t\t\tt.prototype.flipBit = St,\n\t\t\tt.prototype.add = Tt,\n\t\t\tt.prototype.subtract = Dt,\n\t\t\tt.prototype.multiply = Rt,\n\t\t\tt.prototype.divide = xt,\n\t\t\tt.prototype.remainder = Lt,\n\t\t\tt.prototype.divideAndRemainder = Pt,\n\t\t\tt.prototype.modPow = Gt,\n\t\t\tt.prototype.modInverse = Zt,\n\t\t\tt.prototype.pow = Ut,\n\t\t\tt.prototype.gcd = Qt,\n\t\t\tt.prototype.isProbablePrime = Yt,\n\t\t\tt.prototype.square = kt,\n\t\t\ten.prototype.init = tn,\n\t\t\ten.prototype.next = nn;\n\t\tvar Bn, Mn, Vn, $n = 256;\n\t\tif (null == Mn) {\n\t\t\tMn = new Array,\n\t\t\t\tVn = 0;\n\t\t\tvar On;\n\t\t\tif (\"Netscape\" == navigator.appName && navigator.appVersion < \"5\" && window.crypto) {\n\t\t\t\tvar Un = window.crypto.random(32);\n\t\t\t\tfor (On = 0; On < Un.length; ++On)\n\t\t\t\t\tMn[Vn++] = 255 & Un.charCodeAt(On)\n\t\t\t}\n\t\t\tfor (; $n > Vn;)\n\t\t\t\tOn = Math.floor(65536 * Math.random()),\n\t\t\t\tMn[Vn++] = On >>> 8,\n\t\t\t\tMn[Vn++] = 255 & On;\n\t\t\tVn = 0,\n\t\t\t\trn()\n\t\t}\n\t\tln.prototype.nextBytes = cn,\n\t\t\tpn.prototype.doPublic = hn,\n\t\t\tpn.prototype.setPublic = gn,\n\t\t\tpn.prototype.encrypt = mn,\n\t\t\tpn.prototype.doPrivate = _n,\n\t\t\tpn.prototype.setPrivate = vn,\n\t\t\tpn.prototype.setPrivateEx = bn,\n\t\t\tpn.prototype.generate = yn,\n\t\t\tpn.prototype.decrypt = En,\n\t\t\tfunction() {\n\t\t\t\tvar e = function(e, i, s) {\n\t\t\t\t\tvar o = new ln,\n\t\t\t\t\t\tr = e >> 1;\n\t\t\t\t\tthis.e = parseInt(i, 16);\n\t\t\t\t\tvar a = new t(i, 16),\n\t\t\t\t\t\tc = this,\n\t\t\t\t\t\tl = function() {\n\t\t\t\t\t\t\tvar i = function() {\n\t\t\t\t\t\t\t\t\tif (c.p.compareTo(c.q) <= 0) {\n\t\t\t\t\t\t\t\t\t\tvar e = c.p;\n\t\t\t\t\t\t\t\t\t\tc.p = c.q,\n\t\t\t\t\t\t\t\t\t\t\tc.q = e\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tvar n = c.p.subtract(t.ONE),\n\t\t\t\t\t\t\t\t\t\ti = c.q.subtract(t.ONE),\n\t\t\t\t\t\t\t\t\t\to = n.multiply(i);\n\t\t\t\t\t\t\t\t\t0 == o.gcd(a).compareTo(t.ONE) ? (c.n = c.p.multiply(c.q),\n\t\t\t\t\t\t\t\t\t\tc.d = a.modInverse(o),\n\t\t\t\t\t\t\t\t\t\tc.dmp1 = c.d.mod(n),\n\t\t\t\t\t\t\t\t\t\tc.dmq1 = c.d.mod(i),\n\t\t\t\t\t\t\t\t\t\tc.coeff = c.q.modInverse(c.p),\n\t\t\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\t\t\ts()\n\t\t\t\t\t\t\t\t\t\t}, 0)) : setTimeout(l, 0)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\td = function() {\n\t\t\t\t\t\t\t\t\tc.q = n(),\n\t\t\t\t\t\t\t\t\t\tc.q.fromNumberAsync(r, 1, o, function() {\n\t\t\t\t\t\t\t\t\t\t\tc.q.subtract(t.ONE).gcda(a, function(e) {\n\t\t\t\t\t\t\t\t\t\t\t\t0 == e.compareTo(t.ONE) && c.q.isProbablePrime(10) ? setTimeout(i, 0) : setTimeout(d, 0)\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tu = function() {\n\t\t\t\t\t\t\t\t\tc.p = n(),\n\t\t\t\t\t\t\t\t\t\tc.p.fromNumberAsync(e - r, 1, o, function() {\n\t\t\t\t\t\t\t\t\t\t\tc.p.subtract(t.ONE).gcda(a, function(e) {\n\t\t\t\t\t\t\t\t\t\t\t\t0 == e.compareTo(t.ONE) && c.p.isProbablePrime(10) ? setTimeout(d, 0) : setTimeout(u, 0)\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsetTimeout(u, 0)\n\t\t\t\t\t\t};\n\t\t\t\t\tsetTimeout(l, 0)\n\t\t\t\t};\n\t\t\t\tpn.prototype.generateAsync = e;\n\t\t\t\tvar i = function(e, t) {\n\t\t\t\t\tvar n = this.s < 0 ? this.negate() : this.clone(),\n\t\t\t\t\t\ti = e.s < 0 ? e.negate() : e.clone();\n\t\t\t\t\tif (n.compareTo(i) < 0) {\n\t\t\t\t\t\tvar s = n;\n\t\t\t\t\t\tn = i,\n\t\t\t\t\t\t\ti = s\n\t\t\t\t\t}\n\t\t\t\t\tvar o = n.getLowestSetBit(),\n\t\t\t\t\t\tr = i.getLowestSetBit();\n\t\t\t\t\tif (0 > r)\n\t\t\t\t\t\treturn void t(n);\n\t\t\t\t\tr > o && (r = o),\n\t\t\t\t\t\tr > 0 && (n.rShiftTo(r, n),\n\t\t\t\t\t\t\ti.rShiftTo(r, i));\n\t\t\t\t\tvar a = function() {\n\t\t\t\t\t\t(o = n.getLowestSetBit()) > 0 && n.rShiftTo(o, n),\n\t\t\t\t\t\t\t(o = i.getLowestSetBit()) > 0 && i.rShiftTo(o, i),\n\t\t\t\t\t\t\tn.compareTo(i) >= 0 ? (n.subTo(i, n),\n\t\t\t\t\t\t\t\tn.rShiftTo(1, n)) : (i.subTo(n, i),\n\t\t\t\t\t\t\t\ti.rShiftTo(1, i)),\n\t\t\t\t\t\t\tn.signum() > 0 ? setTimeout(a, 0) : (r > 0 && i.lShiftTo(r, i),\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tt(i)\n\t\t\t\t\t\t\t\t}, 0))\n\t\t\t\t\t};\n\t\t\t\t\tsetTimeout(a, 10)\n\t\t\t\t};\n\t\t\t\tt.prototype.gcda = i;\n\t\t\t\tvar s = function(e, n, i, s) {\n\t\t\t\t\tif (\"number\" == typeof n)\n\t\t\t\t\t\tif (2 > e)\n\t\t\t\t\t\t\tthis.fromInt(1);\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.fromNumber(e, i),\n\t\t\t\t\t\t\t\tthis.testBit(e - 1) || this.bitwiseTo(t.ONE.shiftLeft(e - 1), at, this),\n\t\t\t\t\t\t\t\tthis.isEven() && this.dAddOffset(1, 0);\n\t\t\t\t\t\t\tvar o = this,\n\t\t\t\t\t\t\t\tr = function() {\n\t\t\t\t\t\t\t\t\to.dAddOffset(2, 0),\n\t\t\t\t\t\t\t\t\t\to.bitLength() > e && o.subTo(t.ONE.shiftLeft(e - 1), o),\n\t\t\t\t\t\t\t\t\t\to.isProbablePrime(n) ? setTimeout(function() {\n\t\t\t\t\t\t\t\t\t\t\ts()\n\t\t\t\t\t\t\t\t\t\t}, 0) : setTimeout(r, 0)\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsetTimeout(r, 0)\n\t\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar a = new Array,\n\t\t\t\t\t\t\tc = 7 & e;\n\t\t\t\t\t\ta.length = (e >> 3) + 1,\n\t\t\t\t\t\t\tn.nextBytes(a),\n\t\t\t\t\t\t\tc > 0 ? a[0] &= (1 << c) - 1 : a[0] = 0,\n\t\t\t\t\t\t\tthis.fromString(a, 256)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tt.prototype.fromNumberAsync = s\n\t\t\t}();\n\t\tvar Nn = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n\t\t\tqn = \"=\",\n\t\t\tHn = Hn || {};\n\t\tHn.env = Hn.env || {};\n\t\tvar Fn = Hn,\n\t\t\tWn = Object.prototype,\n\t\t\tKn = \"[object Function]\",\n\t\t\tjn = [\"toString\", \"valueOf\"];\n\t\tHn.env.parseUA = function(e) {\n\t\t\t\tvar t, n = function(e) {\n\t\t\t\t\t\tvar t = 0;\n\t\t\t\t\t\treturn parseFloat(e.replace(/\\./g, function() {\n\t\t\t\t\t\t\treturn 1 == t++ ? \"\" : \".\"\n\t\t\t\t\t\t}))\n\t\t\t\t\t},\n\t\t\t\t\ti = navigator,\n\t\t\t\t\ts = {\n\t\t\t\t\t\tie: 0,\n\t\t\t\t\t\topera: 0,\n\t\t\t\t\t\tgecko: 0,\n\t\t\t\t\t\twebkit: 0,\n\t\t\t\t\t\tchrome: 0,\n\t\t\t\t\t\tmobile: null,\n\t\t\t\t\t\tair: 0,\n\t\t\t\t\t\tipad: 0,\n\t\t\t\t\t\tiphone: 0,\n\t\t\t\t\t\tipod: 0,\n\t\t\t\t\t\tios: null,\n\t\t\t\t\t\tandroid: 0,\n\t\t\t\t\t\twebos: 0,\n\t\t\t\t\t\tcaja: i && i.cajaVersion,\n\t\t\t\t\t\tsecure: !1,\n\t\t\t\t\t\tos: null\n\t\t\t\t\t},\n\t\t\t\t\to = e || navigator && navigator.userAgent,\n\t\t\t\t\tr = window && window.location,\n\t\t\t\t\ta = r && r.href;\n\t\t\t\treturn s.secure = a && 0 === a.toLowerCase().indexOf(\"https\"),\n\t\t\t\t\to && (/windows|win32/i.test(o) ? s.os = \"windows\" : /macintosh/i.test(o) ? s.os = \"macintosh\" : /rhino/i.test(o) &&\n\t\t\t\t\t\t(s.os = \"rhino\"),\n\t\t\t\t\t\t/KHTML/.test(o) && (s.webkit = 1),\n\t\t\t\t\t\tt = o.match(/AppleWebKit\\/([^\\s]*)/),\n\t\t\t\t\t\tt && t[1] && (s.webkit = n(t[1]),\n\t\t\t\t\t\t\t/ Mobile\\//.test(o) ? (s.mobile = \"Apple\",\n\t\t\t\t\t\t\t\tt = o.match(/OS ([^\\s]*)/),\n\t\t\t\t\t\t\t\tt && t[1] && (t = n(t[1].replace(\"_\", \".\"))),\n\t\t\t\t\t\t\t\ts.ios = t,\n\t\t\t\t\t\t\t\ts.ipad = s.ipod = s.iphone = 0,\n\t\t\t\t\t\t\t\tt = o.match(/iPad|iPod|iPhone/),\n\t\t\t\t\t\t\t\tt && t[0] && (s[t[0].toLowerCase()] = s.ios)) : (t = o.match(/NokiaN[^\\/]*|Android \\d\\.\\d|webOS\\/\\d\\.\\d/),\n\t\t\t\t\t\t\t\tt && (s.mobile = t[0]),\n\t\t\t\t\t\t\t\t/webOS/.test(o) && (s.mobile = \"WebOS\",\n\t\t\t\t\t\t\t\t\tt = o.match(/webOS\\/([^\\s]*);/),\n\t\t\t\t\t\t\t\t\tt && t[1] && (s.webos = n(t[1]))),\n\t\t\t\t\t\t\t\t/ Android/.test(o) && (s.mobile = \"Android\",\n\t\t\t\t\t\t\t\t\tt = o.match(/Android ([^\\s]*);/),\n\t\t\t\t\t\t\t\t\tt && t[1] && (s.android = n(t[1])))),\n\t\t\t\t\t\t\tt = o.match(/Chrome\\/([^\\s]*)/),\n\t\t\t\t\t\t\tt && t[1] ? s.chrome = n(t[1]) : (t = o.match(/AdobeAIR\\/([^\\s]*)/),\n\t\t\t\t\t\t\t\tt && (s.air = t[0]))),\n\t\t\t\t\t\ts.webkit || (t = o.match(/Opera[\\s\\/]([^\\s]*)/),\n\t\t\t\t\t\t\tt && t[1] ? (s.opera = n(t[1]),\n\t\t\t\t\t\t\t\tt = o.match(/Version\\/([^\\s]*)/),\n\t\t\t\t\t\t\t\tt && t[1] && (s.opera = n(t[1])),\n\t\t\t\t\t\t\t\tt = o.match(/Opera Mini[^;]*/),\n\t\t\t\t\t\t\t\tt && (s.mobile = t[0])) : (t = o.match(/MSIE\\s([^;]*)/),\n\t\t\t\t\t\t\t\tt && t[1] ? s.ie = n(t[1]) : (t = o.match(/Gecko\\/([^\\s]*)/),\n\t\t\t\t\t\t\t\t\tt && (s.gecko = 1,\n\t\t\t\t\t\t\t\t\t\tt = o.match(/rv:([^\\s\\)]*)/),\n\t\t\t\t\t\t\t\t\t\tt && t[1] && (s.gecko = n(t[1]))))))),\n\t\t\t\t\ts\n\t\t\t},\n\t\t\tHn.env.ua = Hn.env.parseUA(),\n\t\t\tHn.isFunction = function(e) {\n\t\t\t\treturn \"function\" == typeof e || Wn.toString.apply(e) === Kn\n\t\t\t},\n\t\t\tHn._IEEnumFix = Hn.env.ua.ie ? function(e, t) {\n\t\t\t\tvar n, i, s;\n\t\t\t\tfor (n = 0; n < jn.length; n += 1)\n\t\t\t\t\ti = jn[n],\n\t\t\t\t\ts = t[i],\n\t\t\t\t\tFn.isFunction(s) && s != Wn[i] && (e[i] = s)\n\t\t\t} :\n\t\t\tfunction() {},\n\t\t\tHn.extend = function(e, t, n) {\n\t\t\t\tif (!t || !e)\n\t\t\t\t\tthrow new Error(\"extend failed, please check that all dependencies are included.\");\n\t\t\t\tvar i, s = function() {};\n\t\t\t\tif (s.prototype = t.prototype,\n\t\t\t\t\te.prototype = new s,\n\t\t\t\t\te.prototype.constructor = e,\n\t\t\t\t\te.superclass = t.prototype,\n\t\t\t\t\tt.prototype.constructor == Wn.constructor && (t.prototype.constructor = t),\n\t\t\t\t\tn) {\n\t\t\t\t\tfor (i in n)\n\t\t\t\t\t\tFn.hasOwnProperty(n, i) && (e.prototype[i] = n[i]);\n\t\t\t\t\tFn._IEEnumFix(e.prototype, n)\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"undefined\" != typeof KJUR && KJUR || (KJUR = {}),\n\t\t\t\"undefined\" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}),\n\t\t\tKJUR.asn1.ASN1Util = new function() {\n\t\t\t\tthis.integerToByteHex = function(e) {\n\t\t\t\t\t\tvar t = e.toString(16);\n\t\t\t\t\t\treturn t.length % 2 == 1 && (t = \"0\" + t),\n\t\t\t\t\t\t\tt\n\t\t\t\t\t},\n\t\t\t\t\tthis.bigIntToMinTwosComplementsHex = function(e) {\n\t\t\t\t\t\tvar n = e.toString(16);\n\t\t\t\t\t\tif (\"-\" != n.substr(0, 1))\n\t\t\t\t\t\t\tn.length % 2 == 1 ? n = \"0\" + n : n.match(/^[0-7]/) || (n = \"00\" + n);\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar i = n.substr(1),\n\t\t\t\t\t\t\t\ts = i.length;\n\t\t\t\t\t\t\ts % 2 == 1 ? s += 1 : n.match(/^[0-7]/) || (s += 2);\n\t\t\t\t\t\t\tfor (var o = \"\", r = 0; s > r; r++)\n\t\t\t\t\t\t\t\to += \"f\";\n\t\t\t\t\t\t\tvar a = new t(o, 16),\n\t\t\t\t\t\t\t\tc = a.xor(e).add(t.ONE);\n\t\t\t\t\t\t\tn = c.toString(16).replace(/^-/, \"\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tthis.getPEMStringFromHex = function(e, t) {\n\t\t\t\t\t\tvar n = CryptoJS.enc.Hex.parse(e),\n\t\t\t\t\t\t\ti = CryptoJS.enc.Base64.stringify(n),\n\t\t\t\t\t\t\ts = i.replace(/(.{64})/g, \"$1\\r\\n\");\n\t\t\t\t\t\treturn s = s.replace(/\\r\\n$/, \"\"),\n\t\t\t\t\t\t\t\"-----BEGIN \" + t + \"-----\\r\\n\" + s + \"\\r\\n-----END \" + t + \"-----\\r\\n\"\n\t\t\t\t\t}\n\t\t\t},\n\t\t\tKJUR.asn1.ASN1Object = function() {\n\t\t\t\tvar e = \"\";\n\t\t\t\tthis.getLengthHexFromValue = function() {\n\t\t\t\t\t\tif (\"undefined\" == typeof this.hV || null == this.hV)\n\t\t\t\t\t\t\tthrow \"this.hV is null or undefined.\";\n\t\t\t\t\t\tif (this.hV.length % 2 == 1)\n\t\t\t\t\t\t\tthrow \"value hex must be even length: n=\" + e.length + \",v=\" + this.hV;\n\t\t\t\t\t\tvar t = this.hV.length / 2,\n\t\t\t\t\t\t\tn = t.toString(16);\n\t\t\t\t\t\tif (n.length % 2 == 1 && (n = \"0\" + n),\n\t\t\t\t\t\t\t128 > t)\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\tvar i = n.length / 2;\n\t\t\t\t\t\tif (i > 15)\n\t\t\t\t\t\t\tthrow \"ASN.1 length too long to represent by 8x: n = \" + t.toString(16);\n\t\t\t\t\t\tvar s = 128 + i;\n\t\t\t\t\t\treturn s.toString(16) + n\n\t\t\t\t\t},\n\t\t\t\t\tthis.getEncodedHex = function() {\n\t\t\t\t\t\treturn (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(),\n\t\t\t\t\t\t\t\tthis.hL = this.getLengthHexFromValue(),\n\t\t\t\t\t\t\t\tthis.hTLV = this.hT + this.hL + this.hV,\n\t\t\t\t\t\t\t\tthis.isModified = !1),\n\t\t\t\t\t\t\tthis.hTLV\n\t\t\t\t\t},\n\t\t\t\t\tthis.getValueHex = function() {\n\t\t\t\t\t\treturn this.getEncodedHex(),\n\t\t\t\t\t\t\tthis.hV\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn \"\"\n\t\t\t\t\t}\n\t\t\t},\n\t\t\tKJUR.asn1.DERAbstractString = function(e) {\n\t\t\t\tKJUR.asn1.DERAbstractString.superclass.constructor.call(this),\n\t\t\t\t\tthis.getString = function() {\n\t\t\t\t\t\treturn this.s\n\t\t\t\t\t},\n\t\t\t\t\tthis.setString = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.s = e,\n\t\t\t\t\t\t\tthis.hV = stohex(this.s)\n\t\t\t\t\t},\n\t\t\t\t\tthis.setStringHex = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.s = null,\n\t\t\t\t\t\t\tthis.hV = e\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn this.hV\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.str ? this.setString(e.str) : \"undefined\" != typeof e.hex &&\n\t\t\t\t\t\tthis.setStringHex(e.hex))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERAbstractTime = function() {\n\t\t\t\tKJUR.asn1.DERAbstractTime.superclass.constructor.call(this),\n\t\t\t\t\tthis.localDateToUTC = function(e) {\n\t\t\t\t\t\tutc = e.getTime() + 6e4 * e.getTimezoneOffset();\n\t\t\t\t\t\tvar t = new Date(utc);\n\t\t\t\t\t\treturn t\n\t\t\t\t\t},\n\t\t\t\t\tthis.formatDate = function(e, t) {\n\t\t\t\t\t\tvar n = this.zeroPadding,\n\t\t\t\t\t\t\ti = this.localDateToUTC(e),\n\t\t\t\t\t\t\ts = String(i.getFullYear());\n\t\t\t\t\t\t\"utc\" == t && (s = s.substr(2, 2));\n\t\t\t\t\t\tvar o = n(String(i.getMonth() + 1), 2),\n\t\t\t\t\t\t\tr = n(String(i.getDate()), 2),\n\t\t\t\t\t\t\ta = n(String(i.getHours()), 2),\n\t\t\t\t\t\t\tc = n(String(i.getMinutes()), 2),\n\t\t\t\t\t\t\tl = n(String(i.getSeconds()), 2);\n\t\t\t\t\t\treturn s + o + r + a + c + l + \"Z\"\n\t\t\t\t\t},\n\t\t\t\t\tthis.zeroPadding = function(e, t) {\n\t\t\t\t\t\treturn e.length >= t ? e : new Array(t - e.length + 1).join(\"0\") + e\n\t\t\t\t\t},\n\t\t\t\t\tthis.getString = function() {\n\t\t\t\t\t\treturn this.s\n\t\t\t\t\t},\n\t\t\t\t\tthis.setString = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.s = e,\n\t\t\t\t\t\t\tthis.hV = stohex(this.s)\n\t\t\t\t\t},\n\t\t\t\t\tthis.setByDateValue = function(e, t, n, i, s, o) {\n\t\t\t\t\t\tvar r = new Date(Date.UTC(e, t - 1, n, i, s, o, 0));\n\t\t\t\t\t\tthis.setByDate(r)\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn this.hV\n\t\t\t\t\t}\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERAbstractStructured = function(e) {\n\t\t\t\tKJUR.asn1.DERAbstractString.superclass.constructor.call(this),\n\t\t\t\t\tthis.setByASN1ObjectArray = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.asn1Array = e\n\t\t\t\t\t},\n\t\t\t\t\tthis.appendASN1Object = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.asn1Array.push(e)\n\t\t\t\t\t},\n\t\t\t\t\tthis.asn1Array = new Array,\n\t\t\t\t\t\"undefined\" != typeof e && \"undefined\" != typeof e.array && (this.asn1Array = e.array)\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERBoolean = function() {\n\t\t\t\tKJUR.asn1.DERBoolean.superclass.constructor.call(this),\n\t\t\t\t\tthis.hT = \"01\",\n\t\t\t\t\tthis.hTLV = \"0101ff\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERInteger = function(e) {\n\t\t\t\tKJUR.asn1.DERInteger.superclass.constructor.call(this),\n\t\t\t\t\tthis.hT = \"02\",\n\t\t\t\t\tthis.setByBigInteger = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(e)\n\t\t\t\t\t},\n\t\t\t\t\tthis.setByInteger = function(e) {\n\t\t\t\t\t\tvar n = new t(String(e), 10);\n\t\t\t\t\t\tthis.setByBigInteger(n)\n\t\t\t\t\t},\n\t\t\t\t\tthis.setValueHex = function(e) {\n\t\t\t\t\t\tthis.hV = e\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn this.hV\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.bigint ? this.setByBigInteger(e.bigint) : \"undefined\" !=\n\t\t\t\t\t\ttypeof e[\"int\"] ? this.setByInteger(e[\"int\"]) : \"undefined\" != typeof e.hex && this.setValueHex(e.hex))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERBitString = function(e) {\n\t\t\t\tKJUR.asn1.DERBitString.superclass.constructor.call(this),\n\t\t\t\t\tthis.hT = \"03\",\n\t\t\t\t\tthis.setHexValueIncludingUnusedBits = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.hV = e\n\t\t\t\t\t},\n\t\t\t\t\tthis.setUnusedBitsAndHexValue = function(e, t) {\n\t\t\t\t\t\tif (0 > e || e > 7)\n\t\t\t\t\t\t\tthrow \"unused bits shall be from 0 to 7: u = \" + e;\n\t\t\t\t\t\tvar n = \"0\" + e;\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.hV = n + t\n\t\t\t\t\t},\n\t\t\t\t\tthis.setByBinaryString = function(e) {\n\t\t\t\t\t\te = e.replace(/0+$/, \"\");\n\t\t\t\t\t\tvar t = 8 - e.length % 8;\n\t\t\t\t\t\t8 == t && (t = 0);\n\t\t\t\t\t\tfor (var n = 0; t >= n; n++)\n\t\t\t\t\t\t\te += \"0\";\n\t\t\t\t\t\tfor (var i = \"\", n = 0; n < e.length - 1; n += 8) {\n\t\t\t\t\t\t\tvar s = e.substr(n, 8),\n\t\t\t\t\t\t\t\to = parseInt(s, 2).toString(16);\n\t\t\t\t\t\t\t1 == o.length && (o = \"0\" + o),\n\t\t\t\t\t\t\t\ti += o\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.hV = \"0\" + t + i\n\t\t\t\t\t},\n\t\t\t\t\tthis.setByBooleanArray = function(e) {\n\t\t\t\t\t\tfor (var t = \"\", n = 0; n < e.length; n++)\n\t\t\t\t\t\t\tt += 1 == e[n] ? \"1\" : \"0\";\n\t\t\t\t\t\tthis.setByBinaryString(t)\n\t\t\t\t\t},\n\t\t\t\t\tthis.newFalseArray = function(e) {\n\t\t\t\t\t\tfor (var t = new Array(e), n = 0; e > n; n++)\n\t\t\t\t\t\t\tt[n] = !1;\n\t\t\t\t\t\treturn t\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn this.hV\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.hex ? this.setHexValueIncludingUnusedBits(e.hex) :\n\t\t\t\t\t\t\"undefined\" != typeof e.bin ? this.setByBinaryString(e.bin) : \"undefined\" != typeof e.array && this.setByBooleanArray(\n\t\t\t\t\t\t\te.array))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DEROctetString = function(e) {\n\t\t\t\tKJUR.asn1.DEROctetString.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"04\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString),\n\t\t\tKJUR.asn1.DERNull = function() {\n\t\t\t\tKJUR.asn1.DERNull.superclass.constructor.call(this),\n\t\t\t\t\tthis.hT = \"05\",\n\t\t\t\t\tthis.hTLV = \"0500\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERObjectIdentifier = function(e) {\n\t\t\t\tvar n = function(e) {\n\t\t\t\t\t\tvar t = e.toString(16);\n\t\t\t\t\t\treturn 1 == t.length && (t = \"0\" + t),\n\t\t\t\t\t\t\tt\n\t\t\t\t\t},\n\t\t\t\t\ti = function(e) {\n\t\t\t\t\t\tvar i = \"\",\n\t\t\t\t\t\t\ts = new t(e, 10),\n\t\t\t\t\t\t\to = s.toString(2),\n\t\t\t\t\t\t\tr = 7 - o.length % 7;\n\t\t\t\t\t\t7 == r && (r = 0);\n\t\t\t\t\t\tfor (var a = \"\", c = 0; r > c; c++)\n\t\t\t\t\t\t\ta += \"0\";\n\t\t\t\t\t\to = a + o;\n\t\t\t\t\t\tfor (var c = 0; c < o.length - 1; c += 7) {\n\t\t\t\t\t\t\tvar l = o.substr(c, 7);\n\t\t\t\t\t\t\tc != o.length - 7 && (l = \"1\" + l),\n\t\t\t\t\t\t\t\ti += n(parseInt(l, 2))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn i\n\t\t\t\t\t};\n\t\t\t\tKJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this),\n\t\t\t\t\tthis.hT = \"06\",\n\t\t\t\t\tthis.setValueHex = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.s = null,\n\t\t\t\t\t\t\tthis.hV = e\n\t\t\t\t\t},\n\t\t\t\t\tthis.setValueOidString = function(e) {\n\t\t\t\t\t\tif (!e.match(/^[0-9.]+$/))\n\t\t\t\t\t\t\tthrow \"malformed oid string: \" + e;\n\t\t\t\t\t\tvar t = \"\",\n\t\t\t\t\t\t\ts = e.split(\".\"),\n\t\t\t\t\t\t\to = 40 * parseInt(s[0]) + parseInt(s[1]);\n\t\t\t\t\t\tt += n(o),\n\t\t\t\t\t\t\ts.splice(0, 2);\n\t\t\t\t\t\tfor (var r = 0; r < s.length; r++)\n\t\t\t\t\t\t\tt += i(s[r]);\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.s = null,\n\t\t\t\t\t\t\tthis.hV = t\n\t\t\t\t\t},\n\t\t\t\t\tthis.setValueName = function(e) {\n\t\t\t\t\t\tif (\"undefined\" == typeof KJUR.asn1.x509.OID.name2oidList[e])\n\t\t\t\t\t\t\tthrow \"DERObjectIdentifier oidName undefined: \" + e;\n\t\t\t\t\t\tvar t = KJUR.asn1.x509.OID.name2oidList[e];\n\t\t\t\t\t\tthis.setValueOidString(t)\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn this.hV\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.oid ? this.setValueOidString(e.oid) : \"undefined\" != typeof e\n\t\t\t\t\t\t.hex ? this.setValueHex(e.hex) : \"undefined\" != typeof e.name && this.setValueName(e.name))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object),\n\t\t\tKJUR.asn1.DERUTF8String = function(e) {\n\t\t\t\tKJUR.asn1.DERUTF8String.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"0c\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString),\n\t\t\tKJUR.asn1.DERNumericString = function(e) {\n\t\t\t\tKJUR.asn1.DERNumericString.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"12\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString),\n\t\t\tKJUR.asn1.DERPrintableString = function(e) {\n\t\t\t\tKJUR.asn1.DERPrintableString.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"13\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString),\n\t\t\tKJUR.asn1.DERTeletexString = function(e) {\n\t\t\t\tKJUR.asn1.DERTeletexString.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"14\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString),\n\t\t\tKJUR.asn1.DERIA5String = function(e) {\n\t\t\t\tKJUR.asn1.DERIA5String.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"16\"\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString),\n\t\t\tKJUR.asn1.DERUTCTime = function(e) {\n\t\t\t\tKJUR.asn1.DERUTCTime.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"17\",\n\t\t\t\t\tthis.setByDate = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.date = e,\n\t\t\t\t\t\t\tthis.s = this.formatDate(this.date, \"utc\"),\n\t\t\t\t\t\t\tthis.hV = stohex(this.s)\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.str ? this.setString(e.str) : \"undefined\" != typeof e.hex ?\n\t\t\t\t\t\tthis.setStringHex(e.hex) : \"undefined\" != typeof e.date && this.setByDate(e.date))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime),\n\t\t\tKJUR.asn1.DERGeneralizedTime = function(e) {\n\t\t\t\tKJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"18\",\n\t\t\t\t\tthis.setByDate = function(e) {\n\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\tthis.isModified = !0,\n\t\t\t\t\t\t\tthis.date = e,\n\t\t\t\t\t\t\tthis.s = this.formatDate(this.date, \"gen\"),\n\t\t\t\t\t\t\tthis.hV = stohex(this.s)\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.str ? this.setString(e.str) : \"undefined\" != typeof e.hex ?\n\t\t\t\t\t\tthis.setStringHex(e.hex) : \"undefined\" != typeof e.date && this.setByDate(e.date))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime),\n\t\t\tKJUR.asn1.DERSequence = function(e) {\n\t\t\t\tKJUR.asn1.DERSequence.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"30\",\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\tfor (var e = \"\", t = 0; t < this.asn1Array.length; t++) {\n\t\t\t\t\t\t\tvar n = this.asn1Array[t];\n\t\t\t\t\t\t\te += n.getEncodedHex()\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn this.hV = e,\n\t\t\t\t\t\t\tthis.hV\n\t\t\t\t\t}\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured),\n\t\t\tKJUR.asn1.DERSet = function(e) {\n\t\t\t\tKJUR.asn1.DERSet.superclass.constructor.call(this, e),\n\t\t\t\t\tthis.hT = \"31\",\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\tfor (var e = new Array, t = 0; t < this.asn1Array.length; t++) {\n\t\t\t\t\t\t\tvar n = this.asn1Array[t];\n\t\t\t\t\t\t\te.push(n.getEncodedHex())\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn e.sort(),\n\t\t\t\t\t\t\tthis.hV = e.join(\"\"),\n\t\t\t\t\t\t\tthis.hV\n\t\t\t\t\t}\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured),\n\t\t\tKJUR.asn1.DERTaggedObject = function(e) {\n\t\t\t\tKJUR.asn1.DERTaggedObject.superclass.constructor.call(this),\n\t\t\t\t\tthis.hT = \"a0\",\n\t\t\t\t\tthis.hV = \"\",\n\t\t\t\t\tthis.isExplicit = !0,\n\t\t\t\t\tthis.asn1Object = null,\n\t\t\t\t\tthis.setASN1Object = function(e, t, n) {\n\t\t\t\t\t\tthis.hT = t,\n\t\t\t\t\t\t\tthis.isExplicit = e,\n\t\t\t\t\t\t\tthis.asn1Object = n,\n\t\t\t\t\t\t\tthis.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(),\n\t\t\t\t\t\t\t\tthis.hTLV = null,\n\t\t\t\t\t\t\t\tthis.isModified = !0) : (this.hV = null,\n\t\t\t\t\t\t\t\tthis.hTLV = n.getEncodedHex(),\n\t\t\t\t\t\t\t\tthis.hTLV = this.hTLV.replace(/^../, t),\n\t\t\t\t\t\t\t\tthis.isModified = !1)\n\t\t\t\t\t},\n\t\t\t\t\tthis.getFreshValueHex = function() {\n\t\t\t\t\t\treturn this.hV\n\t\t\t\t\t},\n\t\t\t\t\t\"undefined\" != typeof e && (\"undefined\" != typeof e.tag && (this.hT = e.tag),\n\t\t\t\t\t\t\"undefined\" != typeof e.explicit && (this.isExplicit = e.explicit),\n\t\t\t\t\t\t\"undefined\" != typeof e.obj && (this.asn1Object = e.obj,\n\t\t\t\t\t\t\tthis.setASN1Object(this.isExplicit, this.hT, this.asn1Object)))\n\t\t\t},\n\t\t\tHn.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object),\n\t\t\tfunction(e) {\n\t\t\t\t\"use strict\";\n\t\t\t\tvar t, n = {};\n\t\t\t\tn.decode = function(n) {\n\t\t\t\t\t\tvar i;\n\t\t\t\t\t\tif (t === e) {\n\t\t\t\t\t\t\tvar s = \"0123456789ABCDEF\",\n\t\t\t\t\t\t\t\to = \" \\f\\n\\r\t \\u2028\\u2029\";\n\t\t\t\t\t\t\tfor (t = [],\n\t\t\t\t\t\t\t\ti = 0; 16 > i; ++i)\n\t\t\t\t\t\t\t\tt[s.charAt(i)] = i;\n\t\t\t\t\t\t\tfor (s = s.toLowerCase(),\n\t\t\t\t\t\t\t\ti = 10; 16 > i; ++i)\n\t\t\t\t\t\t\t\tt[s.charAt(i)] = i;\n\t\t\t\t\t\t\tfor (i = 0; i < o.length; ++i)\n\t\t\t\t\t\t\t\tt[o.charAt(i)] = -1\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar r = [],\n\t\t\t\t\t\t\ta = 0,\n\t\t\t\t\t\t\tc = 0;\n\t\t\t\t\t\tfor (i = 0; i < n.length; ++i) {\n\t\t\t\t\t\t\tvar l = n.charAt(i);\n\t\t\t\t\t\t\tif (\"=\" == l)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tif (l = t[l],\n\t\t\t\t\t\t\t\t-1 != l) {\n\t\t\t\t\t\t\t\tif (l === e)\n\t\t\t\t\t\t\t\t\tthrow \"Illegal character at offset \" + i;\n\t\t\t\t\t\t\t\ta |= l,\n\t\t\t\t\t\t\t\t\t++c >= 2 ? (r[r.length] = a,\n\t\t\t\t\t\t\t\t\t\ta = 0,\n\t\t\t\t\t\t\t\t\t\tc = 0) : a <<= 4\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (c)\n\t\t\t\t\t\t\tthrow \"Hex encoding incomplete: 4 bits missing\";\n\t\t\t\t\t\treturn r\n\t\t\t\t\t},\n\t\t\t\t\twindow.Hex = n\n\t\t\t}(),\n\t\t\tfunction(e) {\n\t\t\t\t\"use strict\";\n\t\t\t\tvar t, n = {};\n\t\t\t\tn.decode = function(n) {\n\t\t\t\t\t\tvar i;\n\t\t\t\t\t\tif (t === e) {\n\t\t\t\t\t\t\tvar s = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",\n\t\t\t\t\t\t\t\to = \"= \\f\\n\\r\t \\u2028\\u2029\";\n\t\t\t\t\t\t\tfor (t = [],\n\t\t\t\t\t\t\t\ti = 0; 64 > i; ++i)\n\t\t\t\t\t\t\t\tt[s.charAt(i)] = i;\n\t\t\t\t\t\t\tfor (i = 0; i < o.length; ++i)\n\t\t\t\t\t\t\t\tt[o.charAt(i)] = -1\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar r = [],\n\t\t\t\t\t\t\ta = 0,\n\t\t\t\t\t\t\tc = 0;\n\t\t\t\t\t\tfor (i = 0; i < n.length; ++i) {\n\t\t\t\t\t\t\tvar l = n.charAt(i);\n\t\t\t\t\t\t\tif (\"=\" == l)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tif (l = t[l],\n\t\t\t\t\t\t\t\t-1 != l) {\n\t\t\t\t\t\t\t\tif (l === e)\n\t\t\t\t\t\t\t\t\tthrow \"Illegal character at offset \" + i;\n\t\t\t\t\t\t\t\ta |= l,\n\t\t\t\t\t\t\t\t\t++c >= 4 ? (r[r.length] = a >> 16,\n\t\t\t\t\t\t\t\t\t\tr[r.length] = a >> 8 & 255,\n\t\t\t\t\t\t\t\t\t\tr[r.length] = 255 & a,\n\t\t\t\t\t\t\t\t\t\ta = 0,\n\t\t\t\t\t\t\t\t\t\tc = 0) : a <<= 6\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (c) {\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\tthrow \"Base64 encoding incomplete: at least 2 bits missing\";\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tr[r.length] = a >> 10;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tr[r.length] = a >> 16,\n\t\t\t\t\t\t\t\t\tr[r.length] = a >> 8 & 255\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn r\n\t\t\t\t\t},\n\t\t\t\t\tn.re =\n\t\t\t\t\t/-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n\t\t\t\t\tn.unarmor = function(e) {\n\t\t\t\t\t\tvar t = n.re.exec(e);\n\t\t\t\t\t\tif (t)\n\t\t\t\t\t\t\tif (t[1])\n\t\t\t\t\t\t\t\te = t[1];\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tif (!t[2])\n\t\t\t\t\t\t\t\t\tthrow \"RegExp out of sync\";\n\t\t\t\t\t\t\t\te = t[2]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n.decode(e)\n\t\t\t\t\t},\n\t\t\t\t\twindow.Base64 = n\n\t\t\t}(),\n\t\t\tfunction(e) {\n\t\t\t\t\"use strict\";\n\n\t\t\t\tfunction t(e, n) {\n\t\t\t\t\te instanceof t ? (this.enc = e.enc,\n\t\t\t\t\t\tthis.pos = e.pos) : (this.enc = e,\n\t\t\t\t\t\tthis.pos = n)\n\t\t\t\t}\n\n\t\t\t\tfunction n(e, t, n, i, s) {\n\t\t\t\t\tthis.stream = e,\n\t\t\t\t\t\tthis.header = t,\n\t\t\t\t\t\tthis.length = n,\n\t\t\t\t\t\tthis.tag = i,\n\t\t\t\t\t\tthis.sub = s\n\t\t\t\t}\n\t\t\t\tvar i = 100,\n\t\t\t\t\ts = \"…\",\n\t\t\t\t\to = {\n\t\t\t\t\t\ttag: function(e, t) {\n\t\t\t\t\t\t\tvar n = document.createElement(e);\n\t\t\t\t\t\t\treturn n.className = t,\n\t\t\t\t\t\t\t\tn\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttext: function(e) {\n\t\t\t\t\t\t\treturn document.createTextNode(e)\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\tt.prototype.get = function(t) {\n\t\t\t\t\t\tif (t === e && (t = this.pos++),\n\t\t\t\t\t\t\tt >= this.enc.length)\n\t\t\t\t\t\t\tthrow \"Requesting byte offset \" + t + \" on a stream of length \" + this.enc.length;\n\t\t\t\t\t\treturn this.enc[t]\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.hexDigits = \"0123456789ABCDEF\",\n\t\t\t\t\tt.prototype.hexByte = function(e) {\n\t\t\t\t\t\treturn this.hexDigits.charAt(e >> 4 & 15) + this.hexDigits.charAt(15 & e)\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.hexDump = function(e, t, n) {\n\t\t\t\t\t\tfor (var i = \"\", s = e; t > s; ++s)\n\t\t\t\t\t\t\tif (i += this.hexByte(this.get(s)),\n\t\t\t\t\t\t\t\tn !== !0)\n\t\t\t\t\t\t\t\tswitch (15 & s) {\n\t\t\t\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\t\t\t\ti += \"  \";\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 15:\n\t\t\t\t\t\t\t\t\t\ti += \"\\n\";\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\ti += \" \"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\treturn i\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseStringISO = function(e, t) {\n\t\t\t\t\t\tfor (var n = \"\", i = e; t > i; ++i)\n\t\t\t\t\t\t\tn += String.fromCharCode(this.get(i));\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseStringUTF = function(e, t) {\n\t\t\t\t\t\tfor (var n = \"\", i = e; t > i;) {\n\t\t\t\t\t\t\tvar s = this.get(i++);\n\t\t\t\t\t\t\tn += String.fromCharCode(128 > s ? s : s > 191 && 224 > s ? (31 & s) << 6 | 63 & this.get(i++) : (15 & s) <<\n\t\t\t\t\t\t\t\t12 | (63 & this.get(i++)) << 6 | 63 & this.get(i++))\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseStringBMP = function(e, t) {\n\t\t\t\t\t\tfor (var n = \"\", i = e; t > i; i += 2) {\n\t\t\t\t\t\t\tvar s = this.get(i),\n\t\t\t\t\t\t\t\to = this.get(i + 1);\n\t\t\t\t\t\t\tn += String.fromCharCode((s << 8) + o)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.reTime =\n\t\t\t\t\t/^((?:1[89]|2\\d)?\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/,\n\t\t\t\t\tt.prototype.parseTime = function(e, t) {\n\t\t\t\t\t\tvar n = this.parseStringISO(e, t),\n\t\t\t\t\t\t\ti = this.reTime.exec(n);\n\t\t\t\t\t\treturn i ? (n = i[1] + \"-\" + i[2] + \"-\" + i[3] + \" \" + i[4],\n\t\t\t\t\t\t\ti[5] && (n += \":\" + i[5],\n\t\t\t\t\t\t\t\ti[6] && (n += \":\" + i[6],\n\t\t\t\t\t\t\t\t\ti[7] && (n += \".\" + i[7]))),\n\t\t\t\t\t\t\ti[8] && (n += \" UTC\",\n\t\t\t\t\t\t\t\t\"Z\" != i[8] && (n += i[8],\n\t\t\t\t\t\t\t\t\ti[9] && (n += \":\" + i[9]))),\n\t\t\t\t\t\t\tn) : \"Unrecognized time: \" + n\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseInteger = function(e, t) {\n\t\t\t\t\t\tvar n = t - e;\n\t\t\t\t\t\tif (n > 4) {\n\t\t\t\t\t\t\tn <<= 3;\n\t\t\t\t\t\t\tvar i = this.get(e);\n\t\t\t\t\t\t\tif (0 === i)\n\t\t\t\t\t\t\t\tn -= 8;\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tfor (; 128 > i;)\n\t\t\t\t\t\t\t\t\ti <<= 1,\n\t\t\t\t\t\t\t\t\t--n;\n\t\t\t\t\t\t\treturn \"(\" + n + \" bit)\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (var s = 0, o = e; t > o; ++o)\n\t\t\t\t\t\t\ts = s << 8 | this.get(o);\n\t\t\t\t\t\treturn s\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseBitString = function(e, t) {\n\t\t\t\t\t\tvar n = this.get(e),\n\t\t\t\t\t\t\ti = (t - e - 1 << 3) - n,\n\t\t\t\t\t\t\ts = \"(\" + i + \" bit)\";\n\t\t\t\t\t\tif (20 >= i) {\n\t\t\t\t\t\t\tvar o = n;\n\t\t\t\t\t\t\ts += \" \";\n\t\t\t\t\t\t\tfor (var r = t - 1; r > e; --r) {\n\t\t\t\t\t\t\t\tfor (var a = this.get(r), c = o; 8 > c; ++c)\n\t\t\t\t\t\t\t\t\ts += a >> c & 1 ? \"1\" : \"0\";\n\t\t\t\t\t\t\t\to = 0\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn s\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseOctetString = function(e, t) {\n\t\t\t\t\t\tvar n = t - e,\n\t\t\t\t\t\t\to = \"(\" + n + \" byte) \";\n\t\t\t\t\t\tn > i && (t = e + i);\n\t\t\t\t\t\tfor (var r = e; t > r; ++r)\n\t\t\t\t\t\t\to += this.hexByte(this.get(r));\n\t\t\t\t\t\treturn n > i && (o += s),\n\t\t\t\t\t\t\to\n\t\t\t\t\t},\n\t\t\t\t\tt.prototype.parseOID = function(e, t) {\n\t\t\t\t\t\tfor (var n = \"\", i = 0, s = 0, o = e; t > o; ++o) {\n\t\t\t\t\t\t\tvar r = this.get(o);\n\t\t\t\t\t\t\tif (i = i << 7 | 127 & r,\n\t\t\t\t\t\t\t\ts += 7,\n\t\t\t\t\t\t\t\t!(128 & r)) {\n\t\t\t\t\t\t\t\tif (\"\" === n) {\n\t\t\t\t\t\t\t\t\tvar a = 80 > i ? 40 > i ? 0 : 1 : 2;\n\t\t\t\t\t\t\t\t\tn = a + \".\" + (i - 40 * a)\n\t\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\t\t\tn += \".\" + (s >= 31 ? \"bigint\" : i);\n\t\t\t\t\t\t\t\ti = s = 0\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.typeName = function() {\n\t\t\t\t\t\tif (this.tag === e)\n\t\t\t\t\t\t\treturn \"unknown\";\n\t\t\t\t\t\tvar t = this.tag >> 6,\n\t\t\t\t\t\t\tn = (this.tag >> 5 & 1,\n\t\t\t\t\t\t\t\t31 & this.tag);\n\t\t\t\t\t\tswitch (t) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\tswitch (n) {\n\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\treturn \"EOC\";\n\t\t\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\t\t\treturn \"BOOLEAN\";\n\t\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t\treturn \"INTEGER\";\n\t\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t\treturn \"BIT_STRING\";\n\t\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t\treturn \"OCTET_STRING\";\n\t\t\t\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t\t\t\treturn \"NULL\";\n\t\t\t\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\t\t\t\treturn \"OBJECT_IDENTIFIER\";\n\t\t\t\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\t\t\t\treturn \"ObjectDescriptor\";\n\t\t\t\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\t\t\t\treturn \"EXTERNAL\";\n\t\t\t\t\t\t\t\t\tcase 9:\n\t\t\t\t\t\t\t\t\t\treturn \"REAL\";\n\t\t\t\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\t\t\t\treturn \"ENUMERATED\";\n\t\t\t\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\t\t\t\t\treturn \"EMBEDDED_PDV\";\n\t\t\t\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\t\t\t\treturn \"UTF8String\";\n\t\t\t\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\t\t\t\treturn \"SEQUENCE\";\n\t\t\t\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\t\t\t\t\treturn \"SET\";\n\t\t\t\t\t\t\t\t\tcase 18:\n\t\t\t\t\t\t\t\t\t\treturn \"NumericString\";\n\t\t\t\t\t\t\t\t\tcase 19:\n\t\t\t\t\t\t\t\t\t\treturn \"PrintableString\";\n\t\t\t\t\t\t\t\t\tcase 20:\n\t\t\t\t\t\t\t\t\t\treturn \"TeletexString\";\n\t\t\t\t\t\t\t\t\tcase 21:\n\t\t\t\t\t\t\t\t\t\treturn \"VideotexString\";\n\t\t\t\t\t\t\t\t\tcase 22:\n\t\t\t\t\t\t\t\t\t\treturn \"IA5String\";\n\t\t\t\t\t\t\t\t\tcase 23:\n\t\t\t\t\t\t\t\t\t\treturn \"UTCTime\";\n\t\t\t\t\t\t\t\t\tcase 24:\n\t\t\t\t\t\t\t\t\t\treturn \"GeneralizedTime\";\n\t\t\t\t\t\t\t\t\tcase 25:\n\t\t\t\t\t\t\t\t\t\treturn \"GraphicString\";\n\t\t\t\t\t\t\t\t\tcase 26:\n\t\t\t\t\t\t\t\t\t\treturn \"VisibleString\";\n\t\t\t\t\t\t\t\t\tcase 27:\n\t\t\t\t\t\t\t\t\t\treturn \"GeneralString\";\n\t\t\t\t\t\t\t\t\tcase 28:\n\t\t\t\t\t\t\t\t\t\treturn \"UniversalString\";\n\t\t\t\t\t\t\t\t\tcase 30:\n\t\t\t\t\t\t\t\t\t\treturn \"BMPString\";\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\treturn \"Universal_\" + n.toString(16)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn \"Application_\" + n.toString(16);\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn \"[\" + n + \"]\";\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn \"Private_\" + n.toString(16)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.reSeemsASCII = /^[ -~]+$/,\n\t\t\t\t\tn.prototype.content = function() {\n\t\t\t\t\t\tif (this.tag === e)\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\tvar t = this.tag >> 6,\n\t\t\t\t\t\t\tn = 31 & this.tag,\n\t\t\t\t\t\t\to = this.posContent(),\n\t\t\t\t\t\t\tr = Math.abs(this.length);\n\t\t\t\t\t\tif (0 !== t) {\n\t\t\t\t\t\t\tif (null !== this.sub)\n\t\t\t\t\t\t\t\treturn \"(\" + this.sub.length + \" elem)\";\n\t\t\t\t\t\t\tvar a = this.stream.parseStringISO(o, o + Math.min(r, i));\n\t\t\t\t\t\t\treturn this.reSeemsASCII.test(a) ? a.substring(0, 2 * i) + (a.length > 2 * i ? s : \"\") : this.stream.parseOctetString(\n\t\t\t\t\t\t\t\to, o + r)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (n) {\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn 0 === this.stream.get(o) ? \"false\" : \"true\";\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn this.stream.parseInteger(o, o + r);\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseBitString(o, o + r);\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn this.sub ? \"(\" + this.sub.length + \" elem)\" : this.stream.parseOctetString(o, o + r);\n\t\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\t\treturn this.stream.parseOID(o, o + r);\n\t\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\t\t\treturn \"(\" + this.sub.length + \" elem)\";\n\t\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\t\treturn this.stream.parseStringUTF(o, o + r);\n\t\t\t\t\t\t\tcase 18:\n\t\t\t\t\t\t\tcase 19:\n\t\t\t\t\t\t\tcase 20:\n\t\t\t\t\t\t\tcase 21:\n\t\t\t\t\t\t\tcase 22:\n\t\t\t\t\t\t\tcase 26:\n\t\t\t\t\t\t\t\treturn this.stream.parseStringISO(o, o + r);\n\t\t\t\t\t\t\tcase 30:\n\t\t\t\t\t\t\t\treturn this.stream.parseStringBMP(o, o + r);\n\t\t\t\t\t\t\tcase 23:\n\t\t\t\t\t\t\tcase 24:\n\t\t\t\t\t\t\t\treturn this.stream.parseTime(o, o + r)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.toString = function() {\n\t\t\t\t\t\treturn this.typeName() + \"@\" + this.stream.pos + \"[header:\" + this.header + \",length:\" + this.length + \",sub:\" +\n\t\t\t\t\t\t\t(null === this.sub ? \"null\" : this.sub.length) + \"]\"\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.print = function(t) {\n\t\t\t\t\t\tif (t === e && (t = \"\"),\n\t\t\t\t\t\t\tdocument.writeln(t + this),\n\t\t\t\t\t\t\tnull !== this.sub) {\n\t\t\t\t\t\t\tt += \"  \";\n\t\t\t\t\t\t\tfor (var n = 0, i = this.sub.length; i > n; ++n)\n\t\t\t\t\t\t\t\tthis.sub[n].print(t)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.toPrettyString = function(t) {\n\t\t\t\t\t\tt === e && (t = \"\");\n\t\t\t\t\t\tvar n = t + this.typeName() + \" @\" + this.stream.pos;\n\t\t\t\t\t\tif (this.length >= 0 && (n += \"+\"),\n\t\t\t\t\t\t\tn += this.length,\n\t\t\t\t\t\t\t32 & this.tag ? n += \" (constructed)\" : 3 != this.tag && 4 != this.tag || null === this.sub || (n +=\n\t\t\t\t\t\t\t\t\" (encapsulates)\"),\n\t\t\t\t\t\t\tn += \"\\n\",\n\t\t\t\t\t\t\tnull !== this.sub) {\n\t\t\t\t\t\t\tt += \"  \";\n\t\t\t\t\t\t\tfor (var i = 0, s = this.sub.length; s > i; ++i)\n\t\t\t\t\t\t\t\tn += this.sub[i].toPrettyString(t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.toDOM = function() {\n\t\t\t\t\t\tvar e = o.tag(\"div\", \"node\");\n\t\t\t\t\t\te.asn1 = this;\n\t\t\t\t\t\tvar t = o.tag(\"div\", \"head\"),\n\t\t\t\t\t\t\tn = this.typeName().replace(/_/g, \" \");\n\t\t\t\t\t\tt.innerHTML = n;\n\t\t\t\t\t\tvar i = this.content();\n\t\t\t\t\t\tif (null !== i) {\n\t\t\t\t\t\t\ti = String(i).replace(/</g, \"&lt;\");\n\t\t\t\t\t\t\tvar s = o.tag(\"span\", \"preview\");\n\t\t\t\t\t\t\ts.appendChild(o.text(i)),\n\t\t\t\t\t\t\t\tt.appendChild(s)\n\t\t\t\t\t\t}\n\t\t\t\t\t\te.appendChild(t),\n\t\t\t\t\t\t\tthis.node = e,\n\t\t\t\t\t\t\tthis.head = t;\n\t\t\t\t\t\tvar r = o.tag(\"div\", \"value\");\n\t\t\t\t\t\tif (n = \"Offset: \" + this.stream.pos + \"<br/>\",\n\t\t\t\t\t\t\tn += \"Length: \" + this.header + \"+\",\n\t\t\t\t\t\t\tn += this.length >= 0 ? this.length : -this.length + \" (undefined)\",\n\t\t\t\t\t\t\t32 & this.tag ? n += \"<br/>(constructed)\" : 3 != this.tag && 4 != this.tag || null === this.sub || (n +=\n\t\t\t\t\t\t\t\t\"<br/>(encapsulates)\"),\n\t\t\t\t\t\t\tnull !== i && (n += \"<br/>Value:<br/><b>\" + i + \"</b>\",\n\t\t\t\t\t\t\t\t\"object\" == typeof oids && 6 == this.tag)) {\n\t\t\t\t\t\t\tvar a = oids[i];\n\t\t\t\t\t\t\ta && (a.d && (n += \"<br/>\" + a.d),\n\t\t\t\t\t\t\t\ta.c && (n += \"<br/>\" + a.c),\n\t\t\t\t\t\t\t\ta.w && (n += \"<br/>(warning!)\"))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tr.innerHTML = n,\n\t\t\t\t\t\t\te.appendChild(r);\n\t\t\t\t\t\tvar c = o.tag(\"div\", \"sub\");\n\t\t\t\t\t\tif (null !== this.sub)\n\t\t\t\t\t\t\tfor (var l = 0, d = this.sub.length; d > l; ++l)\n\t\t\t\t\t\t\t\tc.appendChild(this.sub[l].toDOM());\n\t\t\t\t\t\treturn e.appendChild(c),\n\t\t\t\t\t\t\tt.onclick = function() {\n\t\t\t\t\t\t\t\te.className = \"node collapsed\" == e.className ? \"node\" : \"node collapsed\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\te\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.posStart = function() {\n\t\t\t\t\t\treturn this.stream.pos\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.posContent = function() {\n\t\t\t\t\t\treturn this.stream.pos + this.header\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.posEnd = function() {\n\t\t\t\t\t\treturn this.stream.pos + this.header + Math.abs(this.length)\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.fakeHover = function(e) {\n\t\t\t\t\t\tthis.node.className += \" hover\",\n\t\t\t\t\t\t\te && (this.head.className += \" hover\")\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.fakeOut = function(e) {\n\t\t\t\t\t\tvar t = / ?hover/;\n\t\t\t\t\t\tthis.node.className = this.node.className.replace(t, \"\"),\n\t\t\t\t\t\t\te && (this.head.className = this.head.className.replace(t, \"\"))\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.toHexDOM_sub = function(e, t, n, i, s) {\n\t\t\t\t\t\tif (!(i >= s)) {\n\t\t\t\t\t\t\tvar r = o.tag(\"span\", t);\n\t\t\t\t\t\t\tr.appendChild(o.text(n.hexDump(i, s))),\n\t\t\t\t\t\t\t\te.appendChild(r)\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.toHexDOM = function(t) {\n\t\t\t\t\t\tvar n = o.tag(\"span\", \"hex\");\n\t\t\t\t\t\tif (t === e && (t = n),\n\t\t\t\t\t\t\tthis.head.hexNode = n,\n\t\t\t\t\t\t\tthis.head.onmouseover = function() {\n\t\t\t\t\t\t\t\tthis.hexNode.className = \"hexCurrent\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.head.onmouseout = function() {\n\t\t\t\t\t\t\t\tthis.hexNode.className = \"hex\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tn.asn1 = this,\n\t\t\t\t\t\t\tn.onmouseover = function() {\n\t\t\t\t\t\t\t\tvar e = !t.selected;\n\t\t\t\t\t\t\t\te && (t.selected = this.asn1,\n\t\t\t\t\t\t\t\t\t\tthis.className = \"hexCurrent\"),\n\t\t\t\t\t\t\t\t\tthis.asn1.fakeHover(e)\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tn.onmouseout = function() {\n\t\t\t\t\t\t\t\tvar e = t.selected == this.asn1;\n\t\t\t\t\t\t\t\tthis.asn1.fakeOut(e),\n\t\t\t\t\t\t\t\t\te && (t.selected = null,\n\t\t\t\t\t\t\t\t\t\tthis.className = \"hex\")\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tthis.toHexDOM_sub(n, \"tag\", this.stream, this.posStart(), this.posStart() + 1),\n\t\t\t\t\t\t\tthis.toHexDOM_sub(n, this.length >= 0 ? \"dlen\" : \"ulen\", this.stream, this.posStart() + 1, this.posContent()),\n\t\t\t\t\t\t\tnull === this.sub)\n\t\t\t\t\t\t\tn.appendChild(o.text(this.stream.hexDump(this.posContent(), this.posEnd())));\n\t\t\t\t\t\telse if (this.sub.length > 0) {\n\t\t\t\t\t\t\tvar i = this.sub[0],\n\t\t\t\t\t\t\t\ts = this.sub[this.sub.length - 1];\n\t\t\t\t\t\t\tthis.toHexDOM_sub(n, \"intro\", this.stream, this.posContent(), i.posStart());\n\t\t\t\t\t\t\tfor (var r = 0, a = this.sub.length; a > r; ++r)\n\t\t\t\t\t\t\t\tn.appendChild(this.sub[r].toHexDOM(t));\n\t\t\t\t\t\t\tthis.toHexDOM_sub(n, \"outro\", this.stream, s.posEnd(), this.posEnd())\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn n\n\t\t\t\t\t},\n\t\t\t\t\tn.prototype.toHexString = function() {\n\t\t\t\t\t\treturn this.stream.hexDump(this.posStart(), this.posEnd(), !0)\n\t\t\t\t\t},\n\t\t\t\t\tn.decodeLength = function(e) {\n\t\t\t\t\t\tvar t = e.get(),\n\t\t\t\t\t\t\tn = 127 & t;\n\t\t\t\t\t\tif (n == t)\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\tif (n > 3)\n\t\t\t\t\t\t\tthrow \"Length over 24 bits not supported at position \" + (e.pos - 1);\n\t\t\t\t\t\tif (0 === n)\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\tt = 0;\n\t\t\t\t\t\tfor (var i = 0; n > i; ++i)\n\t\t\t\t\t\t\tt = t << 8 | e.get();\n\t\t\t\t\t\treturn t\n\t\t\t\t\t},\n\t\t\t\t\tn.hasContent = function(e, i, s) {\n\t\t\t\t\t\tif (32 & e)\n\t\t\t\t\t\t\treturn !0;\n\t\t\t\t\t\tif (3 > e || e > 4)\n\t\t\t\t\t\t\treturn !1;\n\t\t\t\t\t\tvar o = new t(s);\n\t\t\t\t\t\t3 == e && o.get();\n\t\t\t\t\t\tvar r = o.get();\n\t\t\t\t\t\tif (r >> 6 & 1)\n\t\t\t\t\t\t\treturn !1;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvar a = n.decodeLength(o);\n\t\t\t\t\t\t\treturn o.pos - s.pos + a == i\n\t\t\t\t\t\t} catch (c) {\n\t\t\t\t\t\t\treturn !1\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tn.decode = function(e) {\n\t\t\t\t\t\te instanceof t || (e = new t(e, 0));\n\t\t\t\t\t\tvar i = new t(e),\n\t\t\t\t\t\t\ts = e.get(),\n\t\t\t\t\t\t\to = n.decodeLength(e),\n\t\t\t\t\t\t\tr = e.pos - i.pos,\n\t\t\t\t\t\t\ta = null;\n\t\t\t\t\t\tif (n.hasContent(s, o, e)) {\n\t\t\t\t\t\t\tvar c = e.pos;\n\t\t\t\t\t\t\tif (3 == s && e.get(),\n\t\t\t\t\t\t\t\ta = [],\n\t\t\t\t\t\t\t\to >= 0) {\n\t\t\t\t\t\t\t\tfor (var l = c + o; e.pos < l;)\n\t\t\t\t\t\t\t\t\ta[a.length] = n.decode(e);\n\t\t\t\t\t\t\t\tif (e.pos != l)\n\t\t\t\t\t\t\t\t\tthrow \"Content size is not correct for container starting at offset \" + c\n\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\t\t\t\t\tvar d = n.decode(e);\n\t\t\t\t\t\t\t\t\t\tif (0 === d.tag)\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\ta[a.length] = d\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\to = c - e.pos\n\t\t\t\t\t\t\t\t} catch (u) {\n\t\t\t\t\t\t\t\t\tthrow \"Exception while decoding undefined length content: \" + u\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else\n\t\t\t\t\t\t\te.pos += o;\n\t\t\t\t\t\treturn new n(i, r, o, s, a)\n\t\t\t\t\t},\n\t\t\t\t\tn.test = function() {\n\t\t\t\t\t\tfor (var e = [{\n\t\t\t\t\t\t\t\tvalue: [39],\n\t\t\t\t\t\t\t\texpected: 39\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tvalue: [129, 201],\n\t\t\t\t\t\t\t\texpected: 201\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tvalue: [131, 254, 220, 186],\n\t\t\t\t\t\t\t\texpected: 16702650\n\t\t\t\t\t\t\t}], i = 0, s = e.length; s > i; ++i) {\n\t\t\t\t\t\t\tvar o = new t(e[i].value, 0),\n\t\t\t\t\t\t\t\tr = n.decodeLength(o);\n\t\t\t\t\t\t\tr != e[i].expected && document.write(\"In test[\" + i + \"] expected \" + e[i].expected + \" got \" + r + \"\\n\")\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\twindow.ASN1 = n\n\t\t\t}(),\n\t\t\tASN1.prototype.getHexStringValue = function() {\n\t\t\t\tvar e = this.toHexString(),\n\t\t\t\t\tt = 2 * this.header,\n\t\t\t\t\tn = 2 * this.length;\n\t\t\t\treturn e.substr(t, n)\n\t\t\t},\n\t\t\tpn.prototype.parseKey = function(e) {\n\t\t\t\ttry {\n\t\t\t\t\tvar t = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/,\n\t\t\t\t\t\tn = t.test(e) ? Hex.decode(e) : Base64.unarmor(e),\n\t\t\t\t\t\ti = ASN1.decode(n);\n\t\t\t\t\tif (9 === i.sub.length) {\n\t\t\t\t\t\tvar s = i.sub[1].getHexStringValue();\n\t\t\t\t\t\tthis.n = dn(s, 16);\n\t\t\t\t\t\tvar o = i.sub[2].getHexStringValue();\n\t\t\t\t\t\tthis.e = parseInt(o, 16);\n\t\t\t\t\t\tvar r = i.sub[3].getHexStringValue();\n\t\t\t\t\t\tthis.d = dn(r, 16);\n\t\t\t\t\t\tvar a = i.sub[4].getHexStringValue();\n\t\t\t\t\t\tthis.p = dn(a, 16);\n\t\t\t\t\t\tvar c = i.sub[5].getHexStringValue();\n\t\t\t\t\t\tthis.q = dn(c, 16);\n\t\t\t\t\t\tvar l = i.sub[6].getHexStringValue();\n\t\t\t\t\t\tthis.dmp1 = dn(l, 16);\n\t\t\t\t\t\tvar d = i.sub[7].getHexStringValue();\n\t\t\t\t\t\tthis.dmq1 = dn(d, 16);\n\t\t\t\t\t\tvar u = i.sub[8].getHexStringValue();\n\t\t\t\t\t\tthis.coeff = dn(u, 16)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (2 !== i.sub.length)\n\t\t\t\t\t\t\treturn !1;\n\t\t\t\t\t\tvar p = i.sub[1],\n\t\t\t\t\t\t\tg = p.sub[0],\n\t\t\t\t\t\t\ts = g.sub[0].getHexStringValue();\n\t\t\t\t\t\tthis.n = dn(s, 16);\n\t\t\t\t\t\tvar o = g.sub[1].getHexStringValue();\n\t\t\t\t\t\tthis.e = parseInt(o, 16)\n\t\t\t\t\t}\n\t\t\t\t\treturn !0\n\t\t\t\t} catch (h) {\n\t\t\t\t\treturn !1\n\t\t\t\t}\n\t\t\t},\n\t\t\tpn.prototype.getPrivateBaseKey = function() {\n\t\t\t\tvar e = {\n\t\t\t\t\t\tarray: [new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\t\"int\": 0\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.n\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\t\"int\": this.e\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.d\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.p\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.q\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.dmp1\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.dmq1\n\t\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\tbigint: this.coeff\n\t\t\t\t\t\t})]\n\t\t\t\t\t},\n\t\t\t\t\tt = new KJUR.asn1.DERSequence(e);\n\t\t\t\treturn t.getEncodedHex()\n\t\t\t},\n\t\t\tpn.prototype.getPrivateBaseKeyB64 = function() {\n\t\t\t\treturn wn(this.getPrivateBaseKey())\n\t\t\t},\n\t\t\tpn.prototype.getPublicBaseKey = function() {\n\t\t\t\tvar e = {\n\t\t\t\t\t\tarray: [new KJUR.asn1.DERObjectIdentifier({\n\t\t\t\t\t\t\toid: \"1.2.840.113549.1.1.1\"\n\t\t\t\t\t\t}), new KJUR.asn1.DERNull]\n\t\t\t\t\t},\n\t\t\t\t\tt = new KJUR.asn1.DERSequence(e);\n\t\t\t\te = {\n\t\t\t\t\tarray: [new KJUR.asn1.DERInteger({\n\t\t\t\t\t\tbigint: this.n\n\t\t\t\t\t}), new KJUR.asn1.DERInteger({\n\t\t\t\t\t\t\"int\": this.e\n\t\t\t\t\t})]\n\t\t\t\t};\n\t\t\t\tvar n = new KJUR.asn1.DERSequence(e);\n\t\t\t\te = {\n\t\t\t\t\thex: \"00\" + n.getEncodedHex()\n\t\t\t\t};\n\t\t\t\tvar i = new KJUR.asn1.DERBitString(e);\n\t\t\t\te = {\n\t\t\t\t\tarray: [t, i]\n\t\t\t\t};\n\t\t\t\tvar s = new KJUR.asn1.DERSequence(e);\n\t\t\t\treturn s.getEncodedHex()\n\t\t\t},\n\t\t\tpn.prototype.getPublicBaseKeyB64 = function() {\n\t\t\t\treturn wn(this.getPublicBaseKey())\n\t\t\t},\n\t\t\tpn.prototype.wordwrap = function(e, t) {\n\t\t\t\tif (t = t || 64,\n\t\t\t\t\t!e)\n\t\t\t\t\treturn e;\n\t\t\t\tvar n = \"(.{1,\" + t + \"})( +|$\\n?)|(.{1,\" + t + \"})\";\n\t\t\t\treturn e.match(RegExp(n, \"g\")).join(\"\\n\")\n\t\t\t},\n\t\t\tpn.prototype.getPrivateKey = function() {\n\t\t\t\tvar e = \"-----BEGIN RSA PRIVATE KEY-----\\n\";\n\t\t\t\treturn e += this.wordwrap(this.getPrivateBaseKeyB64()) + \"\\n\",\n\t\t\t\t\te += \"-----END RSA PRIVATE KEY-----\"\n\t\t\t},\n\t\t\tpn.prototype.getPublicKey = function() {\n\t\t\t\tvar e = \"-----BEGIN PUBLIC KEY-----\\n\";\n\t\t\t\treturn e += this.wordwrap(this.getPublicBaseKeyB64()) + \"\\n\",\n\t\t\t\t\te += \"-----END PUBLIC KEY-----\"\n\t\t\t},\n\t\t\tpn.prototype.hasPublicKeyProperty = function(e) {\n\t\t\t\treturn e = e || {},\n\t\t\t\t\te.hasOwnProperty(\"n\") && e.hasOwnProperty(\"e\")\n\t\t\t},\n\t\t\tpn.prototype.hasPrivateKeyProperty = function(e) {\n\t\t\t\treturn e = e || {},\n\t\t\t\t\te.hasOwnProperty(\"n\") && e.hasOwnProperty(\"e\") && e.hasOwnProperty(\"d\") && e.hasOwnProperty(\"p\") && e.hasOwnProperty(\n\t\t\t\t\t\t\"q\") && e.hasOwnProperty(\"dmp1\") && e.hasOwnProperty(\"dmq1\") && e.hasOwnProperty(\"coeff\")\n\t\t\t},\n\t\t\tpn.prototype.parsePropertiesFrom = function(e) {\n\t\t\t\tthis.n = e.n,\n\t\t\t\t\tthis.e = e.e,\n\t\t\t\t\te.hasOwnProperty(\"d\") && (this.d = e.d,\n\t\t\t\t\t\tthis.p = e.p,\n\t\t\t\t\t\tthis.q = e.q,\n\t\t\t\t\t\tthis.dmp1 = e.dmp1,\n\t\t\t\t\t\tthis.dmq1 = e.dmq1,\n\t\t\t\t\t\tthis.coeff = e.coeff)\n\t\t\t};\n\t\tvar Jn = function(e) {\n\t\t\tpn.call(this),\n\t\t\t\te && (\"string\" == typeof e ? this.parseKey(e) : (this.hasPrivateKeyProperty(e) || this.hasPublicKeyProperty(e)) &&\n\t\t\t\t\tthis.parsePropertiesFrom(e))\n\t\t};\n\t\tJn.prototype = new pn,\n\t\t\tJn.prototype.constructor = Jn;\n\t\tvar Gn = function(e) {\n\t\t\te = e || {},\n\t\t\t\tthis.default_key_size = parseInt(e.default_key_size) || 1024,\n\t\t\t\tthis.default_public_exponent = e.default_public_exponent || \"010001\",\n\t\t\t\tthis.log = e.log || !1,\n\t\t\t\tthis.key = null\n\t\t};\n\t\tGn.prototype.setKey = function(e) {\n\t\t\t\tthis.log && this.key && console.warn(\"A key was already set, overriding existing.\"),\n\t\t\t\t\tthis.key = new Jn(e)\n\t\t\t},\n\t\t\tGn.prototype.setPrivateKey = function(e) {\n\t\t\t\tthis.setKey(e)\n\t\t\t},\n\t\t\tGn.prototype.setPublicKey = function(e) {\n\t\t\t\tthis.setKey(e)\n\t\t\t},\n\t\t\tGn.prototype.decrypt = function(e) {\n\t\t\t\ttry {\n\t\t\t\t\treturn this.getKey().decrypt(Cn(e))\n\t\t\t\t} catch (t) {\n\t\t\t\t\treturn !1\n\t\t\t\t}\n\t\t\t},\n\t\t\tGn.prototype.encrypt = function(e) {\n\t\t\t\ttry {\n\t\t\t\t\treturn wn(this.getKey().encrypt(e))\n\t\t\t\t} catch (t) {\n\t\t\t\t\treturn !1\n\t\t\t\t}\n\t\t\t},\n\t\t\tGn.prototype.getKey = function(e) {\n\t\t\t\tif (!this.key) {\n\t\t\t\t\tif (this.key = new Jn,\n\t\t\t\t\t\te && \"[object Function]\" === {}.toString.call(e))\n\t\t\t\t\t\treturn void this.key.generateAsync(this.default_key_size, this.default_public_exponent, e);\n\t\t\t\t\tthis.key.generate(this.default_key_size, this.default_public_exponent)\n\t\t\t\t}\n\t\t\t\treturn this.key\n\t\t\t},\n\t\t\tGn.prototype.getPrivateKey = function() {\n\t\t\t\treturn this.getKey().getPrivateKey()\n\t\t\t},\n\t\t\tGn.prototype.getPrivateKeyB64 = function() {\n\t\t\t\treturn this.getKey().getPrivateBaseKeyB64()\n\t\t\t},\n\t\t\tGn.prototype.getPublicKey = function() {\n\t\t\t\treturn this.getKey().getPublicKey()\n\t\t\t},\n\t\t\tGn.prototype.getPublicKeyB64 = function() {\n\t\t\t\treturn this.getKey().getPublicBaseKeyB64()\n\t\t\t},\n\t\t\te.JSEncrypt = Gn\n\t}(passport.lib.RSAExport),\n\tpassport.lib.RSA = passport.lib.RSAExport.JSEncrypt;\n\n// url 解析方法\nfunction urlprase(a) {\n\treturn String(a).replace(/[#%&+=\\/\\\\\\ \\　\\f\\r\\n\\t]/g, function(b) {\n\t\treturn \"%\" + (256 + b.charCodeAt()).toString(16).substring(1).toUpperCase()\n\t})\n}\n\n\nfunction test(pwd) {\n\t// 从三部曲的位置定义 e.RSA\n\tvar n = new passport.lib.RSA; // n = 实例化的 加密方法,等同于Gn\n\tn.setKey(\n\t\t\"-----BEGIN PUBLIC KEY-----\\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpm5sKQOivxCFkdQJtPfDtBX4U\\nQweH9OmCCjg46jH\\/DpuXF3RfEe5dMO99+QskfoI35xymDQyRrvX2iE7bKzxh3sOZ\\nI\\/vG1SnAEXid0+\\/yz1BLbJ9Djaffnx8F2pAKyK2PPk8XvJyOOVZAm6yiRO7VgeOv\\nkdXyYoqpokkgrbQkMQIDAQAB\\n-----END PUBLIC KEY-----\\n\"\n\t);\n\treturn urlprase(n.encrypt(pwd))\n}\n"
  },
  {
    "path": "其他实战/【百度】自动登录/login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-05  Python: 3.7\n\n\"\"\"\n百度登陆参数比较多\n\n这里是密码加密生成器\n\"\"\"\n\nimport js2py\n\n\nclass PingDuoDuoSpider(object):\n    \"\"\"\n    生成百度登陆密码加密结果\n    \"\"\"\n    context = js2py.EvalJs()  # python中使用js\n\n    def __init__(self):\n        # 初始化\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.context.execute(f.read())\n\n    def make(self, password):\n        pwd = self.context.test(password)\n        print(pwd)  # 打印加密之后的密码\n\n\nif __name__ == '__main__':\n    pdd = PingDuoDuoSpider()\n\n    key = input(\"输入密码\")\n    pdd.make(key)\n"
  },
  {
    "path": "其他实战/【百度街拍】图片下载/get_image.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-08-05  Python: 3.7\r\n\r\nimport requests, time\r\nfrom urllib.parse import urlencode\r\nfrom urllib.request import urlretrieve\r\n\r\n\r\ndef getPage(offset):\r\n    '''获取网页信息'''\r\n    data = {\r\n        'tn': 'resultjson_com',\r\n        'ipn': 'rj',\r\n        'ct': '201326592',\r\n        'is': '',\r\n        'fp': 'result',\r\n        'queryWord': '街拍',\r\n        'cl': '2',\r\n        'lm': '-1',\r\n        'ie': 'utf - 8',\r\n        'oe': 'utf - 8',\r\n        'adpicid': '',\r\n        'st': '-1',\r\n        'z': '',\r\n        'ic': '0',\r\n        'hd': '',\r\n        'latest': '',\r\n        'copyright': '',\r\n        'word': '街拍',\r\n        's': '',\r\n        'se': '',\r\n        'tab': '',\r\n        'width': '',\r\n        'height': '',\r\n        'face': '0',\r\n        'istype': '2',\r\n        'qc': '',\r\n        'nc': '1',\r\n        'fr': '',\r\n        'expermode': '',\r\n        'force': '',\r\n        'pn': offset,\r\n        'rn': '30',\r\n        'gsm': '1e',\r\n        '1551789143500': '',\r\n    }\r\n    headers = {\r\n        'Accept': 'text/plain, */*; q=0.01',\r\n        'Accept-Encoding': 'deflate, br',\r\n        'Accept-Language': 'Accept-Language',\r\n        'Connection': 'keep-alive',\r\n        'Cookie': 'BDqhfp=%E8%A1%97%E6%8B%8D%26%260-10-1undefined%26%260%26%261; BIDUPSID=7CA5F033CA22949F5FB6110DBC5DC1EE; BAIDUID=6DDE5BAA44763FD6C7CA84401CB19F36:FG=1; indexPageSugList=%5B%22%E8%A1%97%E6%8B%8D%22%5D; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; uploadTime=1551768107224; userFrom=null; BDRCVFR[X_XKQks0S63]=mk3SLVN4HKm; firstShowTip=1; cleanHistoryStatus=0',\r\n        'Host': 'image.baidu.com',\r\n        'Referer': 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E8%A1%97%E6%8B%8D&oq=%E8%A1%97%E6%8B%8D&rsp=-1',\r\n        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6735.400 QQBrowser/10.2.2328.400',\r\n        'X-Requested-With': 'XMLHttpRequest',\r\n    }\r\n    url = 'https://image.baidu.com/search/acjson?' + urlencode(data)\r\n    try:\r\n        res = requests.get(url, data=data, headers=headers)\r\n        res.encoding = 'utf-8'  # 网页信息编码\r\n        if res.status_code == 200:\r\n            return res.json()\r\n    except requests.ConnectionError:\r\n        return None\r\n\r\n\r\ndef getImage(json):\r\n    '''解析网页数据并爬取所需的信息'''\r\n    try:\r\n        data = json.get('data')\r\n        if data:\r\n            for item in data:\r\n                yield {\r\n                    'image': item.get('hoverURL'),\r\n                    'title': item.get('fromPageTitleEnc'),\r\n                }\r\n    except:\r\n        return None\r\n\r\n\r\ndef saveImage(item):\r\n    '''把获取的图片与标题封装并存储'''\r\n    try:\r\n        m = item.get('title')\r\n        local_image = item.get('image')  # 获取图片的url\r\n        image_url = local_image\r\n        urlretrieve(image_url, './pic/' + str(m) + '.jpg')\r\n        # print('p'+str(m) + '.jpg')\r\n    except:\r\n        return None\r\n\r\n\r\ndef main(offset):\r\n    '''调度爬取函数和存储'''\r\n    json = getPage(offset)\r\n    for item in getImage(json):\r\n        print(item)\r\n        saveImage(item)\r\n\r\n\r\nif __name__ == '__main__':\r\n    for i in range(5):  # 此处循环遍历五次是不可行的  每次data值中的gsm在变化\r\n        main(offset=i * 30)\r\n        time.sleep(1)\r\n"
  },
  {
    "path": "其他实战/【移动】登录参数生成/MakeParam.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-05  Python: 3.7\n\nimport execjs.runtime_names\n\n\nclass MakeParam:\n    \"\"\"\n    移动登陆\n    加密参数生成器\n    页面 https://mail.10086.cn/\n    \"\"\"\n\n    def __init__(self, name, pwd):\n        self.name = name\n        self.pwd = pwd\n        self.js = None\n        self.init_js()\n\n    def init_js(self):\n        print('引擎', execjs.get().name)\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def mk_params(self):\n        cguid = self.js.call(\"customerGetCGUID\")\n        _ = self.js.call('sha1', self.name)\n        word = self.js.call('calcDigest', self.pwd)\n        msg = \"\"\"\n        cguid: {cguid}\n        _: {_}\n        password: {word}\n        \"\"\"\n        print(msg.format(cguid=cguid, _=_, word=word))\n\n\nif __name__ == '__main__':\n    username = input('输入用户名')\n    password = input('输入密码')\n    yd = MakeParam(username, password)\n    yd.mk_params()\n"
  },
  {
    "path": "其他实战/【移动】登录参数生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【移动】登录参数生成/encryp.js",
    "content": "function sha1(a) {\n    function b(a, b) {\n        var c = (a & 65535) + (b & 65535);\n        return (a >> 16) + (b >> 16) + (c >> 16) << 16 | c & 65535\n    }\n\n    for (var c = [], d = 0; d < 8 * a.length; d += 8)\n        c[d >> 5] |= (a.charCodeAt(d / 8) & 255) << 24 - d % 32;\n    a = 8 * a.length;\n    c[a >> 5] |= 128 << 24 - a % 32;\n    c[(a + 64 >> 9 << 4) + 15] = a;\n    a = Array(80);\n    for (var d = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < c.length; h +=\n        16) {\n        for (var l = d, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {\n            a[j] = 16 > j ? c[h + j] : (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) << 1 | (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^\n                a[j - 16]) >>> 31;\n            var r = b(b(d << 5 | d >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^\n                f ^ g), b(b(k, a[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514)),\n                k = g,\n                g = f,\n                f = e << 30 | e >>> 2,\n                e = d,\n                d = r\n        }\n        d = b(d, l);\n        e = b(e, m);\n        f = b(f, n);\n        g = b(g, p);\n        k = b(k, q)\n    }\n    c = [d, e, f, g, k];\n    a = \"\";\n    for (d = 0; d < 4 * c.length; d++)\n        a += \"0123456789abcdef\".charAt(c[d >> 2] >> 8 * (3 - d % 4) + 4 & 15) + \"0123456789abcdef\".charAt(c[d >> 2] >> 8 *\n            (3 - d % 4) & 15);\n    return a\n}\n\n\nfunction a(a, c) {\n    var d = (a & 65535) + (c & 65535);\n    return (a >> 16) + (c >> 16) + (d >> 16) << 16 | d & 65535\n}\n\ncalcDigest = function (b) {\n    for (var c = (b.length + 8 >> 6) + 1, d = Array(16 * c), e = 0; e < 16 * c; e++)\n        d[e] = 0;\n    for (e = 0; e < b.length; e++)\n        d[e >> 2] |= b.charCodeAt(e) << 24 - 8 * (e & 3);\n    d[e >> 2] |= 128 << 24 - 8 * (e & 3);\n    d[16 * c - 1] = 8 * b.length;\n    b = Array(80);\n    for (var c = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < d.length; h +=\n        16) {\n        for (var l = c, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {\n            b[j] = 16 > j ? d[h + j] : (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) << 1 | (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^\n                b[j - 16]) >>> 31;\n            var r = a(a(c << 5 | c >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^\n                f ^ g), a(a(k, b[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514)),\n                k = g,\n                g = f,\n                f = e << 30 | e >>> 2,\n                e = c,\n                c = r\n        }\n        c = a(c, l);\n        e = a(e, m);\n        f = a(f, n);\n        g = a(g, p);\n        k = a(k, q)\n    }\n    d = [c, e, f, g, k];\n    b = \"\";\n    for (c = 0; c < 4 * d.length; c++)\n        b += \"0123456789abcdef\".charAt(d[c >> 2] >> 8 * (3 - c % 4) + 4 & 15) + \"0123456789abcdef\".charAt(d[c >> 2] >> 8 *\n            (3 - c % 4) & 15);\n    return b\n}\n\n\nfunction customerGetCGUID() {\n    function a(a, b) {\n        var e = (b || 2) - (1 + Math.floor(Math.log(a | 1) / Math.LN10 + 1E-15));\n        return Array(e + 1).join(\"0\") + a\n    }\n\n    var b = new Date;\n    return \"\" + a(b.getHours()) + a(b.getMinutes()) + a(b.getSeconds()) + a(b.getMilliseconds(), 3) + a(Math.ceil(9999 *\n        Math.random()), 4)\n}"
  },
  {
    "path": "其他实战/【空中网】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【空中网】自动登录/encryp.js",
    "content": "function mk_pwd (str, pwd) {\n    if (pwd == null || pwd.length <= 0) {\n        return null\n    }\n    ;var prand = \"\";\n    for (var i = 0; i < pwd.length; i++) {\n        prand += pwd.charCodeAt(i).toString()\n    }\n    ;var sPos = Math.floor(prand.length / 5);\n    var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) + prand.charAt(sPos * 4) + prand.charAt(sPos * 5));\n    var incr = Math.ceil(pwd.length / 2);\n    var modu = Math.pow(2, 31) - 1;\n    if (mult < 2) {\n        return null\n    }\n    ;var salt = Math.round(Math.random() * 1000000000) % 100000000;\n    prand += salt;\n    while (prand.length > 10) {\n        var a = prand.substring(0, 1);\n        var b = prand.substring(10, prand.length);\n        if (b.length > 10) {\n            prand = b\n        } else {\n            prand = (parseInt(a) + parseInt(b)).toString()\n        }\n    }\n    ;prand = (mult * prand + incr) % modu;\n    var enc_chr = \"\";\n    var enc_str = \"\";\n    for (var i = 0; i < str.length; i++) {\n        enc_chr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));\n        if (enc_chr < 16) {\n            enc_str += \"0\" + enc_chr.toString(16)\n        } else\n            enc_str += enc_chr.toString(16);\n        prand = (mult * prand + incr) % modu\n    }\n    ;salt = salt.toString(16);\n    while (salt.length < 8)\n        salt = \"0\" + salt;\n    enc_str += salt;\n    return enc_str\n}"
  },
  {
    "path": "其他实战/【空中网】自动登录/spider_login.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-03  Python: 3.7\nimport re\nimport time\nimport requests\nimport execjs.runtime_names\n\n\nclass SpiderLogin:\n    \"\"\"\n    空中网爬虫登陆\n    \"\"\"\n\n    def __init__(self, user, pwd):\n        self.session = requests.session()\n        self.user = user\n        self.pwd = pwd\n        self.login_time = int(round(time.time() * 1000))\n        self.url = 'https://m.wcbchina.com/login/other-login.html'\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',\n            'Host': 'sso.kongzhong.com',\n            'Referer': 'https://passport.kongzhong.com/login'\n        }\n\n    def use_js(self, dc):\n        \"\"\"js 调用\n        \"\"\"\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            js = execjs.compile(f.read())\n        try:\n            pwd = js.call(\"mk_pwd\", self.pwd, dc)\n            return pwd\n        except Exception:\n            print('js 异常')\n\n    def auto_login(self):\n        \"\"\"登陆\n        \"\"\"\n        login_url = 'https://sso.kongzhong.com/ajaxLogin?j=j&&type=1&service=https://passport.kongzhong.com/&username={username}&password={password}&vcode=&toSave=0&_={_time}'\n        dc = self.get_dc()\n        en_pwd = self.use_js(dc)\n        response = self.session.get(login_url.format(username=self.user, password=en_pwd, _time=self.login_time), headers=self.headers)\n        print(response.cookies)\n        print(response.text)\n        print(response)\n\n    def get_dc(self):\n        \"\"\"捕获 dc 参数\n        \"\"\"\n        target = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_={t}'.format(\n            t=self.login_time)\n        response = self.session.get(target, headers=self.headers)\n        try:\n            dc = re.search(r'\"dc\":\"(.*?)\",\"kzmsg', response.text).group(1)\n            return dc\n        except AttributeError:\n            print('dc 捕获失败')\n\n\nif __name__ == '__main__':\n    username = input('请输入账号')\n    password = input('密码')\n    kzw = SpiderLogin(username, password)\n    kzw.auto_login()\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/README.md",
    "content": "```\n.\n└── MeiTuan                              // -------美团-------\n     ├── get_login_cookies.py            // 基于pyppeteer登陆并获取cookies\n     ├── parse_play_areas.py             // 三级区域解析器(休闲板块)\n     ├── parse_play_info.py              // 休闲会所商铺数据解析\n     ├── parse_hotel_info.py             // 酒店基础数据解析\n     ├── parse_hotel_comments.py         // 酒店评论解析\n     ├── create_food_token.py            // 餐饮页Token生成器\n     ├── parse_food_comments.py          // 获取用户评论数据\n     └── parse_food_info.py              // 解析餐馆数据\n\n```\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/create_food_token.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-21  Python: 3.7\n\nimport json, zlib, base64, time\n\n\nclass MakeToken():\n    \"\"\"\n    测试2019-4-21日可用\n    仅作为学术交流！如有侵权，联系作者删除\n    美团【餐馆列表】Token生成\n    \"\"\"\n\n    def __init__(self, areaId, cityName, originUrl, page):\n        self.areaId = areaId\n        self.cityName = cityName\n        self.originUrl = originUrl\n        self.page = page\n        self.uuid = 'c6eada3ffd8e444491e9.1555472928.3.0.0'  # Demo\n\n    def join_sign(self):\n        # 参数\n        sign = 'areaId={areaId}&cateId=0&cityName={cityName}&dinnerCountAttrId=&optimusCode=1&originUrl={originUrl}&page={page}&partner=126&platform=1&riskLevel=1&sort=&userId=&uuid={uuid}'\n        _str = sign.format(areaId=self.areaId, cityName=self.cityName, originUrl=self.originUrl, page=self.page,\n                           uuid=self.uuid)\n        sign = base64.b64encode(zlib.compress(bytes(json.dumps(_str, ensure_ascii=False), encoding=\"utf8\")))\n        sign = str(sign, encoding=\"utf8\")\n        return sign\n\n    @property\n    def join_token(self):\n        str_json = {}\n        str_json['rId'] = 100900\n        str_json['ver'] = '1.0.6'\n        str_json['ts'] = time.time()\n        str_json['cts'] = time.time() + 110\n        str_json['brVD'] = [1920, 315]\n        str_json['brR'] = [[1920, 1080], [1920, 1057], 24, 24]\n        str_json['bI'] = [self.originUrl, \"\"]\n        str_json['mT'] = []\n        str_json['kT'] = []\n        str_json['aT'] = []\n        str_json['tT'] = []\n        str_json['aM'] = ''\n        str_json['sign'] = self.join_sign()\n        token_decode = zlib.compress(\n            bytes(json.dumps(str_json, separators=(',', ':'), ensure_ascii=False), encoding=\"utf8\"))\n        token = str(base64.b64encode(token_decode), encoding=\"utf8\")\n        return token\n\n\nif __name__ == '__main__':\n    # 测试数据\n    areaId = '4581'\n    cityName = '重庆'\n    originUrl = 'http://cq.meituan.com/meishi/b4581/'\n    page = '1'\n\n    token = MakeToken(areaId, cityName, originUrl, page)\n    print(token.join_token)\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/get_login_cookies.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-21  Python: 3.7\nimport asyncio\nimport json\n\nfrom pyppeteer import launch\n\n\nclass MeiTuanCookies():\n    def __init__(self, username, password):\n        self.login_url = 'https://passport.meituan.com/account/unitivelogin'\n        self.username = username\n        self.password = password\n\n    async def star(self):\n        browser = await launch()\n        context = await browser.createIncogniteBrowserContext()\n        page = await context.newPage()\n        await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'\n                                         '{ webdriver:{ get: () => false } }) }')  # 本页刷新后值不变\n\n        await page.goto(self.login_url)\n        await page.type('input#login-email', self.username)\n        await page.type('input#login-password', self.password)\n        await page.click('input.btn')\n        await self.get_cookie(page)\n\n    async def get_cookie(self, page):\n        \"\"\"\n        获取 cookies\n        :param page: 页面\n        :return:\n        \"\"\"\n        cookies_list = await page.cookies()\n        cookies = ''\n        for cookie in cookies_list:\n            str_cookie = '{0}={1};'\n            str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value'))\n            cookies += str_cookie\n        print(cookies)\n\n\nif __name__ == '__main__':\n    name = input('美团账号')\n    pwd = input('密码')\n    mt = MeiTuanCookies(name, pwd)\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(mt.star())\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_food_comments.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-17  Python: 3.7\n\nimport requests\nimport json\nimport time\n\nfrom urllib import parse\n\n\nclass ParseComments(object):\n    def __init__(self, shop_id):\n        self.shop_id = shop_id\n\n        self.get_data()\n\n    def get_data(self):\n        url_code = self.get_originUrl()\n\n        url = 'http://www.meituan.com/meishi/api/poi/getMerchantComment?'\n        params = {\n            'platform': '1',\n            'partner': '126',\n            'originUrl': url_code,\n            'riskLevel': '1',\n            'optimusCode': '1',\n            'id': self.shop_id,\n            'offset': '0',\n            'pageSize': '10',\n            'sortType': '1',\n        }\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n        }\n        response = requests.get(url=url, params=params, headers=headers)\n        data = response.text\n        self.parse(data)\n\n    def get_originUrl(self):\n        \"\"\"编码解码\n        \"\"\"\n        return parse.quote_plus('http://www.meituan.com/meishi/' + self.shop_id + '/')\n\n    def parse(self, data):\n        \"\"\"解析数据\n        \"\"\"\n        data_dict = json.loads(data)\n        for item in data_dict.get('data').get('comments'):\n            create_time = self.parse_time(item.get('commentTime'))\n            print_str = \"\"\"\n            评论用户：{userName}\n            评论时间：{create_time}\n            评论详情：{comment}\n            评论id：{reviewId}\n            \"\"\".format(userName=item.get('userName'), comment=item.get('comment'), create_time=create_time,\n                       reviewId=item.get('reviewId'))\n            print(print_str)\n\n    @staticmethod\n    def parse_time(timeStamp):\n        \"\"\"13位 解码时间\n        \"\"\"\n        time_stamp = float(int(timeStamp) / 1000)\n        time_array = time.localtime(time_stamp)\n        return time.strftime(\"%Y-%m-%d %H:%M:%S\", time_array)\n\n\nif __name__ == '__main__':\n    p_id = input('请输入餐馆id')\n    ParseComments(p_id)\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_food_info.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-18  Python: 3.7\n\n\"\"\"\n解析菜馆信息\n\"\"\"\nimport requests\nimport re\nimport json\n\n\nclass ParseRestaurantInfo(object):\n    target_url = 'https://www.meituan.com/meishi/{p_id}/'\n    headers = {\n        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n    }\n\n    def __init__(self, restaurant_id):\n        self.restaurant_id = restaurant_id\n\n        self.go_to_restaurant()\n\n    def go_to_restaurant(self):\n        \"\"\"执行访问\n        \"\"\"\n        url = self.target_url.format(p_id=self.restaurant_id)\n        data = requests.get(url, headers=self.headers).text\n\n        # 提取有效区域\n        data = re.search(r'12315消费争议(.*?)\"dealList\":', data, flags=re.DOTALL)\n        if data:\n            self.parse_html(data.group(1))\n        else:\n            print('访问失效')\n\n    @staticmethod\n    def parse_html(data):\n        \"\"\"解析数据\n        \"\"\"\n\n        # 细节信息\n        detail_info = re.search(\n            r'\"detailInfo\":\\{\"poiId\":(\\d+),\"name\":\"(.*?)\",\"avgScore\":(.*?),\"address\":\"(.*?)\",\"phone\":\"(.*?)\",\"openTime\":\"(.*?)\",\"extraInfos\":\\[(.*?)\\],\"hasFoodSafeInfo\":(.*?),\"longitude\":(.*?),\"latitude\":(.*?),\"avgPrice\":(\\d+),\"brandId\":(\\d+),\"brandName\":\"(.*?)\",\".*?photos\":{\"frontImgUrl\":\"(.*?)\",\"albumImgUrls\":(.*?)},\"recommended\":(.*?),\"crumbNav\":(.*?),\"prefer',\n            data)\n        if detail_info:\n            poiId = detail_info.group(1)\n            name = detail_info.group(2)\n            avgScore = detail_info.group(3)\n            address = detail_info.group(4)\n            phone = detail_info.group(5)\n            openTime = detail_info.group(6)\n            extraInfos = detail_info.group(7)\n            hasFoodSafeInfo = detail_info.group(8)\n            longitude = detail_info.group(9)\n            latitude = detail_info.group(10)\n            avgPrice = detail_info.group(11)\n            brandId = detail_info.group(12)\n            brandName = detail_info.group(13)\n            frontImgUrl = detail_info.group(14)\n            albumImgUrls = detail_info.group(15)\n\n            # 其他信息解析\n            if extraInfos:\n                items = json.loads(\"[\" + extraInfos + \"]\")\n                extraInfos = ''\n                for item in items:\n                    extraInfos = item.get('text') + '  ' + extraInfos\n            # 推荐菜处理\n            recommended = json.loads(detail_info.group(16))\n\n            # 面包屑抽离\n            crumbNav = json.loads(detail_info.group(17))\n            area = crumbNav[0].get('title')[:-2]\n            food_type = crumbNav[2].get('title')[len(area):]\n            print('区域: ', area, ' 餐饮类型: ', food_type)\n\n            print_str = \"\"\"\n========解析结果========\n店铺ID: {poiId}\n餐馆名称: {name}\n综合评分: {avgScore}\n详细地址: {address}\n联系电话: {phone}\n营业时间: {openTime}\n其他信息: {extraInfos}\n是否有卫生许可证: {hasFoodSafeInfo}\n经度: {longitude}\n纬度: {latitude}\n平均消费: {avgPrice}\n所属品牌ID: {brandId}\n品牌: {brandName}\n店铺主图: {frontImgUrl}\n相册: {albumImgUrls}\n\n推荐菜品区：\"\"\".format(poiId=poiId, name=name, avgScore=avgScore, address=address, phone=phone, openTime=openTime,\n                 extraInfos=extraInfos, hasFoodSafeInfo=hasFoodSafeInfo, longitude=longitude, latitude=latitude,\n                 avgPrice=avgPrice, brandId=brandId, brandName=brandName, frontImgUrl=frontImgUrl,\n                 albumImgUrls=albumImgUrls)\n\n            print(print_str)\n\n            # 打印推荐菜\n            for item in list(recommended):\n                # recommend_id = item['id']  # 推荐菜id\n                recommend_name = item['name']  # 推荐菜名\n                recommend_price = item['price']  # 菜品价格\n                recommend_img = item['frontImgUrl']  # 菜品图片\n                print(recommend_name, end=' ')\n\n        else:\n            print('数据信息失败')\n\n\nif __name__ == '__main__':\n    p_id = input('请输入餐馆id')\n    # p_id = '364942'\n    # p_id = '98327266'\n    # p_id = '6902945'\n    ParseRestaurantInfo(p_id)\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_hotel_comments.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-10  Python: 3.7\n\n\"\"\"\n解析酒店评论\n\"\"\"\n\nimport requests\nimport json\nimport time\n\n\nclass ParseComments(object):\n    \"\"\"解析酒店评论\n    \"\"\"\n    def __init__(self, hotel_id):\n        self.hotel_id = hotel_id\n        self.get_data()\n\n    def get_data(self):\n\n        url = 'https://ihotel.meituan.com/group/v1/poi/comment/' + self.hotel_id + '?'\n        params = {\n            'sortType': 'default',\n            'noempty': '1',\n            'withpic': '0',\n            'filter': 'all',\n            'limit': '10',\n            'offset': '0',\n        }\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n        }\n        response = requests.get(url=url, params=params, headers=headers)\n        data = response.text\n        self.parse(data)\n\n    def parse(self, data):\n        \"\"\"解析数据\n        \"\"\"\n        data_dict = json.loads(data)\n        for item in data_dict.get('data').get('feedback'):\n            create_time = self.parse_time(item.get('replytimestamp'))\n            print_str = \"\"\"\n            评论用户：{userName}\n            评论时间：{create_time}\n            评论详情：{comment}\n            满意度：{scoretext}\n            \"\"\".format(userName=item.get('username'), comment=item.get('comment'), create_time=create_time,\n                       scoretext=item.get('scoretext'))\n            print(print_str)\n            self.parse_pic(item)\n\n    @staticmethod\n    def parse_time(timeStamp):\n        \"\"\"13位 解码时间\n        \"\"\"\n        time_array = time.localtime(timeStamp)\n        return time.strftime(\"%Y-%m-%d %H:%M:%S\", time_array)\n\n    def parse_pic(self, item):\n        pic_list = [i.get('url').replace('w.h', '750.0') for i in item.get('picinfo')]\n        print(pic_list)\n\n\nif __name__ == '__main__':\n    p_id = input('请输入酒店id')\n    ParseComments(p_id)\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_hotel_info.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-05  Python: 3.7\n\n\"\"\"\n解析\n美团酒店店铺的基础信息\n该板块信息隐藏在get请求后的js中直接用正则匹配出信息再抽取出来\n\"\"\"\nimport requests\nimport re\nimport json\nimport time\n\n\nclass ParseHotelInfo(object):\n    headers = {\n        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n    }\n\n    def __init__(self, p_id):\n        self.p_id = p_id\n\n    def go_to_hotel(self):\n        \"\"\"执行访问\n        \"\"\"\n        # 拼接日期\n        now_day = time.strftime('%Y-%m-%d', time.localtime(time.time()))\n\n        # 组合 get 地址\n        url = 'https://hotel.meituan.com/' + self.p_id + '/?ci=' + now_day + '&co=' + now_day\n        data = requests.get(url, headers=self.headers).content.decode('utf-8')\n\n        # 提取有效区域\n        info = re.search(r'window.__INITIAL_STATE__=(.*?)</script>', data, flags=re.DOTALL)\n        if info:\n            info_dict = json.loads(info.group(1).strip()[:-1])\n            self.parse_html(info_dict)\n        else:\n            print('访问失效')\n\n    def parse_html(self, data_dict):\n        data = data_dict.get('poiData')\n        print('店名', data.get('name'))\n        print('店铺id', data.get('poiid'))\n        print('城市id', data.get('cityId'))\n        print('地址', data.get('addr'))\n        print('lng', data.get('lng'))\n        print('lat', data.get('lat'))\n        print('封面', data.get('frontImg').replace('w.h', '750.0'))\n        print('wifi', data.get('wifi'))\n        print('地区id', data.get('areaId'))\n        print('地区名', data.get('areaName'))\n        print('平均消费', data.get('avgPrice'))\n        print('类别id', data.get('brandId'))\n        print('类别名', data.get('brandName'))\n        print('简介', data.get('introduction'))\n        print('星级', data.get('highHotelStar'))\n        print('舒适类型', data.get('hotelStar'))\n        print('电话', [i.get('phone') for i in data.get('phoneList')])\n        print('平均分', data.get('avgScore'))\n        print('标签', data.get('poiAttrTagList'))\n        print('城市名', data.get('cityName'))\n        print('城市拼音', data.get('cityPinyin'))\n\n        poi_data = data_dict.get('poiExt')  # 酒店详情\n        print('服务', [i.get('attrDesc') for i in poi_data.get('serviceIconsInfo').get('serviceIcons')])\n        print('酒店介绍', {i.get('attrDesc'): i.get('attrValue') for i in poi_data.get('hotelIntroInfo').get('poiExtendsInfos')})\n\n\nif __name__ == '__main__':\n    print(\"\"\"\\033[1;33m请输入酒店ID \\033[0m\"\"\")\n    _id = input('(链接末尾数字就是ID)')\n    # _id = '41823880'  # 测试\n    hotel = ParseHotelInfo(_id)\n    hotel.go_to_hotel()\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_play_areas.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-05  Python: 3.7\n\nimport requests\nimport json\nimport re\nfrom pypinyin import pinyin\n\n\nclass ParseAreas(object):\n\n    def __init__(self, city_name):\n        self.alphabet = \"\".join([i[0][0] for i in pinyin(city_name)])\n\n        self.get_data()\n\n    def get_data(self):\n\n        url = 'https://{city}.meituan.com/xiuxianyule/'\n        headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n        }\n        target_url = url.format(city=self.alphabet)\n        response = requests.get(target_url, headers=headers)\n        data = response.text\n        self.parse(data, target_url)\n\n    @ staticmethod\n    def parse(data, url):\n        \"\"\"解析数据\n        \"\"\"\n        py_dict = {}\n        text = re.search(r'\"city\":{\"id\":(.*?),\"name\":\"(.*?)\",\"pinyin\".*?\"area\":(.*?),\"category\":', data)\n        if text:\n            py_dict = {'城市': text.group(2), '城市ID': text.group(1)}\n            dict_info = json.loads(text.group(3)).get('children')  # 提取区域信息\n            py_dict['区'] = []\n\n            for node in dict_info:\n                if node.get('name') == '推荐商圈':\n                    continue  # 推荐商圈过滤\n                # 二级区域\n                district = {'区名': node.get('name'), '区ID': node.get('id'),\n                            '区链接': url + 'b' + str(node.get('id')) + '/'}\n                if node.get('children'):\n                    district['街道'] = []\n                    # 三级区域\n                    for i in node.get('children'):\n                        area = {'街道名': i.get('name'), '街道ID': i.get('id'),\n                                '街道链接': url + 'b' + str(i.get('id')) + '/'}\n                        district['街道'].append(area)\n\n                py_dict['区'].append(district)\n\n        print(json.dumps(py_dict, ensure_ascii=False))\n\n\nif __name__ == '__main__':\n    print(\"\"\"\n    \\033[1;33m娱乐板块区域解析\n    请输入城市名例如  北京   \n    返回json格式\\033[0m\n    \"\"\")\n    chines = input('输入城市名')\n    ParseAreas(chines)\n"
  },
  {
    "path": "其他实战/【美团】数据解析、token生成/parse_play_info.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-08  Python: 3.7\n\n\"\"\"\n解析\n美团休闲娱乐商铺信息\n该板块信息隐藏在get请求后的js中直接用正则匹配出信息再抽取出来\n\"\"\"\nimport requests\nimport re\nimport json\n\n\nclass ParsePlayInfo(object):\n    target_url = 'http://www.meituan.com/xiuxianyule/{p_id}/'\n    headers = {\n        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n    }\n\n    def __init__(self, restaurant_id):\n        self.restaurant_id = str(restaurant_id)\n\n        self.go_to_restaurant()\n\n    def go_to_restaurant(self):\n        \"\"\"执行访问\n        \"\"\"\n        url = self.target_url.format(p_id=self.restaurant_id)\n        data = requests.get(url, headers=self.headers).text\n\n        # 提取有效区域\n        data = re.search(r'\"params\":{\"poiInfo\":(.*?)},\"fallbackPara', data, flags=re.DOTALL)\n        if data:\n            self.parse_html(json.loads(data.group(1)))\n        else:\n            print('访问失效')\n\n    def parse_html(self, data):\n        print('商铺ID', self.restaurant_id)\n        print('城市ID', data.get('catId'))\n        print('城市', data.get('cityName'))\n        print('城市拼音', data.get('cityPy'))\n        print('店铺', data.get('shopName'))\n        print('评分', data.get('score'))\n        print('平均消费', data.get('avgPrice'))\n        print('地址', data.get('address'))\n        print('电话', data.get('phone'))\n        print('营业时间', data.get('openTime'))\n        print('封面图片', data.get('headIcon'))\n        print('wifi', data.get('wifi'))  # 有=1  无=0\n        print('停车', data.get('park'))  # 如果有例如：免费提供5个停车位。 没有为空\n        print('经度', data.get('lng'))\n        print('纬度', data.get('lat'))\n        print('类型', data.get('breadCrumbNavDTOList')[2].get('title')[len(data.get('cityName')):])\n\n        albums = []\n        images = data.get('albumDTOList')\n        for node in images:\n            albums.append(node.get('url'))\n        print('相册', albums)\n\n\nif __name__ == '__main__':\n    print(\"\"\"\n    \\033[1;33m请输入商铺ID \\033[0m\n    \"\"\")\n    p_id = input('(商铺网址末尾数字就是ID)')\n    ParsePlayInfo(p_id)\n"
  },
  {
    "path": "其他实战/【试客联盟】登录/execute.js",
    "content": "function BarrettMu(m) {\r\n\t\t\t\tthis.modulus = biCopy(m);\r\n\t\t\t\tthis.k = biHighIndex(this.modulus) + 1;\r\n\t\t\t\tvar b2k = new BigInt();\r\n\t\t\t\tb2k.digits[2 * this.k] = 1;\r\n\t\t\t\tthis.mu = biDivide(b2k, this.modulus);\r\n\t\t\t\tthis.bkplus1 = new BigInt();\r\n\t\t\t\tthis.bkplus1.digits[this.k + 1] = 1;\r\n\t\t\t\tthis.modulo = BarrettMu_modulo;\r\n\t\t\t\tthis.multiplyMod = BarrettMu_multiplyMod;\r\n\t\t\t\tthis.powMod = BarrettMu_powMod;\r\n\t\t\t}\r\n\r\n\t\t\tfunction BarrettMu_modulo(x) {\r\n\t\t\t\tvar q1 = biDivideByRadixPower(x, this.k - 1);\r\n\t\t\t\tvar q2 = biMultiply(q1, this.mu);\r\n\t\t\t\tvar q3 = biDivideByRadixPower(q2, this.k + 1);\r\n\t\t\t\tvar r1 = biModuloByRadixPower(x, this.k + 1);\r\n\t\t\t\tvar r2term = biMultiply(q3, this.modulus);\r\n\t\t\t\tvar r2 = biModuloByRadixPower(r2term, this.k + 1);\r\n\t\t\t\tvar r = biSubtract(r1, r2);\r\n\t\t\t\tif (r.isNeg) {\r\n\t\t\t\t\tr = biAdd(r, this.bkplus1);\r\n\t\t\t\t}\r\n\t\t\t\tvar rgtem = biCompare(r, this.modulus) >= 0;\r\n\t\t\t\twhile (rgtem) {\r\n\t\t\t\t\tr = biSubtract(r, this.modulus);\r\n\t\t\t\t\trgtem = biCompare(r, this.modulus) >= 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn r;\r\n\t\t\t}\r\n\r\n\t\t\tfunction BarrettMu_multiplyMod(x, y) {\r\n\t\t\t\tvar xy = biMultiply(x, y);\r\n\t\t\t\treturn this.modulo(xy);\r\n\t\t\t}\r\n\r\n\t\t\tfunction BarrettMu_powMod(x, y) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tresult.digits[0] = 1;\r\n\t\t\t\tvar a = x;\r\n\t\t\t\tvar k = y;\r\n\t\t\t\twhile (true) {\r\n\t\t\t\t\tif ((k.digits[0] & 1) != 0)\r\n\t\t\t\t\t\tresult = this.multiplyMod(result, a);\r\n\t\t\t\t\tk = biShiftRight(k, 1);\r\n\t\t\t\t\tif (k.digits[0] == 0 && biHighIndex(k) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\ta = this.multiplyMod(a, a);\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t};\r\n\t\t\tvar biRadixBase = 2;\r\n\t\t\tvar biRadixBits = 16;\r\n\t\t\tvar bitsPerDigit = biRadixBits;\r\n\t\t\tvar biRadix = 1 << 16;\r\n\t\t\tvar biHalfRadix = biRadix >>> 1;\r\n\t\t\tvar biRadixSquared = biRadix * biRadix;\r\n\t\t\tvar maxDigitVal = biRadix - 1;\r\n\t\t\tvar maxInteger = 9999999999999998;\r\n\t\t\tvar maxDigits;\r\n\t\t\tvar ZERO_ARRAY;\r\n\t\t\tvar bigZero, bigOne;\r\n\r\n\t\t\tfunction setMaxDigits(value) {\r\n\t\t\t\tmaxDigits = value;\r\n\t\t\t\tZERO_ARRAY = new Array(maxDigits);\r\n\t\t\t\tfor (var iza = 0; iza < ZERO_ARRAY.length; iza++)\r\n\t\t\t\t\tZERO_ARRAY[iza] = 0;\r\n\t\t\t\tbigZero = new BigInt();\r\n\t\t\t\tbigOne = new BigInt();\r\n\t\t\t\tbigOne.digits[0] = 1;\r\n\t\t\t}\r\n\t\t\tsetMaxDigits(20);\r\n\t\t\tvar dpl10 = 15;\r\n\t\t\tvar lr10 = biFromNumber(1000000000000000);\r\n\r\n\t\t\tfunction BigInt(flag) {\r\n\t\t\t\tif (typeof flag == \"boolean\" && flag == true) {\r\n\t\t\t\t\tthis.digits = null;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.digits = ZERO_ARRAY.slice(0);\r\n\t\t\t\t}\r\n\t\t\t\tthis.isNeg = false;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biFromDecimal(s) {\r\n\t\t\t\tvar isNeg = s.charAt(0) == '-';\r\n\t\t\t\tvar i = isNeg ? 1 : 0;\r\n\t\t\t\tvar result;\r\n\t\t\t\twhile (i < s.length && s.charAt(i) == '0')\r\n\t\t\t\t\t++i;\r\n\t\t\t\tif (i == s.length) {\r\n\t\t\t\t\tresult = new BigInt();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar digitCount = s.length - i;\r\n\t\t\t\t\tvar fgl = digitCount % dpl10;\r\n\t\t\t\t\tif (fgl == 0)\r\n\t\t\t\t\t\tfgl = dpl10;\r\n\t\t\t\t\tresult = biFromNumber(Number(s.substr(i, fgl)));\r\n\t\t\t\t\ti += fgl;\r\n\t\t\t\t\twhile (i < s.length) {\r\n\t\t\t\t\t\tresult = biAdd(biMultiply(result, lr10), biFromNumber(Number(s.substr(i, dpl10))));\r\n\t\t\t\t\t\ti += dpl10;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult.isNeg = isNeg;\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biCopy(bi) {\r\n\t\t\t\tvar result = new BigInt(true);\r\n\t\t\t\tresult.digits = bi.digits.slice(0);\r\n\t\t\t\tresult.isNeg = bi.isNeg;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biFromNumber(i) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tresult.isNeg = i < 0;\r\n\t\t\t\ti = Math.abs(i);\r\n\t\t\t\tvar j = 0;\r\n\t\t\t\twhile (i > 0) {\r\n\t\t\t\t\tresult.digits[j++] = i & maxDigitVal;\r\n\t\t\t\t\ti >>= biRadixBits;\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction reverseStr(s) {\r\n\t\t\t\tvar result = \"\";\r\n\t\t\t\tfor (var i = s.length - 1; i > -1; --i) {\r\n\t\t\t\t\tresult += s.charAt(i);\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\tvar hexatrigesimalToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',\r\n\t\t\t\t'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');\r\n\r\n\t\t\tfunction biToString(x, radix) {\r\n\t\t\t\tvar b = new BigInt();\r\n\t\t\t\tb.digits[0] = radix;\r\n\t\t\t\tvar qr = biDivideModulo(x, b);\r\n\t\t\t\tvar result = hexatrigesimalToChar[qr[1].digits[0]];\r\n\t\t\t\twhile (biCompare(qr[0], bigZero) == 1) {\r\n\t\t\t\t\tqr = biDivideModulo(qr[0], b);\r\n\t\t\t\t\tdigit = qr[1].digits[0];\r\n\t\t\t\t\tresult += hexatrigesimalToChar[qr[1].digits[0]];\r\n\t\t\t\t}\r\n\t\t\t\treturn (x.isNeg ? \"-\" : \"\") + reverseStr(result);\r\n\t\t\t}\r\n\r\n\t\t\tfunction biToDecimal(x) {\r\n\t\t\t\tvar b = new BigInt();\r\n\t\t\t\tb.digits[0] = 10;\r\n\t\t\t\tvar qr = biDivideModulo(x, b);\r\n\t\t\t\tvar result = String(qr[1].digits[0]);\r\n\t\t\t\twhile (biCompare(qr[0], bigZero) == 1) {\r\n\t\t\t\t\tqr = biDivideModulo(qr[0], b);\r\n\t\t\t\t\tresult += String(qr[1].digits[0]);\r\n\t\t\t\t}\r\n\t\t\t\treturn (x.isNeg ? \"-\" : \"\") + reverseStr(result);\r\n\t\t\t}\r\n\t\t\tvar hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');\r\n\r\n\t\t\tfunction digitToHex(n) {\r\n\t\t\t\tvar mask = 0xf;\r\n\t\t\t\tvar result = \"\";\r\n\t\t\t\tfor (i = 0; i < 4; ++i) {\r\n\t\t\t\t\tresult += hexToChar[n & mask];\r\n\t\t\t\t\tn >>>= 4;\r\n\t\t\t\t}\r\n\t\t\t\treturn reverseStr(result);\r\n\t\t\t}\r\n\r\n\t\t\tfunction biToHex(x) {\r\n\t\t\t\tvar result = \"\";\r\n\t\t\t\tvar n = biHighIndex(x);\r\n\t\t\t\tfor (var i = biHighIndex(x); i > -1; --i) {\r\n\t\t\t\t\tresult += digitToHex(x.digits[i]);\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction charToHex(c) {\r\n\t\t\t\tvar ZERO = 48;\r\n\t\t\t\tvar NINE = ZERO + 9;\r\n\t\t\t\tvar littleA = 97;\r\n\t\t\t\tvar littleZ = littleA + 25;\r\n\t\t\t\tvar bigA = 65;\r\n\t\t\t\tvar bigZ = 65 + 25;\r\n\t\t\t\tvar result;\r\n\t\t\t\tif (c >= ZERO && c <= NINE) {\r\n\t\t\t\t\tresult = c - ZERO;\r\n\t\t\t\t} else if (c >= bigA && c <= bigZ) {\r\n\t\t\t\t\tresult = 10 + c - bigA;\r\n\t\t\t\t} else if (c >= littleA && c <= littleZ) {\r\n\t\t\t\t\tresult = 10 + c - littleA;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = 0;\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction hexToDigit(s) {\r\n\t\t\t\tvar result = 0;\r\n\t\t\t\tvar sl = Math.min(s.length, 4);\r\n\t\t\t\tfor (var i = 0; i < sl; ++i) {\r\n\t\t\t\t\tresult <<= 4;\r\n\t\t\t\t\tresult |= charToHex(s.charCodeAt(i))\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biFromHex(s) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tvar sl = s.length;\r\n\t\t\t\tfor (var i = sl, j = 0; i > 0; i -= 4,\r\n\t\t\t\t\t++j) {\r\n\t\t\t\t\tresult.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4)));\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biFromString(s, radix) {\r\n\t\t\t\tvar isNeg = s.charAt(0) == '-';\r\n\t\t\t\tvar istop = isNeg ? 1 : 0;\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tvar place = new BigInt();\r\n\t\t\t\tplace.digits[0] = 1;\r\n\t\t\t\tfor (var i = s.length - 1; i >= istop; i--) {\r\n\t\t\t\t\tvar c = s.charCodeAt(i);\r\n\t\t\t\t\tvar digit = charToHex(c);\r\n\t\t\t\t\tvar biDigit = biMultiplyDigit(place, digit);\r\n\t\t\t\t\tresult = biAdd(result, biDigit);\r\n\t\t\t\t\tplace = biMultiplyDigit(place, radix);\r\n\t\t\t\t}\r\n\t\t\t\tresult.isNeg = isNeg;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biToBytes(x) {\r\n\t\t\t\tvar result = \"\";\r\n\t\t\t\tfor (var i = biHighIndex(x); i > -1; --i) {\r\n\t\t\t\t\tresult += digitToBytes(x.digits[i]);\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction digitToBytes(n) {\r\n\t\t\t\tvar c1 = String.fromCharCode(n & 0xff);\r\n\t\t\t\tn >>>= 8;\r\n\t\t\t\tvar c2 = String.fromCharCode(n & 0xff);\r\n\t\t\t\treturn c2 + c1;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biDump(b) {\r\n\t\t\t\treturn (b.isNeg ? \"-\" : \"\") + b.digits.join(\" \");\r\n\t\t\t}\r\n\r\n\t\t\tfunction biAdd(x, y) {\r\n\t\t\t\tvar result;\r\n\t\t\t\tif (x.isNeg != y.isNeg) {\r\n\t\t\t\t\ty.isNeg = !y.isNeg;\r\n\t\t\t\t\tresult = biSubtract(x, y);\r\n\t\t\t\t\ty.isNeg = !y.isNeg;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = new BigInt();\r\n\t\t\t\t\tvar c = 0;\r\n\t\t\t\t\tvar n;\r\n\t\t\t\t\tfor (var i = 0; i < x.digits.length; ++i) {\r\n\t\t\t\t\t\tn = x.digits[i] + y.digits[i] + c;\r\n\t\t\t\t\t\tresult.digits[i] = n & 0xffff;\r\n\t\t\t\t\t\tc = Number(n >= biRadix);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult.isNeg = x.isNeg;\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biSubtract(x, y) {\r\n\t\t\t\tvar result;\r\n\t\t\t\tif (x.isNeg != y.isNeg) {\r\n\t\t\t\t\ty.isNeg = !y.isNeg;\r\n\t\t\t\t\tresult = biAdd(x, y);\r\n\t\t\t\t\ty.isNeg = !y.isNeg;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = new BigInt();\r\n\t\t\t\t\tvar n, c;\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\t\tfor (var i = 0; i < x.digits.length; ++i) {\r\n\t\t\t\t\t\tn = x.digits[i] - y.digits[i] + c;\r\n\t\t\t\t\t\tresult.digits[i] = n & 0xffff;\r\n\t\t\t\t\t\tif (result.digits[i] < 0)\r\n\t\t\t\t\t\t\tresult.digits[i] += biRadix;\r\n\t\t\t\t\t\tc = 0 - Number(n < 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (c == -1) {\r\n\t\t\t\t\t\tc = 0;\r\n\t\t\t\t\t\tfor (var i = 0; i < x.digits.length; ++i) {\r\n\t\t\t\t\t\t\tn = 0 - result.digits[i] + c;\r\n\t\t\t\t\t\t\tresult.digits[i] = n & 0xffff;\r\n\t\t\t\t\t\t\tif (result.digits[i] < 0)\r\n\t\t\t\t\t\t\t\tresult.digits[i] += biRadix;\r\n\t\t\t\t\t\t\tc = 0 - Number(n < 0);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tresult.isNeg = !x.isNeg;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tresult.isNeg = x.isNeg;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biHighIndex(x) {\r\n\t\t\t\tvar result = x.digits.length - 1;\r\n\t\t\t\twhile (result > 0 && x.digits[result] == 0)\r\n\t\t\t\t\t--result;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biNumBits(x) {\r\n\t\t\t\tvar n = biHighIndex(x);\r\n\t\t\t\tvar d = x.digits[n];\r\n\t\t\t\tvar m = (n + 1) * bitsPerDigit;\r\n\t\t\t\tvar result;\r\n\t\t\t\tfor (result = m; result > m - bitsPerDigit; --result) {\r\n\t\t\t\t\tif ((d & 0x8000) != 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\td <<= 1;\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biMultiply(x, y) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tvar c;\r\n\t\t\t\tvar n = biHighIndex(x);\r\n\t\t\t\tvar t = biHighIndex(y);\r\n\t\t\t\tvar u, uv, k;\r\n\t\t\t\tfor (var i = 0; i <= t; ++i) {\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\t\tk = i;\r\n\t\t\t\t\tfor (j = 0; j <= n; ++j,\r\n\t\t\t\t\t\t++k) {\r\n\t\t\t\t\t\tuv = result.digits[k] + x.digits[j] * y.digits[i] + c;\r\n\t\t\t\t\t\tresult.digits[k] = uv & maxDigitVal;\r\n\t\t\t\t\t\tc = uv >>> biRadixBits;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult.digits[i + n + 1] = c;\r\n\t\t\t\t}\r\n\t\t\t\tresult.isNeg = x.isNeg != y.isNeg;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biMultiplyDigit(x, y) {\r\n\t\t\t\tvar n, c, uv;\r\n\t\t\t\tresult = new BigInt();\r\n\t\t\t\tn = biHighIndex(x);\r\n\t\t\t\tc = 0;\r\n\t\t\t\tfor (var j = 0; j <= n; ++j) {\r\n\t\t\t\t\tuv = result.digits[j] + x.digits[j] * y + c;\r\n\t\t\t\t\tresult.digits[j] = uv & maxDigitVal;\r\n\t\t\t\t\tc = uv >>> biRadixBits;\r\n\t\t\t\t}\r\n\t\t\t\tresult.digits[1 + n] = c;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction arrayCopy(src, srcStart, dest, destStart, n) {\r\n\t\t\t\tvar m = Math.min(srcStart + n, src.length);\r\n\t\t\t\tfor (var i = srcStart, j = destStart; i < m; ++i,\r\n\t\t\t\t\t++j) {\r\n\t\t\t\t\tdest[j] = src[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0,\r\n\t\t\t\t0xFFE0, 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF);\r\n\r\n\t\t\tfunction biShiftLeft(x, n) {\r\n\t\t\t\tvar digitCount = Math.floor(n / bitsPerDigit);\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tarrayCopy(x.digits, 0, result.digits, digitCount, result.digits.length - digitCount);\r\n\t\t\t\tvar bits = n % bitsPerDigit;\r\n\t\t\t\tvar rightBits = bitsPerDigit - bits;\r\n\t\t\t\tfor (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i,\r\n\t\t\t\t\t--i1) {\r\n\t\t\t\t\tresult.digits[i] = ((result.digits[i] << bits) & maxDigitVal) | ((result.digits[i1] & highBitMasks[bits]) >>> (\r\n\t\t\t\t\t\trightBits));\r\n\t\t\t\t}\r\n\t\t\t\tresult.digits[0] = ((result.digits[i] << bits) & maxDigitVal);\r\n\t\t\t\tresult.isNeg = x.isNeg;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\t\tvar lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF,\r\n\t\t\t\t0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF);\r\n\r\n\t\t\tfunction biShiftRight(x, n) {\r\n\t\t\t\tvar digitCount = Math.floor(n / bitsPerDigit);\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tarrayCopy(x.digits, digitCount, result.digits, 0, x.digits.length - digitCount);\r\n\t\t\t\tvar bits = n % bitsPerDigit;\r\n\t\t\t\tvar leftBits = bitsPerDigit - bits;\r\n\t\t\t\tfor (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i,\r\n\t\t\t\t\t++i1) {\r\n\t\t\t\t\tresult.digits[i] = (result.digits[i] >>> bits) | ((result.digits[i1] & lowBitMasks[bits]) << leftBits);\r\n\t\t\t\t}\r\n\t\t\t\tresult.digits[result.digits.length - 1] >>>= bits;\r\n\t\t\t\tresult.isNeg = x.isNeg;\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biMultiplyByRadixPower(x, n) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tarrayCopy(x.digits, 0, result.digits, n, result.digits.length - n);\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biDivideByRadixPower(x, n) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tarrayCopy(x.digits, n, result.digits, 0, result.digits.length - n);\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biModuloByRadixPower(x, n) {\r\n\t\t\t\tvar result = new BigInt();\r\n\t\t\t\tarrayCopy(x.digits, 0, result.digits, 0, n);\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biCompare(x, y) {\r\n\t\t\t\tif (x.isNeg != y.isNeg) {\r\n\t\t\t\t\treturn 1 - 2 * Number(x.isNeg);\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i = x.digits.length - 1; i >= 0; --i) {\r\n\t\t\t\t\tif (x.digits[i] != y.digits[i]) {\r\n\t\t\t\t\t\tif (x.isNeg) {\r\n\t\t\t\t\t\t\treturn 1 - 2 * Number(x.digits[i] > y.digits[i]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\treturn 1 - 2 * Number(x.digits[i] < y.digits[i]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biDivideModulo(x, y) {\r\n\t\t\t\tvar nb = biNumBits(x);\r\n\t\t\t\tvar tb = biNumBits(y);\r\n\t\t\t\tvar origYIsNeg = y.isNeg;\r\n\t\t\t\tvar q, r;\r\n\t\t\t\tif (nb < tb) {\r\n\t\t\t\t\tif (x.isNeg) {\r\n\t\t\t\t\t\tq = biCopy(bigOne);\r\n\t\t\t\t\t\tq.isNeg = !y.isNeg;\r\n\t\t\t\t\t\tx.isNeg = false;\r\n\t\t\t\t\t\ty.isNeg = false;\r\n\t\t\t\t\t\tr = biSubtract(y, x);\r\n\t\t\t\t\t\tx.isNeg = true;\r\n\t\t\t\t\t\ty.isNeg = origYIsNeg;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tq = new BigInt();\r\n\t\t\t\t\t\tr = biCopy(x);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn new Array(q, r);\r\n\t\t\t\t}\r\n\t\t\t\tq = new BigInt();\r\n\t\t\t\tr = x;\r\n\t\t\t\tvar t = Math.ceil(tb / bitsPerDigit) - 1;\r\n\t\t\t\tvar lambda = 0;\r\n\t\t\t\twhile (y.digits[t] < biHalfRadix) {\r\n\t\t\t\t\ty = biShiftLeft(y, 1);\r\n\t\t\t\t\t++lambda;\r\n\t\t\t\t\t++tb;\r\n\t\t\t\t\tt = Math.ceil(tb / bitsPerDigit) - 1;\r\n\t\t\t\t}\r\n\t\t\t\tr = biShiftLeft(r, lambda);\r\n\t\t\t\tnb += lambda;\r\n\t\t\t\tvar n = Math.ceil(nb / bitsPerDigit) - 1;\r\n\t\t\t\tvar b = biMultiplyByRadixPower(y, n - t);\r\n\t\t\t\twhile (biCompare(r, b) != -1) {\r\n\t\t\t\t\t++q.digits[n - t];\r\n\t\t\t\t\tr = biSubtract(r, b);\r\n\t\t\t\t}\r\n\t\t\t\tfor (var i = n; i > t; --i) {\r\n\t\t\t\t\tvar ri = (i >= r.digits.length) ? 0 : r.digits[i];\r\n\t\t\t\t\tvar ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1];\r\n\t\t\t\t\tvar ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2];\r\n\t\t\t\t\tvar yt = (t >= y.digits.length) ? 0 : y.digits[t];\r\n\t\t\t\t\tvar yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1];\r\n\t\t\t\t\tif (ri == yt) {\r\n\t\t\t\t\t\tq.digits[i - t - 1] = maxDigitVal;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tq.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1);\r\n\t\t\t\t\tvar c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2);\r\n\t\t\t\t\twhile (c1 > c2) {\r\n\t\t\t\t\t\t--q.digits[i - t - 1];\r\n\t\t\t\t\t\tc1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1);\r\n\t\t\t\t\t\tc2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tb = biMultiplyByRadixPower(y, i - t - 1);\r\n\t\t\t\t\tr = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1]));\r\n\t\t\t\t\tif (r.isNeg) {\r\n\t\t\t\t\t\tr = biAdd(r, b);\r\n\t\t\t\t\t\t--q.digits[i - t - 1];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tr = biShiftRight(r, lambda);\r\n\t\t\t\tq.isNeg = x.isNeg != origYIsNeg;\r\n\t\t\t\tif (x.isNeg) {\r\n\t\t\t\t\tif (origYIsNeg) {\r\n\t\t\t\t\t\tq = biAdd(q, bigOne);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tq = biSubtract(q, bigOne);\r\n\t\t\t\t\t}\r\n\t\t\t\t\ty = biShiftRight(y, lambda);\r\n\t\t\t\t\tr = biSubtract(y, r);\r\n\t\t\t\t}\r\n\t\t\t\tif (r.digits[0] == 0 && biHighIndex(r) == 0)\r\n\t\t\t\t\tr.isNeg = false;\r\n\t\t\t\treturn new Array(q, r);\r\n\t\t\t}\r\n\r\n\t\t\tfunction biDivide(x, y) {\r\n\t\t\t\treturn biDivideModulo(x, y)[0];\r\n\t\t\t}\r\n\r\n\t\t\tfunction biModulo(x, y) {\r\n\t\t\t\treturn biDivideModulo(x, y)[1];\r\n\t\t\t}\r\n\r\n\t\t\tfunction biMultiplyMod(x, y, m) {\r\n\t\t\t\treturn biModulo(biMultiply(x, y), m);\r\n\t\t\t}\r\n\r\n\t\t\tfunction biPow(x, y) {\r\n\t\t\t\tvar result = bigOne;\r\n\t\t\t\tvar a = x;\r\n\t\t\t\twhile (true) {\r\n\t\t\t\t\tif ((y & 1) != 0)\r\n\t\t\t\t\t\tresult = biMultiply(result, a);\r\n\t\t\t\t\ty >>= 1;\r\n\t\t\t\t\tif (y == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\ta = biMultiply(a, a);\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction biPowMod(x, y, m) {\r\n\t\t\t\tvar result = bigOne;\r\n\t\t\t\tvar a = x;\r\n\t\t\t\tvar k = y;\r\n\t\t\t\twhile (true) {\r\n\t\t\t\t\tif ((k.digits[0] & 1) != 0)\r\n\t\t\t\t\t\tresult = biMultiplyMod(result, a, m);\r\n\t\t\t\t\tk = biShiftRight(k, 1);\r\n\t\t\t\t\tif (k.digits[0] == 0 && biHighIndex(k) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\ta = biMultiplyMod(a, a, m);\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t};\r\n\t\t\tvar RSAAPP = {};\r\n\t\t\tRSAAPP.NoPadding = \"NoPadding\";\r\n\t\t\tRSAAPP.PKCS1Padding = \"PKCS1Padding\";\r\n\t\t\tRSAAPP.RawEncoding = \"RawEncoding\";\r\n\t\t\tRSAAPP.NumericEncoding = \"NumericEncoding\"\r\n\r\n\t\t\tfunction RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen) {\r\n\t\t\t\tthis.e = biFromHex(encryptionExponent);\r\n\t\t\t\tthis.d = biFromHex(decryptionExponent);\r\n\t\t\t\tthis.m = biFromHex(modulus);\r\n\t\t\t\tif (typeof(keylen) != 'number') {\r\n\t\t\t\t\tthis.chunkSize = 2 * biHighIndex(this.m);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.chunkSize = keylen / 8;\r\n\t\t\t\t}\r\n\t\t\t\tthis.radix = 16;\r\n\t\t\t\tthis.barrett = new BarrettMu(this.m);\r\n\t\t\t}\r\n\r\n\t\t\tfunction encryptedString(key, s, pad, encoding) {\r\n\t\t\t\tvar a = new Array();\r\n\t\t\t\tvar sl = s.length;\r\n\t\t\t\tvar i, j, k;\r\n\t\t\t\tvar padtype;\r\n\t\t\t\tvar encodingtype;\r\n\t\t\t\tvar rpad;\r\n\t\t\t\tvar al;\r\n\t\t\t\tvar result = \"\";\r\n\t\t\t\tvar block;\r\n\t\t\t\tvar crypt;\r\n\t\t\t\tvar text;\r\n\t\t\t\tif (typeof(pad) == 'string') {\r\n\t\t\t\t\tif (pad == RSAAPP.NoPadding) {\r\n\t\t\t\t\t\tpadtype = 1;\r\n\t\t\t\t\t} else if (pad == RSAAPP.PKCS1Padding) {\r\n\t\t\t\t\t\tpadtype = 2;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tpadtype = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpadtype = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof(encoding) == 'string' && encoding == RSAAPP.RawEncoding) {\r\n\t\t\t\t\tencodingtype = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tencodingtype = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (padtype == 1) {\r\n\t\t\t\t\tif (sl > key.chunkSize) {\r\n\t\t\t\t\t\tsl = key.chunkSize;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (padtype == 2) {\r\n\t\t\t\t\tif (sl > (key.chunkSize - 11)) {\r\n\t\t\t\t\t\tsl = key.chunkSize - 11;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ti = 0;\r\n\t\t\t\tif (padtype == 2) {\r\n\t\t\t\t\tj = sl - 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tj = key.chunkSize - 1;\r\n\t\t\t\t}\r\n\t\t\t\twhile (i < sl) {\r\n\t\t\t\t\tif (padtype) {\r\n\t\t\t\t\t\ta[j] = s.charCodeAt(i);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ta[i] = s.charCodeAt(i);\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti++;\r\n\t\t\t\t\tj--;\r\n\t\t\t\t}\r\n\t\t\t\tif (padtype == 1) {\r\n\t\t\t\t\ti = 0;\r\n\t\t\t\t}\r\n\t\t\t\tj = key.chunkSize - (sl % key.chunkSize);\r\n\t\t\t\twhile (j > 0) {\r\n\t\t\t\t\tif (padtype == 2) {\r\n\t\t\t\t\t\trpad = Math.floor(Math.random() * 256);\r\n\t\t\t\t\t\twhile (!rpad) {\r\n\t\t\t\t\t\t\trpad = Math.floor(Math.random() * 256);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ta[i] = rpad;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ta[i] = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti++;\r\n\t\t\t\t\tj--;\r\n\t\t\t\t}\r\n\t\t\t\tif (padtype == 2) {\r\n\t\t\t\t\ta[sl] = 0;\r\n\t\t\t\t\ta[key.chunkSize - 2] = 2;\r\n\t\t\t\t\ta[key.chunkSize - 1] = 0;\r\n\t\t\t\t}\r\n\t\t\t\tal = a.length;\r\n\t\t\t\tfor (i = 0; i < al; i += key.chunkSize) {\r\n\t\t\t\t\tblock = new BigInt();\r\n\t\t\t\t\tj = 0;\r\n\t\t\t\t\tfor (k = i; k < (i + key.chunkSize); ++j) {\r\n\t\t\t\t\t\tblock.digits[j] = a[k++];\r\n\t\t\t\t\t\tblock.digits[j] += a[k++] << 8;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcrypt = key.barrett.powMod(block, key.e);\r\n\t\t\t\t\tif (encodingtype == 1) {\r\n\t\t\t\t\t\ttext = biToBytes(crypt);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttext = (key.radix == 16) ? biToHex(crypt) : biToString(crypt, key.radix);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult += text;\r\n\t\t\t\t}\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction decryptedString(key, c) {\r\n\t\t\t\tvar blocks = c.split(\" \");\r\n\t\t\t\tvar b;\r\n\t\t\t\tvar i, j;\r\n\t\t\t\tvar bi;\r\n\t\t\t\tvar result = \"\";\r\n\t\t\t\tfor (i = 0; i < blocks.length; ++i) {\r\n\t\t\t\t\tif (key.radix == 16) {\r\n\t\t\t\t\t\tbi = biFromHex(blocks[i]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tbi = biFromString(blocks[i], key.radix);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tb = key.barrett.powMod(bi, key.d);\r\n\t\t\t\t\tfor (j = 0; j <= biHighIndex(b); ++j) {\r\n\t\t\t\t\t\tresult += String.fromCharCode(b.digits[j] & 255, b.digits[j] >> 8);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (result.charCodeAt(result.length - 1) == 0) {\r\n\t\t\t\t\tresult = result.substring(0, result.length - 1);\r\n\t\t\t\t}\r\n\t\t\t\treturn (result);\r\n\t\t\t}\r\n\r\n\t\t\tfunction get_pwd(pwd) {\r\n\t\t\t\tsetMaxDigits(131);\r\n\t\t\t\t// res_n   这个参数  是从网页获取的   但调试发现是固定的\r\n\t\t\t\tvar rsa_n =\r\n\t\t\t\t\t\"DC1683EEAA2B709F97743773E18F53E3C9A15D12465CE82227A6E447E6EC590D0B569876BB631B0AB4D67881E7EC874066D6E022E2978B4C6EAA8903EC1774AAE040A3BEAF9C2B48730ADD46BEF5F0C8109DB6FCEFED0F4A84CCD7AFFDB4FB4214DA0D0FF1A8E2831E81FA4D7C2F4346184EEC87CE42230FC320B2B4E392ECDF\"\r\n\t\t\t\tvar key = new RSAKeyPair(\"10001\", '', rsa_n);\r\n\t\t\t\treturn encryptedString(key, pwd);\r\n\t\t\t}"
  },
  {
    "path": "其他实战/【试客联盟】登录/login.py",
    "content": "# -*- coding: utf-8 -*-\r\n# __author__ = \"zok\"  362416272@qq.com\r\n# Date: 2019-11-23  Python: 3.7\r\n\r\n\r\nimport execjs\r\nimport requests, re\r\n\r\ns = requests.Session()\r\n\r\n\r\ndef main(pwd):\r\n    \"\"\"res_n   这个参数  是从网页获取的   但调试发现是其实固定的\r\n    :param pwd:\r\n    :return:\r\n    \"\"\"\r\n    with open('execute.js', 'r', encoding='utf-8') as f:\r\n        js = execjs.compile(f.read())\r\n\r\n        print('引擎', execjs.get().name)\r\n        sign = js.call('get_pwd', pwd)\r\n        return sign\r\n\r\n\r\ndef login(sign_pwd, username):\r\n    url = \"http://login.shikee.com/check/?&_1574394219820\"\r\n    data = {\r\n        \"username\": username,\r\n        \"password\": sign_pwd,\r\n        \"vcode\": '',\r\n        \"to\": 'http://user.shikee.com/',\r\n    }\r\n    res = s.post(url=url, data=data)\r\n    res.encoding = \"utf-8\"\r\n    print(res.text)\r\n\r\n\r\ndef home():\r\n    home_url = \"http://user.shikee.com/buyer\"\r\n    response = s.get(home_url)\r\n    html = response.content.decode('utf-8')\r\n    data = re.findall(\r\n        '<div class=\"m-content\">.*?<p class=\"loginInfo\">您好！<span>(.*?)</span>您有未读提醒<b> <a href=\"/message\">1</a></b> 条</p>',\r\n        html, re.S)[0]\r\n    print(data)\r\n\r\n\r\nif __name__ == '__main__':\r\n    username = input('请输入账户:')\r\n    pwd = input('请输入密码：')\r\n    sign = main(pwd)\r\n    print('正在登录....')\r\n    login(sign, username)\r\n    home()\r\n"
  },
  {
    "path": "其他实战/【谷雨】数字解密/GuYu.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-25  Python: 3.7\n\nimport requests\nimport os\nfrom fontTools.ttLib import TTFont\n\n\nclass Font:\n    \"\"\"\n    https://guyujiezi.com/\n    谷雨解字的 数字解密\n    现在版本的 雨谷字体加的xml 会有一个移位操作\n    \"\"\"\n    def __init__(self, uri):\n        self.url = uri\n        self.filename = uri.split('/')[-1]\n        self.font = None\n        self._list = []\n\n    def check(self):\n        \"\"\"检查目录\n        \"\"\"\n        if not os.path.isfile(self.filename):\n            resp = requests.get(self.url)\n            with open(self.filename, 'wb') as f:\n                f.write(resp.content)\n            # TTFont 存为 xml\n        self.font = TTFont(self.filename)\n        self.font.saveXML(self.filename.replace(self.filename.split('.')[-1], 'xml'))\n\n    def get_wo(self):\n        \"\"\"获取 woff\n        \"\"\"\n        self.check()\n        ph = self.font['cmap']\n        _dict = ph.tables[0].cmap\n        # 1. 字典取 value 列表化\n        # 2. str 取最后 2 位，并转为 int\n        # 3. 减去 17 并从新组装列表\n        self._list = [int(i[-2:])-17 for i in list(_dict.values())]\n        \"\"\"\n        处理移位\n        \"\"\"\n        print(list(_dict.values()))\n        print(self._list)\n\n    def parse(self, number):\n        _str = ''\n        for num in number:\n            _str += str(self._list[int(num)])\n        print('最终展示字', int(_str))\n\n\nif __name__ == '__main__':\n    ft = Font(\"https://guyujiezi.com/fonts/2DLw9u/3iZbr8.woff\")\n    ft.get_wo()\n    # 输入页面数字测试\n    ft.parse('947')\n\n\n"
  },
  {
    "path": "其他实战/【豆瓣】自动登录/DouBan.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2020-01-08  Python: 3.7\n\nimport requests\nimport re\n\n\nclass DouBan:\n    def __init__(self, name, pwd):\n        self.name = name.strip()\n        self.pwd = pwd.strip()\n        self.session = requests.session()\n        self.headers = {\n            'Origin': 'https://accounts.douban.com',\n            'Host': 'accounts.douban.com',\n            'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony',\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',\n        }\n        self.login_url = 'https://accounts.douban.com/j/mobile/login/basic'\n        self.index_url = \"https://www.douban.com/\"\n        self.session = requests.session()\n\n    def login(self):\n        data = {\n            'ck': '',\n            'name': self.name,\n            'password': self.pwd,\n            'remember': 'false',\n            'ticket': '',\n        }\n        self.session.post(self.login_url, data=data, headers=self.headers)\n\n    def check(self):\n        self.headers['Host'] = 'www.douban.com'\n        response = self.session.get(\"https://www.douban.com/\", headers=self.headers)\n        try:\n            title = re.search(r'<span>(.*?)的帐号</span><span class=\"arrow\"></span>', response.text).group(1)\n            print('【登录成功】', title)\n        except:\n            print('【登录失败】')\n\n\nif __name__ == '__main__':\n    username = input('豆瓣用户名 >>>')\n    password = input('密码 >>>')\n    db = DouBan(username, password)\n    db.login()\n    db.check()\n"
  },
  {
    "path": "其他实战/【逗游】自动登录/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【逗游】自动登录/douyou.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-08-01  Python: 3.7\n\nimport js2py\nimport requests\nimport json\n\n\nclass DouYou:\n    headers = {\n        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',\n        'Referer': 'http://www.doyo.cn/passport/login'\n    }\n\n    def __init__(self, username, password):\n        self.context = js2py.EvalJs()  # python中使用js\n        self.username = username\n        self.password = password\n\n    def make_password(self):\n        \"\"\"取加密后的字符串\n        \"\"\"\n        try:\n            nonce, ts = self.get_token()\n            with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n                self.context.execute(f.read())\n            pwd_hash = self.context.get_value(self.password, nonce, ts)\n            return pwd_hash  # 打印加密之后的密码\n        except:\n            print('获取token失败')\n\n    def get_token(self):\n        \"\"\"获取 token\n        \"\"\"\n        get_token_url = 'http://www.doyo.cn/User/Passport/token?username={user}&random=0.1428378278012199'.format(user=self.username)\n        result = json.loads(requests.get(get_token_url).text)\n        if result.get('result'):\n            nonce = result.get('nonce')\n            ts = result.get('ts')\n            return nonce, ts\n        else:\n            print('获取token失败')\n            exit()\n\n    def login(self):\n        \"\"\"登陆\n        \"\"\"\n        # decode('unicode_escape')\n        login_url = 'http://www.doyo.cn/passport/login'\n        data = {\n            'username': self.username,\n            'password': self.make_password(),\n            'remberme': '1',\n            'next': 'aHR0cCUzQSUyRiUyRnd3dy5kb3lvLmNuJTJG'\n        }\n        response = requests.post(login_url, data=data, headers=self.headers)\n        info = json.loads(response.text)\n        if info.get('result'):\n            print('登陆成功 | 用户等级:{level} 用户id:{uid}'.format(level=info.get('level'), uid=info.get('uid')))\n        else:\n            print('登陆失败')\n\n\nif __name__ == '__main__':\n    user = input('输入逗游账号')\n    pwd = input('输入密码')\n    dy = DouYou(user, pwd)\n    dy.login()\n"
  },
  {
    "path": "其他实战/【逗游】自动登录/encryp.js",
    "content": "/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\n/*  SHA-1 implementation in JavaScript | (c) Chris Veness 2002-2010 | www.movable-type.co.uk      */\n/*   - see http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html                             */\n/*         http://csrc.nist.gov/groups/ST/toolkit/examples.html                                   */\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\n\nvar Sha1 = {};  // Sha1 namespace\n\n/**\n * Generates SHA-1 hash of string\n *\n * @param {String} msg                String to be hashed\n * @param {Boolean} [utf8encode=true] Encode msg as UTF-8 before generating hash\n * @returns {String}                  Hash of msg as hex character string\n */\nSha1.hash = function(msg, utf8encode) {\n  utf8encode =  (typeof utf8encode == 'undefined') ? true : utf8encode;\n\n  // convert string to UTF-8, as SHA only deals with byte-streams\n  if (utf8encode) msg = Utf8.encode(msg);\n\n  // constants [§4.2.1]\n  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n\n  // PREPROCESSING\n\n  msg += String.fromCharCode(0x80);  // add trailing '1' bit (+ 0's padding) to string [§5.1.1]\n\n  // convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1]\n  var l = msg.length/4 + 2;  // length (in 32-bit integers) of msg + ‘1’ + appended length\n  var N = Math.ceil(l/16);   // number of 16-integer-blocks required to hold 'l' ints\n  var M = new Array(N);\n\n  for (var i=0; i<N; i++) {\n    M[i] = new Array(16);\n    for (var j=0; j<16; j++) {  // encode 4 chars per integer, big-endian encoding\n      M[i][j] = (msg.charCodeAt(i*64+j*4)<<24) | (msg.charCodeAt(i*64+j*4+1)<<16) |\n        (msg.charCodeAt(i*64+j*4+2)<<8) | (msg.charCodeAt(i*64+j*4+3));\n    } // note running off the end of msg is ok 'cos bitwise ops on NaN return 0\n  }\n  // add length (in bits) into final pair of 32-bit integers (big-endian) [§5.1.1]\n  // note: most significant word would be (len-1)*8 >>> 32, but since JS converts\n  // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators\n  M[N-1][14] = ((msg.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14])\n  M[N-1][15] = ((msg.length-1)*8) & 0xffffffff;\n\n  // set initial hash value [§5.3.1]\n  var H0 = 0x67452301;\n  var H1 = 0xefcdab89;\n  var H2 = 0x98badcfe;\n  var H3 = 0x10325476;\n  var H4 = 0xc3d2e1f0;\n\n  // HASH COMPUTATION [§6.1.2]\n\n  var W = new Array(80); var a, b, c, d, e;\n  for (var i=0; i<N; i++) {\n\n    // 1 - prepare message schedule 'W'\n    for (var t=0;  t<16; t++) W[t] = M[i][t];\n    for (var t=16; t<80; t++) W[t] = Sha1.ROTL(W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1);\n\n    // 2 - initialise five working variables a, b, c, d, e with previous hash value\n    a = H0; b = H1; c = H2; d = H3; e = H4;\n\n    // 3 - main loop\n    for (var t=0; t<80; t++) {\n      var s = Math.floor(t/20); // seq for blocks of 'f' functions and 'K' constants\n      var T = (Sha1.ROTL(a,5) + Sha1.f(s,b,c,d) + e + K[s] + W[t]) & 0xffffffff;\n      e = d;\n      d = c;\n      c = Sha1.ROTL(b, 30);\n      b = a;\n      a = T;\n    }\n\n    // 4 - compute the new intermediate hash value\n    H0 = (H0+a) & 0xffffffff;  // note 'addition modulo 2^32'\n    H1 = (H1+b) & 0xffffffff;\n    H2 = (H2+c) & 0xffffffff;\n    H3 = (H3+d) & 0xffffffff;\n    H4 = (H4+e) & 0xffffffff;\n  }\n\n  return Sha1.toHexStr(H0) + Sha1.toHexStr(H1) +\n    Sha1.toHexStr(H2) + Sha1.toHexStr(H3) + Sha1.toHexStr(H4);\n}\n\n//\n// function 'f' [§4.1.1]\n//\nSha1.f = function(s, x, y, z)  {\n  switch (s) {\n  case 0: return (x & y) ^ (~x & z);           // Ch()\n  case 1: return x ^ y ^ z;                    // Parity()\n  case 2: return (x & y) ^ (x & z) ^ (y & z);  // Maj()\n  case 3: return x ^ y ^ z;                    // Parity()\n  }\n}\n\n//\n// rotate left (circular left shift) value x by n positions [§3.2.5]\n//\nSha1.ROTL = function(x, n) {\n  return (x<<n) | (x>>>(32-n));\n}\n\n//\n// hexadecimal representation of a number\n//   (note toString(16) is implementation-dependant, and\n//   in IE returns signed numbers when used on full words)\n//\nSha1.toHexStr = function(n) {\n  var s=\"\", v;\n  for (var i=7; i>=0; i--) { v = (n>>>(i*4)) & 0xf; s += v.toString(16); }\n  return s;\n}\n\n\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\n/*  Utf8 class: encode / decode between multi-byte Unicode characters and UTF-8 multiple          */\n/*              single-byte character encoding (c) Chris Veness 2002-2010                         */\n/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\n\nvar Utf8 = {};  // Utf8 namespace\n\n/**\n * Encode multi-byte Unicode string into utf-8 multiple single-byte characters\n * (BMP / basic multilingual plane only)\n *\n * Chars in range U+0080 - U+07FF are encoded in 2 chars, U+0800 - U+FFFF in 3 chars\n *\n * @param {String} strUni Unicode string to be encoded as UTF-8\n * @returns {String} encoded string\n */\nUtf8.encode = function(strUni) {\n  // use regular expressions & String.replace callback function for better efficiency\n  // than procedural approaches\n  var strUtf = strUni.replace(\n      /[\\u0080-\\u07ff]/g,  // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz\n      function(c) {\n        var cc = c.charCodeAt(0);\n        return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }\n    );\n  strUtf = strUtf.replace(\n      /[\\u0800-\\uffff]/g,  // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz\n      function(c) {\n        var cc = c.charCodeAt(0);\n        return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }\n    );\n  return strUtf;\n}\n\n/**\n * Decode utf-8 encoded string back into multi-byte Unicode characters\n *\n * @param {String} strUtf UTF-8 string to be decoded back to Unicode\n * @returns {String} decoded string\n */\nUtf8.decode = function(strUtf) {\n  // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!\n  var strUni = strUtf.replace(\n      /[\\u00e0-\\u00ef][\\u0080-\\u00bf][\\u0080-\\u00bf]/g,  // 3-byte chars\n      function(c) {  // (note parentheses for precence)\n        var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f);\n        return String.fromCharCode(cc); }\n    );\n  strUni = strUni.replace(\n      /[\\u00c0-\\u00df][\\u0080-\\u00bf]/g,                 // 2-byte chars\n      function(c) {  // (note parentheses for precence)\n        var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;\n        return String.fromCharCode(cc); }\n    );\n  return strUni;\n}\n\nfunction get_value(pwd, nonce, ts) {\n    pwd = Sha1.hash(pwd);\n    pwd = Sha1.hash(nonce+ts+pwd);\n    return pwd\n}"
  },
  {
    "path": "其他实战/【金逸电影】自动注册/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【金逸电影】自动注册/encryp.js",
    "content": "(function (global) {\n    \"use strict\";\n    var _Base64 = global.Base64;\n    var version = \"2.1.9\";\n    var buffer;\n    if (typeof module !== \"undefined\" && module.exports) {\n        try {\n            buffer = require(\"buffer\").Buffer\n        } catch (err) {\n        }\n    }\n    var b64chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n    var b64tab = function (bin) {\n        var t = {};\n        for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;\n        return t\n    }(b64chars);\n    var fromCharCode = String.fromCharCode;\n    var cb_utob = function (c) {\n        if (c.length < 2) {\n            var cc = c.charCodeAt(0);\n            return cc < 128 ? c : cc < 2048 ? fromCharCode(192 | cc >>> 6) + fromCharCode(128 | cc & 63) : fromCharCode(224 |\n                cc >>> 12 & 15) + fromCharCode(128 | cc >>> 6 & 63) + fromCharCode(128 | cc & 63)\n        } else {\n            var cc = 65536 + (c.charCodeAt(0) - 55296) * 1024 + (c.charCodeAt(1) - 56320);\n            return fromCharCode(240 | cc >>> 18 & 7) + fromCharCode(128 | cc >>> 12 & 63) + fromCharCode(128 | cc >>> 6 & 63) +\n                fromCharCode(128 | cc & 63)\n        }\n    };\n    var re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n    var utob = function (u) {\n        return u.replace(re_utob, cb_utob)\n    };\n    var cb_encode = function (ccc) {\n        var padlen = [0, 2, 1][ccc.length % 3],\n            ord = ccc.charCodeAt(0) << 16 | (ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8 | (ccc.length > 2 ? ccc.charCodeAt(\n                2) : 0),\n            chars = [b64chars.charAt(ord >>> 18), b64chars.charAt(ord >>> 12 & 63), padlen >= 2 ? \"=\" : b64chars.charAt(ord >>>\n                6 & 63), padlen >= 1 ? \"=\" : b64chars.charAt(ord & 63)];\n        return chars.join(\"\")\n    };\n    var btoa = global.btoa ? function (b) {\n        return global.btoa(b)\n    } : function (b) {\n        return b.replace(/[\\s\\S]{1,3}/g, cb_encode)\n    };\n    var _encode = buffer ? function (u) {\n        return (u.constructor === buffer.constructor ? u : new buffer(u)).toString(\"base64\")\n    } : function (u) {\n        return btoa(utob(u))\n    };\n    var encode = function (u, urisafe) {\n        return !urisafe ? _encode(String(u)) : _encode(String(u)).replace(/[+\\/]/g, function (m0) {\n            return m0 == \"+\" ? \"-\" : \"_\"\n        }).replace(/=/g, \"\")\n    };\n    var encodeURI = function (u) {\n        return encode(u, true)\n    };\n    var re_btou = new RegExp([\"[À-ß][-¿]\", \"[à-ï][-¿]{2}\", \"[ð-÷][-¿]{3}\"].join(\"|\"), \"g\");\n    var cb_btou = function (cccc) {\n        switch (cccc.length) {\n            case 4:\n                var cp = (7 & cccc.charCodeAt(0)) << 18 | (63 & cccc.charCodeAt(1)) << 12 | (63 & cccc.charCodeAt(2)) << 6 | 63 &\n                    cccc.charCodeAt(3),\n                    offset = cp - 65536;\n                return fromCharCode((offset >>> 10) + 55296) + fromCharCode((offset & 1023) + 56320);\n            case 3:\n                return fromCharCode((15 & cccc.charCodeAt(0)) << 12 | (63 & cccc.charCodeAt(1)) << 6 | 63 & cccc.charCodeAt(2));\n            default:\n                return fromCharCode((31 & cccc.charCodeAt(0)) << 6 | 63 & cccc.charCodeAt(1))\n        }\n    };\n    var btou = function (b) {\n        return b.replace(re_btou, cb_btou)\n    };\n    var cb_decode = function (cccc) {\n        var len = cccc.length,\n            padlen = len % 4,\n            n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) | (len > 2 ?\n                b64tab[cccc.charAt(2)] << 6 : 0) | (len > 3 ? b64tab[cccc.charAt(3)] : 0),\n            chars = [fromCharCode(n >>> 16), fromCharCode(n >>> 8 & 255), fromCharCode(n & 255)];\n        chars.length -= [0, 0, 2, 1][padlen];\n        return chars.join(\"\")\n    };\n    var atob = global.atob ? function (a) {\n        return global.atob(a)\n    } : function (a) {\n        return a.replace(/[\\s\\S]{1,4}/g, cb_decode)\n    };\n    var _decode = buffer ? function (a) {\n        return (a.constructor === buffer.constructor ? a : new buffer(a, \"base64\")).toString()\n    } : function (a) {\n        return btou(atob(a))\n    };\n    var decode = function (a) {\n        return _decode(String(a).replace(/[-_]/g, function (m0) {\n            return m0 == \"-\" ? \"+\" : \"/\"\n        }).replace(/[^A-Za-z0-9\\+\\/]/g, \"\"))\n    };\n    var noConflict = function () {\n        var Base64 = global.Base64;\n        global.Base64 = _Base64;\n        return Base64\n    };\n    global.Base64 = {\n        VERSION: version,\n        atob: atob,\n        btoa: btoa,\n        fromBase64: decode,\n        toBase64: encode,\n        utob: utob,\n        encode: encode,\n        encodeURI: encodeURI,\n        btou: btou,\n        decode: decode,\n        noConflict: noConflict\n    };\n    if (typeof Object.defineProperty === \"function\") {\n        var noEnum = function (v) {\n            return {\n                value: v,\n                enumerable: false,\n                writable: true,\n                configurable: true\n            }\n        };\n        global.Base64.extendString = function () {\n            Object.defineProperty(String.prototype, \"fromBase64\", noEnum(function () {\n                return decode(this)\n            }));\n            Object.defineProperty(String.prototype, \"toBase64\", noEnum(function (urisafe) {\n                return encode(this, urisafe)\n            }));\n            Object.defineProperty(String.prototype, \"toBase64URI\", noEnum(function () {\n                return encode(this, true)\n            }))\n        }\n    }\n    if (global[\"Meteor\"]) {\n        Base64 = global.Base64\n    }\n})(this);\n\n\nfunction getEncryption(value) {\n    var val = Base64.encode(value);\n    var arr = [];\n    for (var i = 0; i < val.length; i++) {\n        arr.push(val.charAt(i));\n        if (i % 2) {\n            var num1 = Math.floor(10 * Math.random());\n            arr.push(num1);\n            var num2 = Math.floor(10 * Math.random());\n            arr.push(num2);\n            var num3 = Math.floor(10 * Math.random());\n            arr.push(num3)\n        }\n    }\n    return arr.join(\"\");\n};"
  },
  {
    "path": "其他实战/【金逸电影】自动注册/register.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-04  Python: 3.7\n\nimport requests\nimport execjs.runtime_names\n\n\nclass JinYiRegister:\n    \"\"\"\n    金逸电影注册\n    http://www.jycinema.com/wap/#/register\n    \"\"\"\n    def __init__(self, phone):\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',\n        }\n        self.url = 'http://www.jycinema.com/frontUIWebapp/appserver/photoMessageService/newsSendMessage'\n        self.phone = phone\n\n    @staticmethod\n    def js_make(json_data):\n        with open('encryp.js', 'r', encoding='utf-8') as f:\n            js = execjs.compile(f.read())\n        try:\n            result = js.call(\"getEncryption\", json_data)\n            return result\n        except Exception:\n            print('js 异常')\n\n    def register(self):\n        data = '{\"mobileNumber\": ' + self.phone + ', \"channelId\": 7, \"channelCode\": \"J0005\", \"memberId\": \"\"}'\n        data = {\n            'params': self.js_make(data),\n            'Origin': 'http://www.jycinema.com',\n            'Referer': 'http://www.jycinema.com/wap/',\n        }\n        response = requests.post(self.url, data=data, headers=self.headers)\n        print(response.content.decode('utf-8'))\n\n\nif __name__ == '__main__':\n    your_phone = input('请输入待注册手机号')\n    jy = JinYiRegister(your_phone)\n    jy.register()\n"
  },
  {
    "path": "其他实战/【青海移动】登陆参数生成/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-06  Python: 3.7\n\n"
  },
  {
    "path": "其他实战/【青海移动】登陆参数生成/encryp.js",
    "content": "var CryptoJS = CryptoJS || function (u, l) {\n    var d = {},\n        n = d.lib = {},\n        p = function () {\n        },\n        s = n.Base = {\n            extend: function (a) {\n                p.prototype = this;\n                var c = new p;\n                a && c.mixIn(a);\n                c.hasOwnProperty(\"init\") || (c.init = function () {\n                    c.$super.init.apply(this, arguments)\n                });\n                c.init.prototype = c;\n                c.$super = this;\n                return c\n            },\n            create: function () {\n                var a = this.extend();\n                a.init.apply(a, arguments);\n                return a\n            },\n            init: function () {\n            },\n            mixIn: function (a) {\n                for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]);\n                a.hasOwnProperty(\"toString\") && (this.toString = a.toString)\n            },\n            clone: function () {\n                return this.init.prototype.extend(this)\n            }\n        },\n        q = n.WordArray = s.extend({\n            init: function (a, c) {\n                a = this.words = a || [];\n                this.sigBytes = c != l ? c : 4 * a.length\n            },\n            toString: function (a) {\n                return (a || v).stringify(this)\n            },\n            concat: function (a) {\n                var c = this.words,\n                    m = a.words,\n                    f = this.sigBytes;\n                a = a.sigBytes;\n                this.clamp();\n                if (f % 4)\n                    for (var t = 0; t < a; t++) c[f + t >>> 2] |= (m[t >>> 2] >>> 24 - 8 * (t % 4) & 255) << 24 - 8 * ((f + t) %\n                        4);\n                else if (65535 < m.length)\n                    for (t = 0; t < a; t += 4) c[f + t >>> 2] = m[t >>> 2];\n                else c.push.apply(c, m);\n                this.sigBytes += a;\n                return this\n            },\n            clamp: function () {\n                var a = this.words,\n                    c = this.sigBytes;\n                a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4);\n                a.length = u.ceil(c / 4)\n            },\n            clone: function () {\n                var a = s.clone.call(this);\n                a.words = this.words.slice(0);\n                return a\n            },\n            random: function (a) {\n                for (var c = [], m = 0; m < a; m += 4) c.push(4294967296 * u.random() | 0);\n                return new q.init(c, a)\n            }\n        }),\n        w = d.enc = {},\n        v = w.Hex = {\n            stringify: function (a) {\n                var c = a.words;\n                a = a.sigBytes;\n                for (var m = [], f = 0; f < a; f++) {\n                    var t = c[f >>> 2] >>> 24 - 8 * (f % 4) & 255;\n                    m.push((t >>> 4).toString(16));\n                    m.push((t & 15).toString(16))\n                }\n                return m.join(\"\")\n            },\n            parse: function (a) {\n                for (var c = a.length, m = [], f = 0; f < c; f += 2) m[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f %\n                    8);\n                return new q.init(m, c / 2)\n            }\n        },\n        b = w.Latin1 = {\n            stringify: function (a) {\n                var c = a.words;\n                a = a.sigBytes;\n                for (var m = [], f = 0; f < a; f++) m.push(String.fromCharCode(c[f >>> 2] >>> 24 - 8 * (f % 4) & 255));\n                return m.join(\"\")\n            },\n            parse: function (a) {\n                for (var c = a.length, m = [], f = 0; f < c; f++) m[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4);\n                return new q.init(m, c)\n            }\n        },\n        x = w.Utf8 = {\n            stringify: function (a) {\n                try {\n                    return decodeURIComponent(escape(b.stringify(a)))\n                } catch (c) {\n                    throw Error(\"Malformed UTF-8 data\");\n                }\n            },\n            parse: function (a) {\n                return b.parse(unescape(encodeURIComponent(a)))\n            }\n        },\n        r = n.BufferedBlockAlgorithm = s.extend({\n            reset: function () {\n                this._data = new q.init;\n                this._nDataBytes = 0\n            },\n            _append: function (a) {\n                \"string\" == typeof a && (a = x.parse(a));\n                this._data.concat(a);\n                this._nDataBytes += a.sigBytes\n            },\n            _process: function (a) {\n                var c = this._data,\n                    m = c.words,\n                    f = c.sigBytes,\n                    t = this.blockSize,\n                    b = f / (4 * t),\n                    b = a ? u.ceil(b) : u.max((b | 0) - this._minBufferSize, 0);\n                a = b * t;\n                f = u.min(4 * a, f);\n                if (a) {\n                    for (var e = 0; e < a; e += t) this._doProcessBlock(m, e);\n                    e = m.splice(0, a);\n                    c.sigBytes -= f\n                }\n                return new q.init(e, f)\n            },\n            clone: function () {\n                var a = s.clone.call(this);\n                a._data = this._data.clone();\n                return a\n            },\n            _minBufferSize: 0\n        });\n    n.Hasher = r.extend({\n        cfg: s.extend(),\n        init: function (a) {\n            this.cfg = this.cfg.extend(a);\n            this.reset()\n        },\n        reset: function () {\n            r.reset.call(this);\n            this._doReset()\n        },\n        update: function (a) {\n            this._append(a);\n            this._process();\n            return this\n        },\n        finalize: function (a) {\n            a && this._append(a);\n            return this._doFinalize()\n        },\n        blockSize: 16,\n        _createHelper: function (a) {\n            return function (c, m) {\n                return (new a.init(m)).finalize(c)\n            }\n        },\n        _createHmacHelper: function (a) {\n            return function (c, m) {\n                return (new e.HMAC.init(a, m)).finalize(c)\n            }\n        }\n    });\n    var e = d.algo = {};\n    return d\n}(Math);\n(function () {\n    var u = CryptoJS,\n        l = u.lib.WordArray;\n    u.enc.Base64 = {\n        stringify: function (d) {\n            var n = d.words,\n                l = d.sigBytes,\n                s = this._map;\n            d.clamp();\n            d = [];\n            for (var q = 0; q < l; q += 3)\n                for (var w = (n[q >>> 2] >>> 24 - 8 * (q % 4) & 255) << 16 | (n[q + 1 >>> 2] >>> 24 - 8 * ((q + 1) % 4) & 255) <<\n                    8 | n[q + 2 >>> 2] >>> 24 - 8 * ((q + 2) % 4) & 255, v = 0; 4 > v && q + 0.75 * v < l; v++) d.push(s.charAt(\n                    w >>> 6 * (3 - v) & 63));\n            if (n = s.charAt(64))\n                for (; d.length % 4;) d.push(n);\n            return d.join(\"\")\n        },\n        parse: function (d) {\n            var n = d.length,\n                p = this._map,\n                s = p.charAt(64);\n            s && (s = d.indexOf(s), -1 != s && (n = s));\n            for (var s = [], q = 0, w = 0; w < n; w++)\n                if (w % 4) {\n                    var v = p.indexOf(d.charAt(w - 1)) << 2 * (w % 4),\n                        b = p.indexOf(d.charAt(w)) >>> 6 - 2 * (w % 4);\n                    s[q >>> 2] |= (v | b) << 24 - 8 * (q % 4);\n                    q++\n                }\n            return l.create(s, q)\n        },\n        _map: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\"\n    }\n})();\n(function (u) {\n    function l(b, e, a, c, m, f, t) {\n        b = b + (e & a | ~e & c) + m + t;\n        return (b << f | b >>> 32 - f) + e\n    }\n\n    function d(b, e, a, c, m, f, t) {\n        b = b + (e & c | a & ~c) + m + t;\n        return (b << f | b >>> 32 - f) + e\n    }\n\n    function n(b, e, a, c, m, f, t) {\n        b = b + (e ^ a ^ c) + m + t;\n        return (b << f | b >>> 32 - f) + e\n    }\n\n    function p(b, e, a, c, m, f, t) {\n        b = b + (a ^ (e | ~c)) + m + t;\n        return (b << f | b >>> 32 - f) + e\n    }\n\n    for (var s = CryptoJS, q = s.lib, w = q.WordArray, v = q.Hasher, q = s.algo, b = [], x = 0; 64 > x; x++) b[x] =\n        4294967296 * u.abs(u.sin(x + 1)) | 0;\n    q = q.MD5 = v.extend({\n        _doReset: function () {\n            this._hash = new w.init([1732584193, 4023233417, 2562383102, 271733878])\n        },\n        _doProcessBlock: function (r, e) {\n            for (var a = 0; 16 > a; a++) {\n                var c = e + a,\n                    m = r[c];\n                r[c] = (m << 8 | m >>> 24) & 16711935 | (m << 24 | m >>> 8) & 4278255360\n            }\n            var a = this._hash.words,\n                c = r[e + 0],\n                m = r[e + 1],\n                f = r[e + 2],\n                t = r[e + 3],\n                y = r[e + 4],\n                q = r[e + 5],\n                s = r[e + 6],\n                w = r[e + 7],\n                v = r[e + 8],\n                u = r[e + 9],\n                x = r[e + 10],\n                z = r[e + 11],\n                A = r[e + 12],\n                B = r[e + 13],\n                C = r[e + 14],\n                D = r[e + 15],\n                g = a[0],\n                h = a[1],\n                j = a[2],\n                k = a[3],\n                g = l(g, h, j, k, c, 7, b[0]),\n                k = l(k, g, h, j, m, 12, b[1]),\n                j = l(j, k, g, h, f, 17, b[2]),\n                h = l(h, j, k, g, t, 22, b[3]),\n                g = l(g, h, j, k, y, 7, b[4]),\n                k = l(k, g, h, j, q, 12, b[5]),\n                j = l(j, k, g, h, s, 17, b[6]),\n                h = l(h, j, k, g, w, 22, b[7]),\n                g = l(g, h, j, k, v, 7, b[8]),\n                k = l(k, g, h, j, u, 12, b[9]),\n                j = l(j, k, g, h, x, 17, b[10]),\n                h = l(h, j, k, g, z, 22, b[11]),\n                g = l(g, h, j, k, A, 7, b[12]),\n                k = l(k, g, h, j, B, 12, b[13]),\n                j = l(j, k, g, h, C, 17, b[14]),\n                h = l(h, j, k, g, D, 22, b[15]),\n                g = d(g, h, j, k, m, 5, b[16]),\n                k = d(k, g, h, j, s, 9, b[17]),\n                j = d(j, k, g, h, z, 14, b[18]),\n                h = d(h, j, k, g, c, 20, b[19]),\n                g = d(g, h, j, k, q, 5, b[20]),\n                k = d(k, g, h, j, x, 9, b[21]),\n                j = d(j, k, g, h, D, 14, b[22]),\n                h = d(h, j, k, g, y, 20, b[23]),\n                g = d(g, h, j, k, u, 5, b[24]),\n                k = d(k, g, h, j, C, 9, b[25]),\n                j = d(j, k, g, h, t, 14, b[26]),\n                h = d(h, j, k, g, v, 20, b[27]),\n                g = d(g, h, j, k, B, 5, b[28]),\n                k = d(k, g, h, j, f, 9, b[29]),\n                j = d(j, k, g, h, w, 14, b[30]),\n                h = d(h, j, k, g, A, 20, b[31]),\n                g = n(g, h, j, k, q, 4, b[32]),\n                k = n(k, g, h, j, v, 11, b[33]),\n                j = n(j, k, g, h, z, 16, b[34]),\n                h = n(h, j, k, g, C, 23, b[35]),\n                g = n(g, h, j, k, m, 4, b[36]),\n                k = n(k, g, h, j, y, 11, b[37]),\n                j = n(j, k, g, h, w, 16, b[38]),\n                h = n(h, j, k, g, x, 23, b[39]),\n                g = n(g, h, j, k, B, 4, b[40]),\n                k = n(k, g, h, j, c, 11, b[41]),\n                j = n(j, k, g, h, t, 16, b[42]),\n                h = n(h, j, k, g, s, 23, b[43]),\n                g = n(g, h, j, k, u, 4, b[44]),\n                k = n(k, g, h, j, A, 11, b[45]),\n                j = n(j, k, g, h, D, 16, b[46]),\n                h = n(h, j, k, g, f, 23, b[47]),\n                g = p(g, h, j, k, c, 6, b[48]),\n                k = p(k, g, h, j, w, 10, b[49]),\n                j = p(j, k, g, h, C, 15, b[50]),\n                h = p(h, j, k, g, q, 21, b[51]),\n                g = p(g, h, j, k, A, 6, b[52]),\n                k = p(k, g, h, j, t, 10, b[53]),\n                j = p(j, k, g, h, x, 15, b[54]),\n                h = p(h, j, k, g, m, 21, b[55]),\n                g = p(g, h, j, k, v, 6, b[56]),\n                k = p(k, g, h, j, D, 10, b[57]),\n                j = p(j, k, g, h, s, 15, b[58]),\n                h = p(h, j, k, g, B, 21, b[59]),\n                g = p(g, h, j, k, y, 6, b[60]),\n                k = p(k, g, h, j, z, 10, b[61]),\n                j = p(j, k, g, h, f, 15, b[62]),\n                h = p(h, j, k, g, u, 21, b[63]);\n            a[0] = a[0] + g | 0;\n            a[1] = a[1] + h | 0;\n            a[2] = a[2] + j | 0;\n            a[3] = a[3] + k | 0\n        },\n        _doFinalize: function () {\n            var b = this._data,\n                e = b.words,\n                a = 8 * this._nDataBytes,\n                c = 8 * b.sigBytes;\n            e[c >>> 5] |= 128 << 24 - c % 32;\n            var m = u.floor(a / 4294967296);\n            e[(c + 64 >>> 9 << 4) + 15] = (m << 8 | m >>> 24) & 16711935 | (m << 24 | m >>> 8) & 4278255360;\n            e[(c + 64 >>> 9 << 4) + 14] = (a << 8 | a >>> 24) & 16711935 | (a << 24 | a >>> 8) & 4278255360;\n            b.sigBytes = 4 * (e.length + 1);\n            this._process();\n            b = this._hash;\n            e = b.words;\n            for (a = 0; 4 > a; a++) c = e[a], e[a] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;\n            return b\n        },\n        clone: function () {\n            var b = v.clone.call(this);\n            b._hash = this._hash.clone();\n            return b\n        }\n    });\n    s.MD5 = v._createHelper(q);\n    s.HmacMD5 = v._createHmacHelper(q)\n})(Math);\n(function () {\n    var u = CryptoJS,\n        l = u.lib,\n        d = l.Base,\n        n = l.WordArray,\n        l = u.algo,\n        p = l.EvpKDF = d.extend({\n            cfg: d.extend({\n                keySize: 4,\n                hasher: l.MD5,\n                iterations: 1\n            }),\n            init: function (d) {\n                this.cfg = this.cfg.extend(d)\n            },\n            compute: function (d, l) {\n                for (var p = this.cfg, v = p.hasher.create(), b = n.create(), u = b.words, r = p.keySize, p = p.iterations; u\n                    .length < r;) {\n                    e && v.update(e);\n                    var e = v.update(d).finalize(l);\n                    v.reset();\n                    for (var a = 1; a < p; a++) e = v.finalize(e), v.reset();\n                    b.concat(e)\n                }\n                b.sigBytes = 4 * r;\n                return b\n            }\n        });\n    u.EvpKDF = function (d, l, n) {\n        return p.create(n).compute(d, l)\n    }\n})();\nCryptoJS.lib.Cipher || function (u) {\n    var l = CryptoJS,\n        d = l.lib,\n        n = d.Base,\n        p = d.WordArray,\n        s = d.BufferedBlockAlgorithm,\n        q = l.enc.Base64,\n        w = l.algo.EvpKDF,\n        v = d.Cipher = s.extend({\n            cfg: n.extend(),\n            createEncryptor: function (m, a) {\n                return this.create(this._ENC_XFORM_MODE, m, a)\n            },\n            createDecryptor: function (m, a) {\n                return this.create(this._DEC_XFORM_MODE, m, a)\n            },\n            init: function (m, a, b) {\n                this.cfg = this.cfg.extend(b);\n                this._xformMode = m;\n                this._key = a;\n                this.reset()\n            },\n            reset: function () {\n                s.reset.call(this);\n                this._doReset()\n            },\n            process: function (a) {\n                this._append(a);\n                return this._process()\n            },\n            finalize: function (a) {\n                a && this._append(a);\n                return this._doFinalize()\n            },\n            keySize: 4,\n            ivSize: 4,\n            _ENC_XFORM_MODE: 1,\n            _DEC_XFORM_MODE: 2,\n            _createHelper: function (m) {\n                return {\n                    encrypt: function (f, b, e) {\n                        return (\"string\" == typeof b ? c : a).encrypt(m, f, b, e)\n                    },\n                    decrypt: function (f, b, e) {\n                        return (\"string\" == typeof b ? c : a).decrypt(m, f, b, e)\n                    }\n                }\n            }\n        });\n    d.StreamCipher = v.extend({\n        _doFinalize: function () {\n            return this._process(!0)\n        },\n        blockSize: 1\n    });\n    var b = l.mode = {},\n        x = function (a, f, b) {\n            var c = this._iv;\n            c ? this._iv = u : c = this._prevBlock;\n            for (var e = 0; e < b; e++) a[f + e] ^= c[e]\n        },\n        r = (d.BlockCipherMode = n.extend({\n            createEncryptor: function (a, f) {\n                return this.Encryptor.create(a, f)\n            },\n            createDecryptor: function (a, f) {\n                return this.Decryptor.create(a, f)\n            },\n            init: function (a, f) {\n                this._cipher = a;\n                this._iv = f\n            }\n        })).extend();\n    r.Encryptor = r.extend({\n        processBlock: function (a, f) {\n            var b = this._cipher,\n                c = b.blockSize;\n            x.call(this, a, f, c);\n            b.encryptBlock(a, f);\n            this._prevBlock = a.slice(f, f + c)\n        }\n    });\n    r.Decryptor = r.extend({\n        processBlock: function (a, b) {\n            var c = this._cipher,\n                e = c.blockSize,\n                d = a.slice(b, b + e);\n            c.decryptBlock(a, b);\n            x.call(this, a, b, e);\n            this._prevBlock = d\n        }\n    });\n    b = b.CBC = r;\n    r = (l.pad = {}).Pkcs7 = {\n        pad: function (a, b) {\n            for (var c = 4 * b, c = c - a.sigBytes % c, e = c << 24 | c << 16 | c << 8 | c, d = [], l = 0; l < c; l += 4) d\n                .push(e);\n            c = p.create(d, c);\n            a.concat(c)\n        },\n        unpad: function (a) {\n            a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255\n        }\n    };\n    d.BlockCipher = v.extend({\n        cfg: v.cfg.extend({\n            mode: b,\n            padding: r\n        }),\n        reset: function () {\n            v.reset.call(this);\n            var a = this.cfg,\n                c = a.iv,\n                a = a.mode;\n            if (this._xformMode == this._ENC_XFORM_MODE) var b = a.createEncryptor;\n            else b = a.createDecryptor, this._minBufferSize = 1;\n            this._mode = b.call(a, this, c && c.words)\n        },\n        _doProcessBlock: function (a, c) {\n            this._mode.processBlock(a, c)\n        },\n        _doFinalize: function () {\n            var a = this.cfg.padding;\n            if (this._xformMode == this._ENC_XFORM_MODE) {\n                a.pad(this._data, this.blockSize);\n                var c = this._process(!0)\n            } else c = this._process(!0), a.unpad(c);\n            return c\n        },\n        blockSize: 4\n    });\n    var e = d.CipherParams = n.extend({\n            init: function (a) {\n                this.mixIn(a)\n            },\n            toString: function (a) {\n                return (a || this.formatter).stringify(this)\n            }\n        }),\n        b = (l.format = {}).OpenSSL = {\n            stringify: function (a) {\n                var c = a.ciphertext;\n                a = a.salt;\n                return (a ? p.create([1398893684, 1701076831]).concat(a).concat(c) : c).toString(q)\n            },\n            parse: function (a) {\n                a = q.parse(a);\n                var c = a.words;\n                if (1398893684 == c[0] && 1701076831 == c[1]) {\n                    var b = p.create(c.slice(2, 4));\n                    c.splice(0, 4);\n                    a.sigBytes -= 16\n                }\n                return e.create({\n                    ciphertext: a,\n                    salt: b\n                })\n            }\n        },\n        a = d.SerializableCipher = n.extend({\n            cfg: n.extend({\n                format: b\n            }),\n            encrypt: function (a, c, b, d) {\n                d = this.cfg.extend(d);\n                var l = a.createEncryptor(b, d);\n                c = l.finalize(c);\n                l = l.cfg;\n                return e.create({\n                    ciphertext: c,\n                    key: b,\n                    iv: l.iv,\n                    algorithm: a,\n                    mode: l.mode,\n                    padding: l.padding,\n                    blockSize: a.blockSize,\n                    formatter: d.format\n                })\n            },\n            decrypt: function (a, c, b, e) {\n                e = this.cfg.extend(e);\n                c = this._parse(c, e.format);\n                return a.createDecryptor(b, e).finalize(c.ciphertext)\n            },\n            _parse: function (a, c) {\n                return \"string\" == typeof a ? c.parse(a, this) : a\n            }\n        }),\n        l = (l.kdf = {}).OpenSSL = {\n            execute: function (a, c, b, d) {\n                d || (d = p.random(8));\n                a = w.create({\n                    keySize: c + b\n                }).compute(a, d);\n                b = p.create(a.words.slice(c), 4 * b);\n                a.sigBytes = 4 * c;\n                return e.create({\n                    key: a,\n                    iv: b,\n                    salt: d\n                })\n            }\n        },\n        c = d.PasswordBasedCipher = a.extend({\n            cfg: a.cfg.extend({\n                kdf: l\n            }),\n            encrypt: function (c, b, e, d) {\n                d = this.cfg.extend(d);\n                e = d.kdf.execute(e, c.keySize, c.ivSize);\n                d.iv = e.iv;\n                c = a.encrypt.call(this, c, b, e.key, d);\n                c.mixIn(e);\n                return c\n            },\n            decrypt: function (c, b, e, d) {\n                d = this.cfg.extend(d);\n                b = this._parse(b, d.format);\n                e = d.kdf.execute(e, c.keySize, c.ivSize, b.salt);\n                d.iv = e.iv;\n                return a.decrypt.call(this, c, b, e.key, d)\n            }\n        })\n}();\n(function () {\n    function u(b, a) {\n        var c = (this._lBlock >>> b ^ this._rBlock) & a;\n        this._rBlock ^= c;\n        this._lBlock ^= c << b\n    }\n\n    function l(b, a) {\n        var c = (this._rBlock >>> b ^ this._lBlock) & a;\n        this._lBlock ^= c;\n        this._rBlock ^= c << b\n    }\n\n    var d = CryptoJS,\n        n = d.lib,\n        p = n.WordArray,\n        n = n.BlockCipher,\n        s = d.algo,\n        q = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,\n            63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4\n        ],\n        w = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47,\n            55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32\n        ],\n        v = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],\n        b = [{\n            \"0\": 8421888,\n            268435456: 32768,\n            536870912: 8421378,\n            805306368: 2,\n            1073741824: 512,\n            1342177280: 8421890,\n            1610612736: 8389122,\n            1879048192: 8388608,\n            2147483648: 514,\n            2415919104: 8389120,\n            2684354560: 33280,\n            2952790016: 8421376,\n            3221225472: 32770,\n            3489660928: 8388610,\n            3758096384: 0,\n            4026531840: 33282,\n            134217728: 0,\n            402653184: 8421890,\n            671088640: 33282,\n            939524096: 32768,\n            1207959552: 8421888,\n            1476395008: 512,\n            1744830464: 8421378,\n            2013265920: 2,\n            2281701376: 8389120,\n            2550136832: 33280,\n            2818572288: 8421376,\n            3087007744: 8389122,\n            3355443200: 8388610,\n            3623878656: 32770,\n            3892314112: 514,\n            4160749568: 8388608,\n            1: 32768,\n            268435457: 2,\n            536870913: 8421888,\n            805306369: 8388608,\n            1073741825: 8421378,\n            1342177281: 33280,\n            1610612737: 512,\n            1879048193: 8389122,\n            2147483649: 8421890,\n            2415919105: 8421376,\n            2684354561: 8388610,\n            2952790017: 33282,\n            3221225473: 514,\n            3489660929: 8389120,\n            3758096385: 32770,\n            4026531841: 0,\n            134217729: 8421890,\n            402653185: 8421376,\n            671088641: 8388608,\n            939524097: 512,\n            1207959553: 32768,\n            1476395009: 8388610,\n            1744830465: 2,\n            2013265921: 33282,\n            2281701377: 32770,\n            2550136833: 8389122,\n            2818572289: 514,\n            3087007745: 8421888,\n            3355443201: 8389120,\n            3623878657: 0,\n            3892314113: 33280,\n            4160749569: 8421378\n        }, {\n            \"0\": 1074282512,\n            16777216: 16384,\n            33554432: 524288,\n            50331648: 1074266128,\n            67108864: 1073741840,\n            83886080: 1074282496,\n            100663296: 1073758208,\n            117440512: 16,\n            134217728: 540672,\n            150994944: 1073758224,\n            167772160: 1073741824,\n            184549376: 540688,\n            201326592: 524304,\n            218103808: 0,\n            234881024: 16400,\n            251658240: 1074266112,\n            8388608: 1073758208,\n            25165824: 540688,\n            41943040: 16,\n            58720256: 1073758224,\n            75497472: 1074282512,\n            92274688: 1073741824,\n            109051904: 524288,\n            125829120: 1074266128,\n            142606336: 524304,\n            159383552: 0,\n            176160768: 16384,\n            192937984: 1074266112,\n            209715200: 1073741840,\n            226492416: 540672,\n            243269632: 1074282496,\n            260046848: 16400,\n            268435456: 0,\n            285212672: 1074266128,\n            301989888: 1073758224,\n            318767104: 1074282496,\n            335544320: 1074266112,\n            352321536: 16,\n            369098752: 540688,\n            385875968: 16384,\n            402653184: 16400,\n            419430400: 524288,\n            436207616: 524304,\n            452984832: 1073741840,\n            469762048: 540672,\n            486539264: 1073758208,\n            503316480: 1073741824,\n            520093696: 1074282512,\n            276824064: 540688,\n            293601280: 524288,\n            310378496: 1074266112,\n            327155712: 16384,\n            343932928: 1073758208,\n            360710144: 1074282512,\n            377487360: 16,\n            394264576: 1073741824,\n            411041792: 1074282496,\n            427819008: 1073741840,\n            444596224: 1073758224,\n            461373440: 524304,\n            478150656: 0,\n            494927872: 16400,\n            511705088: 1074266128,\n            528482304: 540672\n        }, {\n            \"0\": 260,\n            1048576: 0,\n            2097152: 67109120,\n            3145728: 65796,\n            4194304: 65540,\n            5242880: 67108868,\n            6291456: 67174660,\n            7340032: 67174400,\n            8388608: 67108864,\n            9437184: 67174656,\n            10485760: 65792,\n            11534336: 67174404,\n            12582912: 67109124,\n            13631488: 65536,\n            14680064: 4,\n            15728640: 256,\n            524288: 67174656,\n            1572864: 67174404,\n            2621440: 0,\n            3670016: 67109120,\n            4718592: 67108868,\n            5767168: 65536,\n            6815744: 65540,\n            7864320: 260,\n            8912896: 4,\n            9961472: 256,\n            11010048: 67174400,\n            12058624: 65796,\n            13107200: 65792,\n            14155776: 67109124,\n            15204352: 67174660,\n            16252928: 67108864,\n            16777216: 67174656,\n            17825792: 65540,\n            18874368: 65536,\n            19922944: 67109120,\n            20971520: 256,\n            22020096: 67174660,\n            23068672: 67108868,\n            24117248: 0,\n            25165824: 67109124,\n            26214400: 67108864,\n            27262976: 4,\n            28311552: 65792,\n            29360128: 67174400,\n            30408704: 260,\n            31457280: 65796,\n            32505856: 67174404,\n            17301504: 67108864,\n            18350080: 260,\n            19398656: 67174656,\n            20447232: 0,\n            21495808: 65540,\n            22544384: 67109120,\n            23592960: 256,\n            24641536: 67174404,\n            25690112: 65536,\n            26738688: 67174660,\n            27787264: 65796,\n            28835840: 67108868,\n            29884416: 67109124,\n            30932992: 67174400,\n            31981568: 4,\n            33030144: 65792\n        }, {\n            \"0\": 2151682048,\n            65536: 2147487808,\n            131072: 4198464,\n            196608: 2151677952,\n            262144: 0,\n            327680: 4198400,\n            393216: 2147483712,\n            458752: 4194368,\n            524288: 2147483648,\n            589824: 4194304,\n            655360: 64,\n            720896: 2147487744,\n            786432: 2151678016,\n            851968: 4160,\n            917504: 4096,\n            983040: 2151682112,\n            32768: 2147487808,\n            98304: 64,\n            163840: 2151678016,\n            229376: 2147487744,\n            294912: 4198400,\n            360448: 2151682112,\n            425984: 0,\n            491520: 2151677952,\n            557056: 4096,\n            622592: 2151682048,\n            688128: 4194304,\n            753664: 4160,\n            819200: 2147483648,\n            884736: 4194368,\n            950272: 4198464,\n            1015808: 2147483712,\n            1048576: 4194368,\n            1114112: 4198400,\n            1179648: 2147483712,\n            1245184: 0,\n            1310720: 4160,\n            1376256: 2151678016,\n            1441792: 2151682048,\n            1507328: 2147487808,\n            1572864: 2151682112,\n            1638400: 2147483648,\n            1703936: 2151677952,\n            1769472: 4198464,\n            1835008: 2147487744,\n            1900544: 4194304,\n            1966080: 64,\n            2031616: 4096,\n            1081344: 2151677952,\n            1146880: 2151682112,\n            1212416: 0,\n            1277952: 4198400,\n            1343488: 4194368,\n            1409024: 2147483648,\n            1474560: 2147487808,\n            1540096: 64,\n            1605632: 2147483712,\n            1671168: 4096,\n            1736704: 2147487744,\n            1802240: 2151678016,\n            1867776: 4160,\n            1933312: 2151682048,\n            1998848: 4194304,\n            2064384: 4198464\n        }, {\n            \"0\": 128,\n            4096: 17039360,\n            8192: 262144,\n            12288: 536870912,\n            16384: 537133184,\n            20480: 16777344,\n            24576: 553648256,\n            28672: 262272,\n            32768: 16777216,\n            36864: 537133056,\n            40960: 536871040,\n            45056: 553910400,\n            49152: 553910272,\n            53248: 0,\n            57344: 17039488,\n            61440: 553648128,\n            2048: 17039488,\n            6144: 553648256,\n            10240: 128,\n            14336: 17039360,\n            18432: 262144,\n            22528: 537133184,\n            26624: 553910272,\n            30720: 536870912,\n            34816: 537133056,\n            38912: 0,\n            43008: 553910400,\n            47104: 16777344,\n            51200: 536871040,\n            55296: 553648128,\n            59392: 16777216,\n            63488: 262272,\n            65536: 262144,\n            69632: 128,\n            73728: 536870912,\n            77824: 553648256,\n            81920: 16777344,\n            86016: 553910272,\n            90112: 537133184,\n            94208: 16777216,\n            98304: 553910400,\n            102400: 553648128,\n            106496: 17039360,\n            110592: 537133056,\n            114688: 262272,\n            118784: 536871040,\n            122880: 0,\n            126976: 17039488,\n            67584: 553648256,\n            71680: 16777216,\n            75776: 17039360,\n            79872: 537133184,\n            83968: 536870912,\n            88064: 17039488,\n            92160: 128,\n            96256: 553910272,\n            100352: 262272,\n            104448: 553910400,\n            108544: 0,\n            112640: 553648128,\n            116736: 16777344,\n            120832: 262144,\n            124928: 537133056,\n            129024: 536871040\n        }, {\n            \"0\": 268435464,\n            256: 8192,\n            512: 270532608,\n            768: 270540808,\n            1024: 268443648,\n            1280: 2097152,\n            1536: 2097160,\n            1792: 268435456,\n            2048: 0,\n            2304: 268443656,\n            2560: 2105344,\n            2816: 8,\n            3072: 270532616,\n            3328: 2105352,\n            3584: 8200,\n            3840: 270540800,\n            128: 270532608,\n            384: 270540808,\n            640: 8,\n            896: 2097152,\n            1152: 2105352,\n            1408: 268435464,\n            1664: 268443648,\n            1920: 8200,\n            2176: 2097160,\n            2432: 8192,\n            2688: 268443656,\n            2944: 270532616,\n            3200: 0,\n            3456: 270540800,\n            3712: 2105344,\n            3968: 268435456,\n            4096: 268443648,\n            4352: 270532616,\n            4608: 270540808,\n            4864: 8200,\n            5120: 2097152,\n            5376: 268435456,\n            5632: 268435464,\n            5888: 2105344,\n            6144: 2105352,\n            6400: 0,\n            6656: 8,\n            6912: 270532608,\n            7168: 8192,\n            7424: 268443656,\n            7680: 270540800,\n            7936: 2097160,\n            4224: 8,\n            4480: 2105344,\n            4736: 2097152,\n            4992: 268435464,\n            5248: 268443648,\n            5504: 8200,\n            5760: 270540808,\n            6016: 270532608,\n            6272: 270540800,\n            6528: 270532616,\n            6784: 8192,\n            7040: 2105352,\n            7296: 2097160,\n            7552: 0,\n            7808: 268435456,\n            8064: 268443656\n        }, {\n            \"0\": 1048576,\n            16: 33555457,\n            32: 1024,\n            48: 1049601,\n            64: 34604033,\n            80: 0,\n            96: 1,\n            112: 34603009,\n            128: 33555456,\n            144: 1048577,\n            160: 33554433,\n            176: 34604032,\n            192: 34603008,\n            208: 1025,\n            224: 1049600,\n            240: 33554432,\n            8: 34603009,\n            24: 0,\n            40: 33555457,\n            56: 34604032,\n            72: 1048576,\n            88: 33554433,\n            104: 33554432,\n            120: 1025,\n            136: 1049601,\n            152: 33555456,\n            168: 34603008,\n            184: 1048577,\n            200: 1024,\n            216: 34604033,\n            232: 1,\n            248: 1049600,\n            256: 33554432,\n            272: 1048576,\n            288: 33555457,\n            304: 34603009,\n            320: 1048577,\n            336: 33555456,\n            352: 34604032,\n            368: 1049601,\n            384: 1025,\n            400: 34604033,\n            416: 1049600,\n            432: 1,\n            448: 0,\n            464: 34603008,\n            480: 33554433,\n            496: 1024,\n            264: 1049600,\n            280: 33555457,\n            296: 34603009,\n            312: 1,\n            328: 33554432,\n            344: 1048576,\n            360: 1025,\n            376: 34604032,\n            392: 33554433,\n            408: 34603008,\n            424: 0,\n            440: 34604033,\n            456: 1049601,\n            472: 1024,\n            488: 33555456,\n            504: 1048577\n        }, {\n            \"0\": 134219808,\n            1: 131072,\n            2: 134217728,\n            3: 32,\n            4: 131104,\n            5: 134350880,\n            6: 134350848,\n            7: 2048,\n            8: 134348800,\n            9: 134219776,\n            10: 133120,\n            11: 134348832,\n            12: 2080,\n            13: 0,\n            14: 134217760,\n            15: 133152,\n            2147483648: 2048,\n            2147483649: 134350880,\n            2147483650: 134219808,\n            2147483651: 134217728,\n            2147483652: 134348800,\n            2147483653: 133120,\n            2147483654: 133152,\n            2147483655: 32,\n            2147483656: 134217760,\n            2147483657: 2080,\n            2147483658: 131104,\n            2147483659: 134350848,\n            2147483660: 0,\n            2147483661: 134348832,\n            2147483662: 134219776,\n            2147483663: 131072,\n            16: 133152,\n            17: 134350848,\n            18: 32,\n            19: 2048,\n            20: 134219776,\n            21: 134217760,\n            22: 134348832,\n            23: 131072,\n            24: 0,\n            25: 131104,\n            26: 134348800,\n            27: 134219808,\n            28: 134350880,\n            29: 133120,\n            30: 2080,\n            31: 134217728,\n            2147483664: 131072,\n            2147483665: 2048,\n            2147483666: 134348832,\n            2147483667: 133152,\n            2147483668: 32,\n            2147483669: 134348800,\n            2147483670: 134217728,\n            2147483671: 134219808,\n            2147483672: 134350880,\n            2147483673: 134217760,\n            2147483674: 134219776,\n            2147483675: 0,\n            2147483676: 133120,\n            2147483677: 2080,\n            2147483678: 131104,\n            2147483679: 134350848\n        }],\n        x = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],\n        r = s.DES = n.extend({\n            _doReset: function () {\n                for (var b = this._key.words, a = [], c = 0; 56 > c; c++) {\n                    var d = q[c] - 1;\n                    a[c] = b[d >>> 5] >>> 31 - d % 32 & 1\n                }\n                b = this._subKeys = [];\n                for (d = 0; 16 > d; d++) {\n                    for (var f = b[d] = [], l = v[d], c = 0; 24 > c; c++) f[c / 6 | 0] |= a[(w[c] - 1 + l) % 28] << 31 - c % 6,\n                        f[4 + (c / 6 | 0)] |= a[28 + (w[c + 24] - 1 + l) % 28] << 31 - c % 6;\n                    f[0] = f[0] << 1 | f[0] >>> 31;\n                    for (c = 1; 7 > c; c++) f[c] >>>= 4 * (c - 1) + 3;\n                    f[7] = f[7] << 5 | f[7] >>> 27\n                }\n                a = this._invSubKeys = [];\n                for (c = 0; 16 > c; c++) a[c] = b[15 - c]\n            },\n            encryptBlock: function (b, a) {\n                this._doCryptBlock(b, a, this._subKeys)\n            },\n            decryptBlock: function (b, a) {\n                this._doCryptBlock(b, a, this._invSubKeys)\n            },\n            _doCryptBlock: function (e, a, c) {\n                this._lBlock = e[a];\n                this._rBlock = e[a + 1];\n                u.call(this, 4, 252645135);\n                u.call(this, 16, 65535);\n                l.call(this, 2, 858993459);\n                l.call(this, 8, 16711935);\n                u.call(this, 1, 1431655765);\n                for (var d = 0; 16 > d; d++) {\n                    for (var f = c[d], n = this._lBlock, p = this._rBlock, q = 0, r = 0; 8 > r; r++) q |= b[r][((p ^ f[r]) & x[r]) >>>\n                    0\n                        ];\n                    this._lBlock = p;\n                    this._rBlock = n ^ q\n                }\n                c = this._lBlock;\n                this._lBlock = this._rBlock;\n                this._rBlock = c;\n                u.call(this, 1, 1431655765);\n                l.call(this, 8, 16711935);\n                l.call(this, 2, 858993459);\n                u.call(this, 16, 65535);\n                u.call(this, 4, 252645135);\n                e[a] = this._lBlock;\n                e[a + 1] = this._rBlock\n            },\n            keySize: 2,\n            ivSize: 2,\n            blockSize: 2\n        });\n    d.DES = n._createHelper(r);\n    s = s.TripleDES = n.extend({\n        _doReset: function () {\n            var b = this._key.words;\n            this._des1 = r.createEncryptor(p.create(b.slice(0, 2)));\n            this._des2 = r.createEncryptor(p.create(b.slice(2, 4)));\n            this._des3 = r.createEncryptor(p.create(b.slice(4, 6)))\n        },\n        encryptBlock: function (b, a) {\n            this._des1.encryptBlock(b, a);\n            this._des2.decryptBlock(b, a);\n            this._des3.encryptBlock(b, a)\n        },\n        decryptBlock: function (b, a) {\n            this._des3.decryptBlock(b, a);\n            this._des2.encryptBlock(b, a);\n            this._des1.decryptBlock(b, a)\n        },\n        keySize: 6,\n        ivSize: 2,\n        blockSize: 2\n    });\n    d.TripleDES = n._createHelper(s)\n})();\n\nCryptoJS.mode.ECB = (function () {\n    var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n    ECB.Encryptor = ECB.extend({\n        processBlock: function (words, offset) {\n            this._cipher.encryptBlock(words, offset);\n        }\n    });\n\n    ECB.Decryptor = ECB.extend({\n        processBlock: function (words, offset) {\n            this._cipher.decryptBlock(words, offset);\n        }\n    });\n\n    return ECB;\n}());\n\n\nvar decryptRSAKey;\n\n//rsa解密  --privateKeyStr解密key ，cKeyStr要解密数据\nfunction decryptRSA(privateKeyStr, cKeyStr) {\n    var crypt = new JSEncrypt();\n    crypt.setPrivateKey(privateKeyStr);\n    decryptRSAKey = crypt.decrypt(cKeyStr);\n    return decryptRSAKey;\n}\n\n//DES加密  message要加密数据，key加密key\nfunction encryptByDES(message) {\n    var keyHex = CryptoJS.enc.Utf8.parse(decryptRSAKey);\n    var encrypted = CryptoJS.DES.encrypt(message, keyHex, {\n        mode: CryptoJS.mode.ECB,\n        padding: CryptoJS.pad.Pkcs7\n    });\n    return encrypted.toString();\n}\n\nfunction decryptByDES(ciphertext) {\n    var keyHex = CryptoJS.enc.Utf8.parse(decryptRSAKey);\n    var decrypted = CryptoJS.DES.decrypt({\n        ciphertext: CryptoJS.enc.Base64.parse(ciphertext)\n    }, keyHex, {\n        mode: CryptoJS.mode.ECB,\n        padding: CryptoJS.pad.Pkcs7\n    });\n    return decrypted.toString(CryptoJS.enc.Utf8);\n}\n\nfunction test(key) {\n    return encryptByDES(key)\n}"
  },
  {
    "path": "其他实战/【青海移动】登陆参数生成/make_param.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-09-12  Python: 3.7\nimport execjs.runtime_names\n\n\nclass QinHaiYiDong:\n    \"\"\"\n    青海移动\n    参数加密\n    https://www.iqhmall.cn/shopweb/logon/logon\n    \"\"\"\n    def __init__(self, user, pwd):\n        self.js = None\n        self.user = user\n        self.pwd = pwd\n        self.init_js()\n\n    def init_js(self):\n        print('引擎', execjs.get().name)\n        with open(\"encryp.js\", \"r\", encoding=\"utf-8\") as f:\n            self.js = execjs.compile(f.read())\n\n    def make_param(self):\n        print(self.js.call('test', self.pwd))\n\n\nif __name__ == '__main__':\n    yd = QinHaiYiDong('17327362817', '123123123')\n    yd.make_param()\n"
  },
  {
    "path": "其他实战/【餐饮】查询信息/FoodInfo.py",
    "content": "# -*- encoding: utf-8 -*-\n# Time    :   2020/01/16\n# Author  :   Zok\n# Email   :   362416272@qq.com\n\nimport requests\nimport re\nimport json\nfrom copyheaders import headers_raw_to_dict\n\n\nclass Food:\n    \"\"\"\n    根据输入美团餐馆名，解析参观基础信息\n    \"\"\"\n    def __init__(self):\n        self.headers = headers_raw_to_dict(b\"\"\"\n        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\n        Accept-Encoding: gzip, deflate, br\n        Accept-Language: zh-CN,zh;q=0.9\n        Cache-Control: max-age=0\n        Connection: keep-alive\n        Cookie: _lxsdk_s=16fb0ce3a0d-4cf-d9e-cf2%7C%7C1\n        Host: www.meituan.com\n        Sec-Fetch-Mode: navigate\n        Sec-Fetch-Site: none\n        Sec-Fetch-User: ?1\n        Upgrade-Insecure-Requests: 1\n        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36\n        \"\"\")\n\n    def get_info(self, url):\n        response = requests.get(url, headers=self.headers)\n        data = json.loads(re.search(r'<script>window\\._appState = (.*?);</script><script', response.text).group(1))\n        info = data.get('detailInfo')\n        images = data.get('photos')\n        print(info)\n        print(images)\n\n\nif __name__ == '__main__':\n    fd = Food()\n    fd.get_info(\"https://www.meituan.com/meishi/177501077/\")"
  },
  {
    "path": "其他实战/【餐饮】查询信息/__init__.py",
    "content": "# -*- encoding: utf-8 -*-\n# Auth: Zok  Email: 362416272@qq.com\n# Date: 2020/1/17\n\n"
  },
  {
    "path": "其他实战/【餐饮】查询信息/t.html",
    "content": "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\"><title>北京美团网-北京美食_酒店_旅游_团购_电影_吃喝玩乐</title><meta name=\"description\" content=\"北京美团网精选北京美食餐厅,酒店预订,电影票,旅游景点,外卖订餐,北京团购信息,您可查询商家评价店铺信息。北京生活,下载美团官方APP ,吃喝玩乐1折起。\"><meta name=\"keywords\" content=\"北京美食,北京酒店,北京团购\"><meta name=\"format-detection\" content=\"telephone=no\"><meta name=\"format-detection\" content=\"address=no\"><meta name=\"lx:category\" content=\"group\"><meta name=\"lx:cid\"><meta name=\"lx:appnm\" content=\"mtpc\"><meta name=\"lx:autopv\" content=\"off\"><link rel=\"dns-prefetch\" href=\"//analytics.meituan.net\"><link rel=\"dns-prefetch\" href=\"//analytics.meituan.net\"><link rel=\"dns-prefetch\" href=\"//www.meituan.com\"><link rel=\"dns-prefetch\" href=\"//s0.meituan.net\"><link rel=\"dns-prefetch\" href=\"//s1.meituan.net\"><link rel=\"dns-prefetch\" href=\"//p0.meituan.net\"><link rel=\"dns-prefetch\" href=\"//p1.meituan.net\"><script>(function() {\n    if (location.protocol == 'http:') {\n        location.href=location.href.replace('http://', 'https://')\n    }\n})()</script><link rel=\"stylesheet\" type=\"text/css\" href=\"//s0.meituan.net/bs/fe-web-meituan/a3320a6/css/main.css\"><link rel=\"stylesheet\" type=\"text/css\" href=\"//s1.meituan.net/bs/fe-web-meituan/e350c4a/css/errorPage.css\"><script src=\"//s0.meituan.net/bs/fe-web-meituan/e9d9492/js/es6-shim.js\"></script><script src=\"//s0.meituan.net/bs/fe-web-meituan/c2006ad/js/lazy-img.js\"></script><script src=\"//s1.meituan.net/bs/fe-web-meituan/e9d9492/js/fetch.js\"></script><script>!(function (win, doc, ns) {\n    var cacheFunName = '_MeiTuanALogObject';\n    win[cacheFunName] = ns;\n    if (!win[ns]) {\n        var _LX = function () {\n            _LX.q.push(arguments);\n            return _LX;\n        };\n        _LX.q = _LX.q || [];\n        _LX.l = +new Date();\n        win[ns] = _LX;\n    }\n})(window, document, 'LXAnalytics');\nvar valLab = null;\nvar environment = null;\n//- 补充pv事件信息\nLXAnalytics('pageView', valLab, environment);\n;(function(exports, undefined){\n    /**\n    * on\n    */\n    function on(el, type, fn){\n        if(!(el instanceof Node)) throw new TypeError('`element` must be a Element');\n        if(typeof type !== 'string') throw new TypeError('`type` must be a String');\n        if(typeof fn !== 'function') throw new TypeError('`handler` must be a Function');\n        return el.addEventListener(type, fn);\n    }\n    // bind dom ready\n    on(document, 'DOMContentLoaded', function(){\n        // @docs http://lx.docs.sankuai.com/web/#_4\n        on(document, 'click', function(e){\n            var el = e.target;\n            while(el) {\n                var bid = el.getAttribute('data-bid');\n                var lab = el.getAttribute('data-lab');\n                if(bid !== null){\n                    try {\n                        LXAnalytics('moduleClick', bid, JSON.parse(lab));\n                        break;\n                    } catch (e) {\n                        console.log(e)\n                    }\n                }\n                var el = el.parentElement;\n            }\n        });\n    });\n\n})(this);</script><script src=\"//analytics.meituan.net/analytics.js\" type=\"text/javascript\" charset=\"utf-8\" async defer></script><script>!function (e, t, n) {\n    function s() {\n        var e = t.createElement(\"script\");\n        e.async = !0, e.src = \"https://s0.meituan.net/bs/js/?f=mta-js:mta.min.js\";\n        var n = t.getElementsByTagName(\"script\")[0];\n        n.parentNode.insertBefore(e, n)\n    }\n\n    \"[object String]\" === Object.prototype.toString.call(n) && (n = [n]), e.MeituanAnalyticsObject = n;\n    for (var r = 0; r < n.length; r++)!function (t) {\n        e[t] = e[t] || function () {\n                    (e[t].q = e[t].q || []).push(arguments)\n                }\n    }(n[r]);\n    if (\"complete\" === t.readyState)s(); else {\n        var i = \"addEventListener\", a = \"attachEvent\";\n        if (e[i])e[i](\"load\", s, !1); else if (e[a])e[a](\"onload\", s); else {\n            var o = e.onload;\n            e.onload = function () {\n                s(), o && o()\n            }\n        }\n    }\n}(window, document, \"mta\"), function (e, t, n) {\n    if (t && !(\"_mta\" in t)) {\n        t._mta = !0;\n        var s = e.location.protocol;\n        if (\"file:\" !== s) {\n            var r = e.location.host, i = t.prototype.open;\n            t.prototype.open = function (t, n, a, o, l) {\n                if (this._method = \"string\" == typeof t ? t.toUpperCase() : null, n) {\n                    if (0 === n.indexOf(\"http://\") || 0 === n.indexOf(\"https://\") || 0 === n.indexOf(\"//\"))this._url = n; else if (0 === n.indexOf(\"/\"))this._url = s + \"//\" + r + n; else {\n                        var h = s + \"//\" + r + e.location.pathname;\n                        h = h.substring(0, h.lastIndexOf(\"/\") + 1), this._url = h + n\n                    }\n                    var u = this._url.indexOf(\"?\");\n                    -1 !== u ? (this._searchLength = this._url.length - 1 - u, this._url = this._url.substring(0, u)) : this._searchLength = 0\n                } else this._url = null, this._searchLength = 0;\n                return this._startTime = (new Date).getTime(), i.apply(this, arguments)\n            };\n            var a = \"onreadystatechange\", o = \"addEventListener\", l = t.prototype.send;\n            t.prototype.send = function (t) {\n                function n(n, r) {\n                    if (0 !== n._url.indexOf(s + \"//frep.meituan.net/_.gif\")) {\n                        for (var i = \"browser.ajax\", a = [98, 114, 111, 119, 115, 101, 114, 46, 97, 106, 97, 120], o = 0, l = i.length; l > o; o++)if (i.charCodeAt(o) !== a[o])return;\n                        var h;\n                        if (n.response)switch (n.responseType) {\n                            case\"json\":\n                                h = JSON && JSON.stringify(n.response).length;\n                                break;\n                            case\"blob\":\n                            case\"moz-blob\":\n                                h = n.response.size;\n                                break;\n                            case\"arraybuffer\":\n                                h = n.response.byteLength;\n                            case\"document\":\n                                h = n.response.documentElement && n.response.documentElement.innerHTML && n.response.documentElement.innerHTML.length + 28;\n                                break;\n                            default:\n                                h = n.response.length\n                        }\n                        e.mta(\"send\", i, {\n                            url: n._url,\n                            method: n._method,\n                            error: !(0 === n.status.toString().indexOf(\"2\") || 304 === n.status),\n                            responseTime: (new Date).getTime() - n._startTime,\n                            requestSize: n._searchLength + (t ? t.length : 0),\n                            responseSize: h || 0\n                        })\n                    }\n                }\n\n                if (o in this) {\n                    var r = function (e) {\n                        n(this, e)\n                    };\n                    this[o](\"load\", r), this[o](\"error\", r), this[o](\"abort\", r)\n                } else {\n                    var i = this[a];\n                    this[a] = function (t) {\n                        i && i.apply(this, arguments), 4 === this.readyState && e.mta && e.mta && n(this, t)\n                    }\n                }\n                return l.apply(this, arguments)\n            }\n        }\n    }\n}(window, window.XMLHttpRequest, \"mta\");\n//- 初始化项目\nmta(\"create\", '59918eb8616ab3217c7eeaf5');\n//- 推荐设置上报地址为 HTTPS 协议，以获得更高的数据准确性，默认会和页面协议一致\nmta(\"config\", \"beaconImage\", \"https://frep.meituan.net/_.gif\");\n\n//- 设置采样率\nmta('config', 'sampleRate', 20);\n\n//- 发送页面性能指标，包括 ttfb（首字节）、domReady（可交互）、load（完全加载）等\nmta(\"send\", \"page\");</script></head><body id=\"main\"><link rel=\"stylesheet\" type=\"text/css\" href=\"//s0.meituan.net/bs/fe-web-meituan/5058856/css/com_header.css\"><header class=\"com-header\"><div class=\"header-bar\"><div class=\"header-content clearfix\"><div class=\"header-bar-position\"><span class=\"header-icon icon-header_location\"></span><span class=\"current-city\">北京</span><a class=\"change-city\" href=\"https://www.meituan.com/changecity/\">切换城市</a><div class=\"near-citys\">[<a class=\"city-guess\" href=\"https://mentougouqu.meituan.com\">门头沟区</a><a class=\"city-guess\" href=\"https://dachangzizhixian.meituan.com\">大厂回族自治县</a><a class=\"city-guess\" href=\"https://lf.meituan.com\">廊坊</a>]</div><div class=\"user-entry\"><a class=\"growth-entry user-up\">立即登录</a><a class=\"extra-entry\">注册</a></div></div><nav class=\"header-bar-nav\"><ul class=\"header-nav-first\"><li class=\"has-child\"><a rel=\"nofollow\" href=\"https://www.meituan.com/account/userinfo/\" target=\"_blank\">我的美团<ul class=\"header-nav-my header-nav-second\"><li><a rel=\"nofollow\" href=\"https://www.meituan.com/orders/\" target=\"_blank\">我的订单</a></li><li><a rel=\"nofollow\" href=\"https://www.meituan.com/collections/\" target=\"_blank\">我的收藏</a></li><li><a rel=\"nofollow\" href=\"https://www.meituan.com/vouchers/\" target=\"_blank\">抵用券</a></li><li><a rel=\"nofollow\" href=\"https://www.meituan.com/account/settings\" target=\"_blank\">账户设置</a></li></ul></a></li><li><a href=\"https://i.meituan.com/mobile/down/meituan\" target=\"_blank\">手机APP</a></li><li class=\"has-child\">商家中心<ul class=\"header-nav-merchant header-nav-second\"><li><a rel=\"nofollow\" href=\"http://b.meituan.com/canyin/PC\" target=\"_blank\">美团餐饮商户中心</a></li><li><a rel=\"nofollow\" href=\"https://e.meituan.com/\" target=\"_blank\">登录商家中心</a></li><li><a rel=\"nofollow\" href=\"https://shouyin.meituan.com?utm_source=inner&amp;utm_medium=mtpcsjzx\">美团智能收银</a></li><li><a rel=\"nofollow\" href=\"https://ecom.meituan.com/bizsettle/settle/merchantsSettle?utm_source=mt_C_my\" target=\"_blank\">我想合作</a></li><li><a rel=\"nofollow\" href=\"https://e.meituan.com/mobile/\" target=\"_blank\">手机免费开店</a></li><li><a rel=\"nofollow\" href=\"https://daili.meituan.com/?comeFrom=mtwebMenu\" target=\"_blank\">餐饮代理商招募</a></li><li><a href=\"https://pc.meituan.com?activity_code=mtpcdh\" target=\"_blank\">商家申请开票</a></li><li><a href=\"https://paidui.meituan.com/?activity_code=168_00038141\" target=\"_blank\">免费合作美团排队</a></li></ul></li><li class=\"has-child\">美团规则<ul class=\"header-nav-my header-nav-second\"><li><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/\" target=\"_blank\">规则中心</a></li><li><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/rules\" target=\"_blank\">规则目录</a></li><li><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/advices\" target=\"_blank\">规则评议院</a></li></ul></li><li class=\"has-child\">网站导航<div class=\"header-nav-site header-nav-second\"><dl class=\"header-jiulv header-nav-third\"><dt>酒店旅游</dt><dd><a href=\"https://www.meituan.com/iflight/\" target=\"_blank\">国际机票</a></dd><dd><a href=\"https://www.meituan.com/train/\" target=\"_blank\">火车票</a></dd><dd><a href=\"https://minsu.meituan.com/\" target=\"_blank\">民宿</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20036/\" target=\"_blank\">经济型酒店</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20037/\" target=\"_blank\">主题酒店</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20038/\" target=\"_blank\">商务酒店</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20039/\" target=\"_blank\">公寓</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20040/\" target=\"_blank\">豪华酒店</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20041/\" target=\"_blank\">客栈</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20042/\" target=\"_blank\">青年旅社</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20043/\" target=\"_blank\">度假酒店</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20044/\" target=\"_blank\">别墅</a></dd><dd><a href=\"https://hotel.meituan.com/beijing/c20045/\" target=\"_blank\">农家院</a></dd></dl><dl class=\"header-meishi header-nav-third\"><dt>吃美食</dt><dd><a href=\"https://bj.meituan.com/meishi/c20004/\" target=\"_blank\">烤鱼</a></dd><dd><a href=\"https://bj.meituan.com/meishi/c36/\" target=\"_blank\">特色小吃</a></dd><dd><a href=\"https://bj.meituan.com/meishi/c54/\" target=\"_blank\">烧烤</a></dd><dd><a href=\"https://bj.meituan.com/meishi/c40/\" target=\"_blank\">自助餐</a></dd><dd><a href=\"https://bj.meituan.com/meishi/c17/\" target=\"_blank\">火锅</a></dd><dd><a href=\"https://bj.meituan.com/meishi/c393/\" target=\"_blank\">代金券</a></dd></dl><dl class=\"header-movie header-nav-third\"><dt>看电影</dt><dd><a href=\"https://maoyan.com/films\" target=\"_blank\">热映电影</a></dd><dd><a href=\"https://maoyan.com/cinemas\" target=\"_blank\">热门影院</a></dd><dd><a href=\"https://maoyan.com/board\" target=\"_blank\">热映电影口碑榜</a></dd><dd><a href=\"https://maoyan.com/board/6\" target=\"_blank\">最受期待电影</a></dd><dd><a href=\"https://maoyan.com/board/1\" target=\"_blank\">国内票房榜</a></dd><dd><a href=\"https://maoyan.com/board/2\" target=\"_blank\">北美票房榜</a></dd><dd><a href=\"https://maoyan.com/board/4\" target=\"_blank\">电影排行榜</a></dd></dl><dl class=\"header-app header-nav-third\"><dt>手机应用</dt><dd><a href=\"https://i.meituan.com/mobile/down/meituan\" target=\"_blank\"><img class=\"appicon\" src=\"//s0.meituan.net/bs/fe-web-meituan/2d53095/img/appicons/meituan.png\" title=\"美团app\" alt=\"美团app\"></a></dd><dd><a href=\"https://waimai.meituan.com/mobile/download/default\" target=\"_blank\"><img class=\"appicon\" src=\"//s1.meituan.net/bs/fe-web-meituan/404d350/img/appicons/waimai.png\" title=\"外卖app\" alt=\"外卖app\"></a></dd><dd><a href=\"https://minsu.meituan.com/app/\" target=\"_blank\"><img class=\"appicon\" src=\"https://p0.meituan.net/travelcube/162c3308d9622f6d9cfaa49e60be4dca8573.png\" title=\"民宿app\" alt=\"民宿app\"></a></dd><dd><a href=\"https://www.dianping.com/events/m/index.htm\" target=\"_blank\"><img class=\"appicon\" src=\"//s1.meituan.net/bs/fe-web-meituan/404d350/img/appicons/dianping.png\" title=\"点评app\" alt=\"点评app\"></a></dd><dd><a href=\"https://maoyan.com/app\" target=\"_blank\"><img class=\"appicon\" src=\"//s1.meituan.net/bs/fe-web-meituan/404d350/img/appicons/maoyan.png\" title=\"猫眼app\" alt=\"猫眼app\"></a></dd></dl></div></li></ul></nav></div></div><div class=\"header-content clearfix\"><div class=\"header-title-module\"><div class=\"header-title\"><a href=\"//bj.meituan.com\"><img src=\"//s0.meituan.net/bs/fe-web-meituan/fa5f0f0/img/logo.png\" alt=\"美团\"></a></div></div><div class=\"header-search-module\"><div class=\"header-search-block\"><input class=\"header-search-input\" type=\"text\" placeholder=\"搜索商家或地点\"><button class=\"header-search-btn\"><span class=\"header-icon icon-search-new\"></span></button></div><div class=\"header-search-suggest\"><div class=\"header-search-noinput\"><div class=\"header-search-history\"><h6>最近搜索</h6><span class=\"header-search-clean\">删除搜索历史</span><ul></ul></div><h6>热门搜索</h6><div class=\"header-search-hotword\"></div></div><div class=\"header-search-hasinput\"><ul></ul></div></div><div class=\"header-search-hotword\"></div></div></div></header><script>window.comPtData = window.comPtData || {};\nwindow.comPtData['header'] = {\"currentCity\":{\"id\":1,\"name\":\"北京\",\"pinyin\":\"beijing\",\"acronym\":\"bj\",\"lng\":39.9098,\"lat\":116.370609}}</script><script src=\"//s0.meituan.net/bs/fe-web-meituan/3a976a4/js/com_header.js\" defer></script>\n      <div id=\"react\"><div class=\"error-container clearfix\" data-reactroot=\"\"><img class=\"error-img\" src=\"//s1.meituan.net/bs/fe-web-meituan/2d53095/img/not-found.png\" alt=\"\"/><p class=\"error-word\">抱歉，页面暂时无法访问... </p><p class=\"error-msg\">错误信息:<!-- -->服务器拒绝请求</p><a class=\"back-to-home\" href=\"https://www.meituan.com\">返回美团首页</a></div></div>\n      <script>window.AppData = {\"errorMsg\":\"403\",\"$config\":{\"mta\":{\"token\":\"59918eb8616ab3217c7eeaf5\",\"sampleRate\":20},\"host\":{\"meituan\":\"meituan.com\",\"www\":\"www.meituan.com\"},\"settingsAPI\":\"https:\\u002F\\u002Fopen.meituan.com\\u002F\",\"configData\":{\"perf\":true},\"buildservice\":{\"name\":\"fe-web-meituan\",\"root\":\"\\u002Fdocker\\u002Fopt\\u002Fmeituan\\u002Fweb_meituan\",\"pipe\":{},\"host\":\"\",\"norm\":\"II\",\"mode\":\"git\",\"hash\":{\"css\\u002FantiFraud.css\":\"e87daa6\",\"css\\u002Fbranch.css\":\"8fcfaea\",\"css\\u002Fbrand.css\":\"8fcfaea\",\"css\\u002FchangeRefund.css\":\"e87daa6\",\"css\\u002FcheckKey.css\":\"e87daa6\",\"css\\u002FcityList.css\":\"d97f90f\",\"css\\u002Fcollections.css\":\"8f3ad4a\",\"css\\u002Fcom_footer.css\":\"8a39c6b\",\"css\\u002Fcom_header.css\":\"5058856\",\"css\\u002FcommentDetail.css\":\"9383476\",\"css\\u002FcommentList.css\":\"9383476\",\"css\\u002FcommonProblem.css\":\"e87daa6\",\"css\\u002Fdrawback.css\":\"e87daa6\",\"css\\u002FerrorPage.css\":\"e350c4a\",\"css\\u002FfoodSafe.css\":\"0a9bb10\",\"css\\u002Findex.css\":\"a3320a6\",\"css\\u002FlawDeclare.css\":\"e87daa6\",\"css\\u002Flist.css\":\"8f3ad4a\",\"css\\u002Fmain.css\":\"a3320a6\",\"css\\u002FmtPromise.css\":\"e87daa6\",\"css\\u002Fopeninfo.css\":\"34aeb91\",\"css\\u002Forders.css\":\"8f3ad4a\",\"css\\u002FphotoDetail.css\":\"8fcfaea\",\"css\\u002FphotoList.css\":\"738e720\",\"css\\u002Fpoi.css\":\"9383476\",\"css\\u002Fprivacy.css\":\"68cdba1\",\"css\\u002Fsearch.css\":\"5058856\",\"css\\u002FserviceAgree.css\":\"e87daa6\",\"css\\u002Fsettings.css\":\"8f3ad4a\",\"css\\u002FshopGuarantee.css\":\"e87daa6\",\"css\\u002FstaticPage.css\":\"ad8a96a\",\"css\\u002FuserAgree.css\":\"26a1275\",\"css\\u002Fuserexinfo.css\":\"8f3ad4a\",\"css\\u002Fvouchers.css\":\"8f3ad4a\",\"favicon.ico\":\"91825b2\",\"font\\u002FMFShangHei-Regular-embed.css\":\"c19c6e9\",\"font\\u002FMFShangHei-Regular.css\":\"c19c6e9\",\"font\\u002FMFShangHei-Regular.eot\":\"c19c6e9\",\"font\\u002FMFShangHei-Regular.svg\":\"c19c6e9\",\"font\\u002FMFShangHei-Regular.ttf\":\"c19c6e9\",\"font\\u002FMFShangHei-Regular.woff\":\"c19c6e9\",\"font\\u002Fcol-iconfont.eot\":\"5dea7ab\",\"font\\u002Fcol-iconfont.svg\":\"5dea7ab\",\"font\\u002Fcol-iconfont.ttf\":\"5dea7ab\",\"font\\u002Fcol-iconfont.woff\":\"5dea7ab\",\"font\\u002Fheader.eot\":\"08a7466\",\"font\\u002Fheader.svg\":\"08a7466\",\"font\\u002Fheader.ttf\":\"08a7466\",\"font\\u002Fheader.woff\":\"08a7466\",\"font\\u002Fhigh-quality.eot\":\"866346d\",\"font\\u002Fhigh-quality.svg\":\"866346d\",\"font\\u002Fhigh-quality.ttf\":\"866346d\",\"font\\u002Fhigh-quality.woff\":\"866346d\",\"font\\u002Fhome-category-iconfont.eot\":\"956dea6\",\"font\\u002Fhome-category-iconfont.svg\":\"5440890\",\"font\\u002Fhome-category-iconfont.ttf\":\"956dea6\",\"font\\u002Fhome-category-iconfont.woff\":\"956dea6\",\"font\\u002Ficon-userinfo.eot\":\"73d802b\",\"font\\u002Ficon-userinfo.svg\":\"73d802b\",\"font\\u002Ficon-userinfo.ttf\":\"73d802b\",\"font\\u002Ficon-userinfo.woff\":\"73d802b\",\"font\\u002Ficonfont-search.eot\":\"80eaf9a\",\"font\\u002Ficonfont-search.svg\":\"80eaf9a\",\"font\\u002Ficonfont-search.ttf\":\"80eaf9a\",\"font\\u002Ficonfont-search.woff\":\"80eaf9a\",\"font\\u002Ficonfont.eot\":\"47fe893\",\"font\\u002Ficonfont.svg\":\"47fe893\",\"font\\u002Ficonfont.ttf\":\"47fe893\",\"font\\u002Ficonfont.woff\":\"47fe893\",\"font\\u002FiconfontNew.eot\":\"bae2c85\",\"font\\u002FiconfontNew.svg\":\"bae2c85\",\"font\\u002FiconfontNew.ttf\":\"bae2c85\",\"font\\u002FiconfontNew.woff\":\"bae2c85\",\"font\\u002FiconfontNew.woff2\":\"5440890\",\"font\\u002Flevel-icon-new.eot\":\"7b38b94\",\"font\\u002Flevel-icon-new.svg\":\"7b38b94\",\"font\\u002Flevel-icon-new.ttf\":\"7b38b94\",\"font\\u002Flevel-icon-new.woff\":\"7b38b94\",\"font\\u002Fnumbers.eot\":\"1ecadbb\",\"font\\u002Fnumbers.svg\":\"1ecadbb\",\"font\\u002Fnumbers.ttf\":\"1ecadbb\",\"font\\u002Fnumbers.woff\":\"1ecadbb\",\"font\\u002Fquote.eot\":\"9ca927a\",\"font\\u002Fquote.svg\":\"9ca927a\",\"font\\u002Fquote.ttf\":\"9ca927a\",\"font\\u002Fquote.woff\":\"9ca927a\",\"font\\u002Ftest.html\":\"7b38b94\",\"img\\u002F3d.png\":\"9d1997a\",\"img\\u002Falbum-placeholder.png\":\"ad33c1f\",\"img\\u002Fappicons\\u002Fdianping.png\":\"404d350\",\"img\\u002Fappicons\\u002Fmaoyan.png\":\"404d350\",\"img\\u002Fappicons\\u002Fmeituan.png\":\"2d53095\",\"img\\u002Fappicons\\u002Fwaimai.png\":\"404d350\",\"img\\u002Fappicons\\u002Fzhenguo.png\":\"404d350\",\"img\\u002Favatar.jpg\":\"e350c4a\",\"img\\u002Favatar.png\":\"ccf602b\",\"img\\u002Fbanner\\u002F1.2.jpg\":\"457b102\",\"img\\u002Fbanner\\u002F1.3.jpg\":\"457b102\",\"img\\u002Fbanner\\u002F1.4.jpg\":\"457b102\",\"img\\u002Fbanner\\u002F1.5.jpg\":\"fe1a2fc\",\"img\\u002Fbanner\\u002F1.jpg\":\"457b102\",\"img\\u002Fbanner\\u002F2.jpg\":\"457b102\",\"img\\u002Fbanner\\u002F3.jpg\":\"a3ad3db\",\"img\\u002Fbanner\\u002F4.jpg\":\"a3ad3db\",\"img\\u002Fbanner\\u002F5.jpg\":\"457b102\",\"img\\u002Fbanner\\u002F6.jpg\":\"94bb50d\",\"img\\u002Fbanner\\u002F7.png\":\"4a8f333\",\"img\\u002Fcard.svg\":\"1ecf23c\",\"img\\u002Fcomment-close-icon.cur\":\"7d832c1\",\"img\\u002Fcomment-close-icon.png\":\"61194eb\",\"img\\u002Fdownload-qr.png\":\"60ac9a0\",\"img\\u002Fexpiring-label.png\":\"12587fc\",\"img\\u002Fform\\u002Fclose.png\":\"64a089b\",\"img\\u002Fform\\u002Ffail-ico.png\":\"64a089b\",\"img\\u002Fform\\u002Fsucc-ico.png\":\"12587fc\",\"img\\u002Fhead-img.png\":\"e3064a3\",\"img\\u002Ficon-right.png\":\"d7abfe4\",\"img\\u002Ficons\\u002F16pt_16pt\\u002Fcheckbox_checked.png\":\"2d53095\",\"img\\u002Ficons\\u002F16pt_16pt\\u002Fcheckbox_unchecked.png\":\"8e9f7b4\",\"img\\u002Ficons\\u002F16pt_16pt\\u002Flocation_colour.png\":\"2d53095\",\"img\\u002Ficons\\u002F16pt_16pt\\u002Ftuan_icon.png\":\"2d53095\",\"img\\u002Ficons\\u002F24pt_24pt\\u002Fcollect_icon.png\":\"05d50bd\",\"img\\u002Ficons\\u002F24pt_24pt\\u002Fcomment_icon.png\":\"05d50bd\",\"img\\u002Ficons\\u002F24pt_24pt\\u002Flike_colour.png\":\"05d50bd\",\"img\\u002Ficons\\u002F24pt_24pt\\u002Flike_gray.png\":\"05d50bd\",\"img\\u002Ficons\\u002F24pt_24pt\\u002Fsafe_icon.png\":\"05d50bd\",\"img\\u002Ficons\\u002F24pt_24pt\\u002Fweixin_icon.png\":\"05d50bd\",\"img\\u002Ficons\\u002F32pt_32pt\\u002Fbestcollection_icon@2x.png\":\"8e9f7b4\",\"img\\u002Ficons\\u002F32pt_32pt\\u002Fmonthlysale_icon@2x.png\":\"8e9f7b4\",\"img\\u002Ficons\\u002F32pt_32pt\\u002Foutdooor_icon@2x.png\":\"8e9f7b4\",\"img\\u002Ficons\\u002F32pt_32pt\\u002Fparking_icon@2x.png\":\"8e9f7b4\",\"img\\u002Ficons\\u002F32pt_32pt\\u002Fwifi_icon@2x.png\":\"8e9f7b4\",\"img\\u002Fimax.png\":\"25e6614\",\"img\\u002Fimax3d.png\":\"25e6614\",\"img\\u002Fleft-arrow.cur\":\"7d832c1\",\"img\\u002Fleft-arrow.png\":\"61194eb\",\"img\\u002Flevel-color\\u002Flevel_1.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_2.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_3.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_4.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_5.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_6.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_7.svg\":\"97ed363\",\"img\\u002Flevel-color\\u002Flevel_8.svg\":\"97ed363\",\"img\\u002Flevel\\u002Flevel_1.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_2.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_3.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_4.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_5.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_6.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_7.svg\":\"7b38b94\",\"img\\u002Flevel\\u002Flevel_8.svg\":\"7b38b94\",\"img\\u002Flocation_orange.png\":\"b96527f\",\"img\\u002Flocation_red.png\":\"b96527f\",\"img\\u002Flogo.png\":\"fa5f0f0\",\"img\\u002Fnext.png\":\"029e5e0\",\"img\\u002Fnot-found-new.png\":\"20e9cc0\",\"img\\u002Fnot-found.png\":\"2d53095\",\"img\\u002Fright-arrow.cur\":\"7d832c1\",\"img\\u002Fright-arrow.png\":\"61194eb\",\"img\\u002Fsearch_icon.png\":\"d97f90f\",\"img\\u002Fsprites\\u002F16pt.png\":\"0b6add2\",\"img\\u002Fsprites\\u002F24pt.png\":\"0b6add2\",\"img\\u002Fsprites\\u002F32pt.png\":\"1afb193\",\"img\\u002Fsprites\\u002Ffooter.png\":\"26b8ec1\",\"img\\u002Fterms\\u002Fhonesty\\u002Fhonesty1.png\":\"d50d29c\",\"img\\u002Fterms\\u002Fhonesty\\u002Fhonesty2.jpg\":\"d50d29c\",\"img\\u002Fterms\\u002Fhonesty\\u002Fhonesty3.png\":\"d50d29c\",\"img\\u002Fterms\\u002Fhonesty\\u002Fhonesty4.png\":\"d50d29c\",\"img\\u002Fticket_silver.png\":\"34e713f\",\"js\\u002FantiFraud.js\":\"076a786\",\"js\\u002Fbranch.js\":\"3a976a4\",\"js\\u002Fbrand.js\":\"3a976a4\",\"js\\u002FchangeRefund.js\":\"34aeb91\",\"js\\u002FcheckKey.js\":\"34aeb91\",\"js\\u002FcityList.js\":\"f2c6837\",\"js\\u002Fcollections.js\":\"3a976a4\",\"js\\u002Fcom_footer.js\":\"34aeb91\",\"js\\u002Fcom_header.js\":\"3a976a4\",\"js\\u002FcommentDetail.js\":\"3a976a4\",\"js\\u002FcommentList.js\":\"3a976a4\",\"js\\u002Fcommon.js\":\"34aeb91\",\"js\\u002FcommonProblem.js\":\"076a786\",\"js\\u002Fdom4.js\":\"d138b07\",\"js\\u002Fdrawback.js\":\"34aeb91\",\"js\\u002FerrorPage.js\":\"8a97026\",\"js\\u002Fes5-sham.js\":\"d138b07\",\"js\\u002Fes5-shim.js\":\"759e638\",\"js\\u002Fes6-sham.js\":\"b34f79f\",\"js\\u002Fes6-shim.js\":\"e9d9492\",\"js\\u002Ffetch.js\":\"e9d9492\",\"js\\u002FfoodSafe.js\":\"34aeb91\",\"js\\u002Fie-shim.js\":\"7845e34\",\"js\\u002Fie8.js\":\"d138b07\",\"js\\u002Findex.js\":\"3a976a4\",\"js\\u002FlawDeclare.js\":\"34aeb91\",\"js\\u002Flazy-img.js\":\"c2006ad\",\"js\\u002Flist.js\":\"3a976a4\",\"js\\u002FmtPromise.js\":\"16ff9e0\",\"js\\u002Fopeninfo.js\":\"34aeb91\",\"js\\u002Forders.js\":\"076a786\",\"js\\u002FphotoDetail.js\":\"3a976a4\",\"js\\u002FphotoList.js\":\"3a976a4\",\"js\\u002Fpoi.js\":\"3a976a4\",\"js\\u002Fprivacy.js\":\"3a976a4\",\"js\\u002Fpromise.js\":\"d138b07\",\"js\\u002Freact-dom.js\":\"d4913f8\",\"js\\u002Freact.js\":\"d4913f8\",\"js\\u002Fsearch.js\":\"3a976a4\",\"js\\u002FserviceAgree.js\":\"34aeb91\",\"js\\u002Fsettings.js\":\"076a786\",\"js\\u002FshopGuarantee.js\":\"16ff9e0\",\"js\\u002FstaticPage.js\":\"8af1233\",\"js\\u002Ftypedarray.js\":\"336c333\",\"js\\u002FuserAgree.js\":\"3ee51e2\",\"js\\u002Fuserexinfo.js\":\"3a976a4\",\"js\\u002Fvouchers.js\":\"8a97026\"},\"base\":\"static\"}}};</script>\n\n        <!-- JS_DEPS_BEGIN -->\n        <!-- JS_DEPS_REACT_BEGIN -->\n        <script src=\"//s1.meituan.net/bs/fe-web-meituan/d4913f8/js/react.js\" ></script>\n        <script src=\"//s1.meituan.net/bs/fe-web-meituan/d4913f8/js/react-dom.js\" ></script>\n        <!-- JS_DEPS_REACT_END -->\n        <script src=\"//s0.meituan.net/bs/fe-web-meituan/34aeb91/js/common.js\" ></script>\n        <script src=\"//s1.meituan.net/bs/fe-web-meituan/8a97026/js/errorPage.js\" ></script>\n        <!-- JS_DEPS_END -->\n        <!-- JS_APP_BOOTSTRAP_BEGIN -->\n        <script>\n        ;(function(){\n          try {\n            var app = document.getElementById('react');\n            if('default' in App) App = App[ 'default' ];\n            // https://facebook.github.io/react/docs/react-dom.html#hydrate\n            (ReactDOM.hydrate || ReactDOM.render)(\n              React.createElement(App, window.AppData), app\n            );\n          } catch (e) {\n            console.error('[Turbo#React] ', e);\n          }\n        })(this);</script>\n        <!-- JS_APP_BOOTSTRAP_END --><nav class=\"botton-nav\"><div class=\"title\">美团导航</div><dl class=\"b-n-content\"><div class=\"b-n-classification\"><dt class=\"b-n-subtitle\">热门城市</dt><div class=\"b-n-sublist\"><dd class=\"b-n-list-item\"><a href=\"https://km.meituan.com\" title=\"昆明\" target=\"_blank\">昆明</a></dd><dd class=\"b-n-list-item\"><a href=\"https://qd.meituan.com\" title=\"青岛\" target=\"_blank\">青岛</a></dd><dd class=\"b-n-list-item\"><a href=\"https://sy.meituan.com\" title=\"沈阳\" target=\"_blank\">沈阳</a></dd><dd class=\"b-n-list-item\"><a href=\"https://dg.meituan.com\" title=\"东莞\" target=\"_blank\">东莞</a></dd><dd class=\"b-n-list-item\"><a href=\"https://fz.meituan.com\" title=\"福州\" target=\"_blank\">福州</a></dd><dd class=\"b-n-list-item\"><a href=\"https://cc.meituan.com\" title=\"长春\" target=\"_blank\">长春</a></dd><dd class=\"b-n-list-item\"><a href=\"https://nb.meituan.com\" title=\"宁波\" target=\"_blank\">宁波</a></dd><dd class=\"b-n-list-item\"><a href=\"https://xa.meituan.com\" title=\"西安\" target=\"_blank\">西安</a></dd><dd class=\"b-n-list-item\"><a href=\"https://hz.meituan.com\" title=\"杭州\" target=\"_blank\">杭州</a></dd><dd class=\"b-n-list-item\"><a href=\"https://xm.meituan.com\" title=\"厦门\" target=\"_blank\">厦门</a></dd><dd class=\"b-n-list-item\"><a href=\"https://cd.meituan.com\" title=\"成都\" target=\"_blank\">成都</a></dd><dd class=\"b-n-list-item\"><a href=\"https://hrb.meituan.com\" title=\"哈尔滨\" target=\"_blank\">哈尔滨</a></dd><dd class=\"b-n-list-item\"><a href=\"https://sh.meituan.com\" title=\"上海\" target=\"_blank\">上海</a></dd><dd class=\"b-n-list-item\"><a href=\"https://wz.meituan.com\" title=\"温州\" target=\"_blank\">温州</a></dd><dd class=\"b-n-list-item\"><a href=\"https://nj.meituan.com\" title=\"南京\" target=\"_blank\">南京</a></dd><dd class=\"b-n-list-item\"><a href=\"https://chs.meituan.com\" title=\"长沙\" target=\"_blank\">长沙</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com\" title=\"北京\" target=\"_blank\">北京</a></dd><dd class=\"b-n-list-item\"><a href=\"https://ty.meituan.com\" title=\"太原\" target=\"_blank\">太原</a></dd><dd class=\"b-n-list-item\"><a href=\"https://fs.meituan.com\" title=\"佛山\" target=\"_blank\">佛山</a></dd><dd class=\"b-n-list-item\"><a href=\"https://jn.meituan.com\" title=\"济南\" target=\"_blank\">济南</a></dd></div></div><div class=\"b-n-classification\"><dt class=\"b-n-subtitle\">热门分类</dt><div class=\"b-n-sublist\"><dd class=\"b-n-list-item\"><a href=\"//hotel.meituan.com\" title=\"酒店\" target=\"_blank\">酒店<span class=\"nav-promotion\">HOT</span></a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/meishi/\" title=\"美食\" target=\"_blank\">美食</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/xiuxianyule/\" title=\"休闲娱乐\" target=\"_blank\">休闲娱乐</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/yundongjianshen/\" title=\"运动健身\" target=\"_blank\">运动健身</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/shenghuo/\" title=\"生活服务\" target=\"_blank\">生活服务</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/shangmenfuwu/\" title=\"上门服务\" target=\"_blank\">上门服务</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/wanggou/\" title=\"购物\" target=\"_blank\">购物</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/shishanggou/\" title=\"时尚购\" target=\"_blank\">时尚购</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/bendigouwu/\" title=\"本地购物\" target=\"_blank\">本地购物</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/jiehun/\" title=\"结婚\" target=\"_blank\">结婚</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/sheyingxiezhen/\" title=\"摄影写真\" target=\"_blank\">摄影写真</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/yanhui/\" title=\"宴会\" target=\"_blank\">宴会</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/jiankangliren/\" title=\"丽人\" target=\"_blank\">丽人</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/qinzi/\" title=\"母婴亲子\" target=\"_blank\">母婴亲子</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/xuexipeixun/\" title=\"学习培训\" target=\"_blank\">学习培训</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/jiazhuang/\" title=\"家装\" target=\"_blank\">家装</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/aiche/\" title=\"汽车服务\" target=\"_blank\">汽车服务</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/yiliao/\" title=\"医疗\" target=\"_blank\">医疗</a></dd><dd class=\"b-n-list-item\"><a href=\"https://bj.meituan.com/chongwu/\" title=\"宠物\" target=\"_blank\">宠物</a></dd></div></div></dl></nav><link rel=\"stylesheet\" type=\"text/css\" href=\"//s0.meituan.net/bs/fe-web-meituan/8a39c6b/css/com_footer.css\"><footer class=\"com-footer\"><div class=\"footer-content\"><div class=\"footer-link clearfix\"><div class=\"footer-column\"><dl><dt>用户帮助</dt><dd><a rel=\"nofollow\" href=\"http://www.meituan.com/help/selfservice\" target=\"_blank\">申请退款</a></dd><dd><a rel=\"nofollow\" href=\"http://www.meituan.com/help/selfservice?tab=2\" target=\"_blank\">查看美团券密码</a></dd><dd><a rel=\"nofollow\" href=\"http://www.meituan.com/help/faq\" target=\"_blank\">常见问题</a></dd><dd><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/rules-detail/4\" target=\"_blank\">用户协议</a></dd><dd><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/rules-detail/2\" target=\"_blank\">隐私政策</a></dd><dd><a rel=\"nofollow\" href=\"http://www.meituan.com/about/anticheat\" target=\"_blank\">反诈骗公告</a></dd><dd><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/customer-rights\" target=\"_blank\">消费者权益保障</a></dd></dl><dl><dt>美团服务</dt><dd><a href=\"http://waimai.meituan.com/\" target=\"_blank\">美团外卖</a></dd><dd><a href=\"http://hotel.meituan.com/\" target=\"_blank\">美团酒店</a></dd><dd><a href=\"http://maoyan.com/\" target=\"_blank\">猫眼电影</a></dd><dd><a href=\"https://peisong.meituan.com/\" target=\"_blank\">美团配送</a></dd><dd><a href=\"https://www.mtyun.com/\" target=\"_blank\">美团云</a></dd><dd><a href=\"http://www.dianping.com/\" target=\"_blank\">大众点评</a></dd><dd><a href=\"https://minsu.meituan.com/\" target=\"_blank\">美团民宿</a></dd><dd><a href=\"https://mad.meituan.com\" target=\"_blank\">无人配送</a></dd></dl></div><div class=\"footer-column\"><dl><dt>商家合作</dt><dd><a rel=\"nofollow\" href=\"http://b.meituan.com/canyin/PC\" target=\"_blank\">美团餐饮商户中心</a></dd><dd><a rel=\"nofollow\" href=\"https://ecom.meituan.com/bizsettle/settle?utm_source=mt_C_my\" target=\"_blank\">美食商家入驻(非外卖)</a></dd><dd><a href=\"https://kd.meituan.com/\" target=\"_blank\">美团外卖开店申请</a></dd><dd><a href=\"http://shouyin.meituan.com?utm_source=inner&amp;utm_medium=mtpc\" target=\"_blank\">美团收银官网</a></dd><dd><a rel=\"nofollow\" href=\"http://page.peisong.meituan.com/apply/join\" target=\"_blank\">外卖配送加盟申请</a></dd><dd><a href=\"https://xue.meituan.com/?from=mtpc\" target=\"_blank\">美团点评餐饮学院</a></dd><dd><a rel=\"nofollow\" href=\"https://ruzhu.meituan.com/settle/pc/epassport.html\" target=\"_blank\">酒店商家入驻</a></dd><dd><a rel=\"nofollow\" href=\"https://ruzhu.meituan.com/settle/trip/pc.html\" target=\"_blank\">境内度假商家入驻</a></dd><dd><a rel=\"nofollow\" href=\"https://e.dianping.com/claimcpc/page/index?source=mt\" target=\"_blank\">综合商家入驻</a></dd><dd><a rel=\"nofollow\" href=\"https://minsu.meituan.com/about/\" target=\"_blank\">美团民宿房东商家入驻</a></dd><dd><a href=\"http://pc.meituan.com/?activity_code=mtpcdb\" target=\"_blank\">商家开票申请</a></dd><dd><a rel=\"nofollow\" href=\"https://h5.youzan.com/v2/feature/nALm22bkFF?dc_ps=2039811416638097413.200001\" target=\"_blank\">美团点评智能收银机</a></dd><dd><a rel=\"nofollow\" href=\"https://developer.meituan.com/?from=mtpcsw\" target=\"_blank\">美团点评餐饮开放平台</a></dd><dd><a rel=\"nofollow\" href=\"https://recommend-zc.meituan.com/opportunity?channel=1\" target=\"_blank\">美团点评收单</a></dd><dd><a rel=\"nofollow\" href=\"https://paidui.meituan.com/?activity_code=167_00038050\" target=\"_blank\">免费使用美团排队</a></dd><dd><a rel=\"nofollow\" href=\"https://i.meituan.com/awp/hfe/block/6c4bec785dce/11188/index.html\" target=\"_blank\">快驴进货商家合作</a></dd><dd><a rel=\"nofollow\" href=\"https://shangou.meituan.com/joinin\" target=\"_blank\">美团闪购商家入驻</a></dd></dl></div><div class=\"footer-column\"><dl><dt>代理商加盟</dt><dd><a rel=\"nofollow\" href=\"https://mfe.waimai.meituan.com/mfepro/client-h5/#/login\" target=\"_blank\">美团外卖代理商招募</a></dd><dd><a rel=\"nofollow\" href=\"https://daili.meituan.com/?comeFrom=mtwebBusinesscoopd\" target=\"_blank\">到店餐饮代理商招募</a></dd><dd><a rel=\"nofollow\" href=\"http://www.dianping.com/apollo/agent/index?source=mtpcd\" target=\"_blank\">非餐饮代理商招募</a></dd><dd><a rel=\"nofollow\" href=\"http://union.meituan.com/\" target=\"_blank\">美团联盟</a></dd><dd><a rel=\"nofollow\" href=\"https://store.meituan.com/distribution/broadcast\" target=\"_blank\">美团收银招募线上分销商</a></dd><dd><a rel=\"nofollow\" href=\"https://agent.meituan.com/zhaoshang?partnerSource=3\" target=\"_blank\">美团点评5S服务商招募</a></dd><dd><a rel=\"nofollow\" href=\"https://zf.meituan.com?partnerSource=3\" target=\"_blank\">美团收单渠道代理商招募</a></dd></dl><dl><dt>美团规则</dt><dd><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/\" target=\"_blank\">规则中心</a></dd><dd><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/rules\" target=\"_blank\">规则目录</a></dd><dd><a rel=\"nofollow\" href=\"https://rules-center.meituan.com/advices\" target=\"_blank\">规则评议院</a></dd></dl></div><div class=\"footer-column\"><dl><dt>关注美团</dt><dd><a rel=\"nofollow\" href=\"http://weibo.com/meituan\" target=\"_blank\">美团新浪微博</a></dd></dl><dl><dt>公司信息</dt><dd><a rel=\"nofollow\" href=\"https://about.meituan.com/\" target=\"_blank\">关于我们</a></dd><dd><a rel=\"nofollow\" href=\"https://about.meituan.com/investor.html\" target=\"_blank\">投资者关系</a></dd><dd><a rel=\"nofollow\" href=\"http://zhaopin.meituan.com/\" target=\"_blank\">加入我们</a></dd><dd><a rel=\"nofollow\" href=\"https://dpapp-appeal.meituan.com/#/shopCreditRegulationPC\" target=\"_blank\">商户诚信公约及管理办法</a></dd><dd><a rel=\"nofollow\" href=\"https://i.meituan.com/awp/ffe/insurance-website/index.html#/\" target=\"_blank\">保险经纪资质</a></dd></dl><dl><dt>廉正举报</dt><dd><a rel=\"nofollow\" href=\"mailto:lianzheng@meituan.com\" target=\"_self\">廉政邮箱</a></dd></dl><dl><dt>知识产权</dt><dd><a rel=\"nofollow\" href=\"https://ipr.meituan.com\" target=\"_blank\">知识产权维权平台</a></dd></dl></div><div class=\"footer-column\"><dl><dt>消费者服务热线</dt><dd>外卖消费者：<a rel=\"nofollow\" href=\"tel:10109777\" target=\"_blank\">10109777</a></dd><dd>猫眼消费者：<a rel=\"nofollow\" href=\"tel:10105335\" target=\"_blank\">10105335</a></dd><dd>其他消费者：<a rel=\"nofollow\" href=\"tel:10107888\" target=\"_blank\">10107888</a></dd></dl><dl><dt>商家服务热线</dt><dd>外卖&amp;餐饮商家：<a rel=\"nofollow\" href=\"tel:10105557\" target=\"_blank\">10105557</a></dd><dd>休闲娱乐、丽人、ktv、教育、结婚、亲子、家装等商家：<a rel=\"nofollow\" href=\"tel:10100107\" target=\"_blank\">10100107</a></dd></dl><dl><dt>投诉举报热线</dt><dd>违法和不良信息举报电话：<a rel=\"nofollow\" href=\"tel:4006018900\" target=\"_blank\">4006018900</a></dd><dd>举报邮箱：<a rel=\"nofollow\" href=\"mailto:tousujubao@meituan.com\" target=\"_self\">tousujubao@meituan.com</a></dd></dl><dl><dt><a rel=\"nofollow\" href=\"https://ecom.meituan.com/bizsettle/settle/merchantsSettle\" target=\"_blank\">商家自助入驻美团入口</a></dt></dl><dl><dt><a rel=\"nofollow\" href=\"https://isp.meituan.com/signup\" target=\"_blank\">供应商注册入口</a></dt></dl></div></div><div class=\"footer-copyright clearfix\"><div class=\"footer-copyright-left\"><p>©美团网团购 meituan.com<a href=\"http://www.beian.miit.gov.cn/\" style=\"margin-left: 20px;\">京ICP证070791号</a><a href=\"http://www.beianbeian.com/beianxinxi/b00ef42627c62ae577c8e4a086b322a0.html\">京ICP备10211739号</a></p><p><a href=\"https://portal-portm.meituan.com/webpc/protocolmanage/comment/license/tv\" target=\"_blank\">广播电视节目制作经营许可证（京）字第03889号</a></p><p><a href=\"https://portal-portm.meituan.com/webpc/protocolmanage/foodlicense\" target=\"_blank\">食品经营许可证</a><a href=\"https://portal-portm.meituan.com/webpc/protocolmanage/medicalcertificate\" target=\"_blank\">互联网药品信息服务资格证</a></p><p><a href=\"https://portal-portm.meituan.com/webpc/protocolmanage/medicalequipment\" target=\"_blank\">医疗器械网络交易服务第三方平台备案：（京）网械平台备字[2018]第00004号</a></p></div><div class=\"footer-copyright-right\"><a href=\"http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502025545\" target=\"_blank\">京公网安备11010502025545号</a><div class=\"footer-copyright-cert\"><a class=\"bus-license\" href=\"https://zzlz.gsxt.gov.cn/businessCheck/verifKey.do?showType=p&amp;serial=11000020190617184241000003572274-SAIC_SHOW_10002020190618102726868&amp;signData=MEQCIMo7nivRikGQc6WsX/jx0IcZ46irhkjszdhhg4kv17uBAiD78duadRu3XX5WyuE+duSrhPmdVUFgr7cN1iV/WSv4uw==\" title=\"营业执照\" target=\"_blank\"><img src=\"https://p1.meituan.net/travelcube/3e7f8a17e55bace814166b667618b459366061.png@76h_76w_2e\"><p>北京三快科技有限公司</p></a><a class=\"sp-ft sp-ft--record\" href=\"http://www.beianbeian.com/beianxinxi/b00ef42627c62ae577c8e4a086b322a0.html\" title=\"备案信息\" target=\"_blank\">备案信息</a><a class=\"sp-ft sp-ft--knet\" href=\"http://t.knet.cn/tsearch/detail?keyword=meituan.com\" title=\"可信网站认证\" target=\"_blank\">可信网站</a><a class=\"sp-ft sp-ft--12315\" href=\"http://www.bj315.org/xfwq/lstd/201209/t20120910_3344.shtml?dnrpluojqxbceiqq\" title=\"12315消费争议\" target=\"_blank\">12315消费争议</a></div></div></div></div></footer></body></html>\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-14  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/config.py",
    "content": "# Redis数据库地址\nREDIS_HOST = ''\n\n# Redis端口\nREDIS_PORT = 6379\n\n# Redis密码，如无填None\nREDIS_PASSWORD = None\n\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/db.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\nimport redis\nimport random\n\nfrom Cookies.MeiTuan.config import *\n\n\nclass RedisClient(object):\n    def __init__(self, t_type, website, host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD):\n        \"\"\"\n        初始化 redis 池\n        :param t_type: 链接类型\n        :param website: 站点\n        :param host: IP\n        :param port: 端口\n        :param password: 密码\n        \"\"\"\n        if password:\n            pool = redis.ConnectionPool(host=host, port=port, password=password)\n        else:\n            pool = redis.ConnectionPool(host=host, port=port)\n        self.db = redis.Redis(connection_pool=pool)\n        self.type = t_type\n        self.website = website\n\n    @property\n    def name(self):\n        \"\"\"\n        获取Hash名\n        :return: Hash名称\n        \"\"\"\n        return \"{type}:{website}\".format(type=self.type, website=self.website)\n\n    def set(self, username, value):\n        \"\"\"\n        设置键值对\n        :param username: 用户名\n        :param value: 密码或Cookies\n        :return: 设置结果\n        \"\"\"\n        return self.db.hset(self.name, username, value)\n\n    def get(self, username):\n        \"\"\"\n        根据键名获取值\n        :param username: 用户名\n        :return: 获取结果\n        \"\"\"\n        return self.db.hdel(self.name, username)\n\n    def delete(self, username):\n        \"\"\"\n        根据键名删除\n        :param username: 用户名\n        :return: 删除结果\n        \"\"\"\n        return self.db.hdel(self.name, username)\n\n    def count(self):\n        \"\"\"\n        获取数目\n        :return: 数目\n        \"\"\"\n        return self.db.hlen(self.name)\n\n    def random(self):\n        \"\"\"\n        随机得到键值，用于随机Cookies获取\n        :return:\n        \"\"\"\n        return random.choice(self.db.hvals(self.name))  # 返回所有，再随机取\n\n    def all_username(self):\n        \"\"\"\n        获取所有账户信息\n        :return: 所有用户名\n        \"\"\"\n        return self.db.hkeys(self.name)\n\n    def all(self):\n        \"\"\"\n        获取所有键值对\n        :return: 用户名和密码或Cookies的映射表\n        \"\"\"\n        return self.db.hgetall(self.name)\n\n\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/generator.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\n\nimport asyncio\nimport json\n\nfrom Cookies.MeiTuan.db import RedisClient\nfrom pyppeteer import launch\n\n\nclass MeiTuanCookies():\n    login_url = 'https://passport.meituan.com/account/unitivelogin'\n\n    def __init__(self):\n        self.r = RedisClient('accounts', 'meituan')\n\n    async def star(self, username, password):\n        browser = await launch()\n        context = await browser.createIncogniteBrowserContext()\n        page = await context.newPage()\n        await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'\n                                         '{ webdriver:{ get: () => false } }) }')  # 本页刷新后值不变\n\n        await page.goto(self.login_url)\n        await page.type('input#login-email', username)\n        await page.type('input#login-password', password)\n        await page.click('input.btn')\n        await self.get_cookie(page,username,password)\n\n    async def get_cookie(self, page,username,password):\n        \"\"\"\n        获取 cookies\n        :param page: 页面\n        :return:\n        \"\"\"\n        cookies_list = await page.cookies()\n        cookies = ''\n        for cookie in cookies_list:\n            str_cookie = '{0}={1};'\n            str_cookie = str_cookie.format(cookie.get('name'), cookie.get('value'))\n            cookies += str_cookie\n        # 储存cookies\n        print(cookies)\n        self.r.set(username, json.dumps({'password': password, 'cookies': cookies}))\n\n\nif __name__ == '__main__':\n    mt = MeiTuanCookies()\n\n    with open('账号.txt', 'r', encoding='utf-8') as f:\n        # 账号|密码\\n\n        lines = f.readlines()\n\n    tasks = []\n    for line in lines:\n        username, password = line.strip().split('|')\n        tasks.append(mt.star(username, password))\n\n    loop = asyncio.get_event_loop()\n    loop.run_until_complete(asyncio.wait(tasks))\n\n"
  },
  {
    "path": "原创爬虫工具/Cookies/MeiTuan/账号.txt",
    "content": "账号1|密码1\n账号2|密码2\n账号3|密码3"
  },
  {
    "path": "原创爬虫工具/Cookies/README.md",
    "content": "# 异步批量登陆美团获取cookies\n\n> pyppeteer 异步批量登陆美团并将cookies储存到redis 的hash表中"
  },
  {
    "path": "原创爬虫工具/Cookies/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-14  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/README.md",
    "content": "# 工作中经常有这种需求\n> 将采集好的mongodb数据转存到mysql中，或者是redis数据转到mongodb，于是打算封装一个组件便于以后调用\n\n# mysql转存mongo\n1. 在 config 中配置 mongo 与 mysql 连接\n2. 在 `msyql_to_mongo.py` 下方实例化时填入 `需要转换mysql表名`, `mongo库名`, `mongo表名`\n3. 调用 `mi.easy_to_mongo()` 即可将 mysql 中的 数据导入到 mongodb\n\n> 当然也支持自定义转换，在类中添加即可"
  },
  {
    "path": "原创爬虫工具/DataMigration/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/config.py",
    "content": "# mongodb链接\nMONGODB_URL = 'mongodb://localhost:27017'\n\n# Redis数据库地址\nREDIS_HOST = ''\n\n# Redis端口\nREDIS_PORT = 6379\n\n# Redis密码，如无填None\nREDIS_PASSWORD = None\n\n# Mysql地址\nMYSQL_HOST = '127.0.0.1'\n\n# Mysql端口\nMYSQL_PORT = 3306\n\n# Mysql用户名\nMYSQL_USER = 'root'\n\n# Mysql密码\nMYSQL_PASSWORD = ''\n\n# Mysql链接库\nMYSQL_DB_NAME = 'travel'\n\n\n\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/db/MongoDB.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\nfrom pymongo import MongoClient\n\nfrom DataMigration.config import MONGODB_URL\n\n\nclass Mongo(object):\n    def __init__(self, db_name, collection):\n        client = MongoClient(MONGODB_URL)\n        database = client[db_name]\n        self.collection = database[collection]\n\n    def delete(self, *args, del_one=True):\n        \"\"\"\n        删除复合条件的信息\n        :param sql: sql 语句\n        :param del_one: 默认删除第一条，否则删除复合条件的所有\n        :return:\n        \"\"\"\n        return self.collection.delete_one(*args) if del_one else self.collection.deleteMany(*args)\n\n    @property\n    def all(self):\n        \"\"\"\n        返回全部\n        :return: 整表信息\n        \"\"\"\n        return self.collection.find({})\n\n    def find(self, *args):\n        \"\"\"\n        指定查找\n        :param sql:\n        :return:\n        \"\"\"\n        return self.collection.find(*args)\n\n    def update(self, *args, update_one=True):\n        \"\"\"\n        修改数据\n        :param sql: 修改sql\n        :param update_one: 默认修改第一个，否则修改复合条件所有\n        :return:\n        \"\"\"\n        return self.collection.update_one(*args) if update_one else self.collection.update_many(*args)\n\n    def insert(self, *args, insert_one=True):\n        \"\"\"\n        插入数据\n        :param sql: 新增sql\n        :param insert_one: 默认插入一个\n        :return:\n        \"\"\"\n        return self.collection.insert_one(*args) if insert_one else self.collection.insert_many(*args)\n\n\nif __name__ == '__main__':\n    # 测试\n    mg = Mongo('meituan', 'user_info')\n    # data = mg.all\n    ret = mg.update({'用户名': '三丰948'}, {'$set': {'用户名': '三三风'}})\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/db/Mysql.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\nimport pymysql\n\nfrom DataMigration.config import MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB_NAME\n\n\nclass Mysql(object):\n    def __init__(self):\n        \"\"\"\n        链接数据库\n        \"\"\"\n        self.conn = pymysql.Connect(\n            host=MYSQL_HOST,\n            port=MYSQL_PORT,\n            user=MYSQL_USER,\n            password=MYSQL_PASSWORD,\n            db=MYSQL_DB_NAME,\n        )\n\n    def insert(self, sql):\n        \"\"\"\n        查找\n        :param sql: sql语句\n        :return:\n        \"\"\"\n        # 创建游标对象\n        cursor = self.conn.cursor()\n        # 执行并提交\n        try:\n            cursor.execute(sql)\n            self.conn.commit()\n        except Exception as e:\n            print('异常回滚')\n            self.conn.rollback()\n        finally:\n            cursor.close()\n\n    def select(self, sql):\n        \"\"\"\n        查找\n        :param sql: sql 语句\n        :return: 查找结果\n        \"\"\"\n        cursor = self.conn.cursor()  # 创建游标对象\n        # 提交事务\n        try:\n            cursor.execute(sql)\n            data = cursor.fetchall()\n        except Exception as e:\n            print('异常回滚')\n            data = None\n            self.conn.rollback()\n        finally:\n            cursor.close()\n        return data\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/db/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/migration/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-15  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/migration/mongo_to_mysql.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-23  Python: 3.7\n\n\nfrom DataMigration.db.MongoDB import Mongo\nfrom DataMigration.db.Mysql import Mysql\nfrom DataMigration.config import MYSQL_DB_NAME\n\n\nclass Migrate(object):\n    def __init__(self,mysql_table_name, mongodb_name, mongodb_collection):\n        self.mongo = Mongo(mongodb_name, mongodb_collection)\n        self.mysql = Mysql()\n        self.mysql_name = mysql_table_name\n\n    def easy_to_mongo(self, column_comment=False):\n        \"\"\"\n        将输入插入 mongodb\n        :return:\n        \"\"\"\n        columns = self.get_column()\n        nodes = self.all_mysql_data()\n        data_list = []\n\n        for node in nodes:\n            data_dict = {}\n            for index, column in enumerate(columns):\n                if column_comment:\n                    data_dict[column[1]] = node[index]\n                else:\n                    data_dict[column[0]] = node[index]\n            data_list.append(data_dict)\n        try:\n            self.mongo.insert(data_list, insert_one=False)\n            print('储存成功')\n        except Exception:\n            print('转存失败')\n\n    def all_mysql_data(self):\n        \"\"\"\n        获取需要转换的数据\n        :return: 所有 mysql 数据\n        \"\"\"\n        sql = \"\"\"SELECT * from {table_name};\"\"\".format(table_name=self.mysql_name)\n        return self.mysql.select(sql)\n\n    def get_column(self):\n        \"\"\"\n        取字段名\n        :return: (字段名,字段描述)\n        \"\"\"\n        sql = \"\"\"select COLUMN_NAME,column_comment \n        from INFORMATION_SCHEMA.Columns \n        where table_name='{table_name}' and table_schema='{db_name}'\"\"\".format(\n            table_name=self.mysql_name,\n            db_name=MYSQL_DB_NAME,\n        )\n        return self.mysql.select(sql)\n\n\nif __name__ == '__main__':\n    mi = Migrate('需要转换mysql表名', 'mongo库名', 'mongo表名')\n    mi.easy_to_mongo(column_comment=True)  # column_comment=True 使用注释的字段名， 默认不使用\n"
  },
  {
    "path": "原创爬虫工具/DataMigration/migration/mysql_to_mongo.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-20  Python: 3.7\n\n\nfrom DataMigration.db.MongoDB import Mongo\nfrom DataMigration.db.Mysql import Mysql\nfrom DataMigration.config import MYSQL_DB_NAME\n\n\nclass Migrate(object):\n    def __init__(self, mysql_table_name, mongodb_name, mongodb_collection):\n        self.mongo = Mongo(mongodb_name, mongodb_collection)\n        self.mysql = Mysql()\n        self.mysql_name = mysql_table_name\n\n    def easy_to_mongo(self, column_comment=False):\n        \"\"\"\n        将输入插入 mongodb\n        :return:\n        \"\"\"\n        columns = self.get_column()\n        nodes = self.all_mysql_data()\n        data_list = []\n\n        for node in nodes:\n            data_dict = {}\n            for index, column in enumerate(columns):\n                if column_comment:\n                    data_dict[column[1]] = node[index]\n                else:\n                    data_dict[column[0]] = node[index]\n            data_list.append(data_dict)\n        try:\n            self.mongo.insert(data_list, insert_one=False)\n            print('储存成功')\n        except Exception:\n            print('转存失败')\n\n    def all_mysql_data(self):\n        \"\"\"\n        获取需要转换的数据\n        :return: 所有 mysql 数据\n        \"\"\"\n        sql = \"\"\"SELECT * from {table_name};\"\"\".format(table_name=self.mysql_name)\n        return self.mysql.select(sql)\n\n    def get_column(self):\n        \"\"\"\n        取字段名\n        :return: (字段名,字段描述)\n        \"\"\"\n        sql = \"\"\"select COLUMN_NAME,column_comment \n        from INFORMATION_SCHEMA.Columns \n        where table_name='{table_name}' and table_schema='{db_name}'\"\"\".format(\n            table_name=self.mysql_name,\n            db_name=MYSQL_DB_NAME,\n        )\n        return self.mysql.select(sql)\n\n\nif __name__ == '__main__':\n    mi = Migrate('需要转换mysql表名', 'mongo库名', 'mongo表名')\n    mi.easy_to_mongo(column_comment=True)  # column_comment=True 使用注释的字段名， 默认不使用\n"
  },
  {
    "path": "原创爬虫工具/Decode/README.md",
    "content": "# 可拓展式解密器\n> 方便测试可连续转换重制的编码转换器，可灵活拓展解码规则\n\n\n# 说明博客\n\n[**博客地址**](https://www.zhangkunzhi.com/?p=241)\n\n\n"
  },
  {
    "path": "原创爬虫工具/Decode/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-01  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/Decode/translation.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-28  Python: 3.7\n\nimport base64\nimport zlib\n\nCOLOR = {'red': 1, 'green': 2, 'yellow': 3, 'blue': 4}\n\n\nclass TranslationMetaClass(type):\n    \"\"\"Meta 类\"\"\"\n    def __new__(mcs, name, bases, attrs):\n        count = 0\n        attrs['__Decode__'] = {}\n        for k, v in attrs.items():\n            if 'decode_' in k:\n                count += 1\n                attrs['__Decode__'][str(count)] = k\n        attrs['__TranslationFuncCount__'] = count\n        return type.__new__(mcs, name, bases, attrs)\n\n\nclass Util(object):\n    \"\"\"辅助类\"\"\"\n\n    @staticmethod\n    def _print(color, msg):\n        \"\"\"print color control\n        \"\"\"\n        node = '\\033[1;3{id}m{msg}\\033[0m'\n        if COLOR.get(color):\n            print(node.format(id=COLOR.get(color), msg=msg))\n        else:\n            print(msg)\n\n    def msg(self):\n        \"\"\"print decode func\n        \"\"\"\n        for k in self.__Decode__:\n            self._print('yellow', str(k) + ': ' + self.__Decode__[k][7:])\n        self._print('yellow', 'r: 【重制】 e:【退出】')\n        return input('请选择 >>>').lower()\n\n\nclass Decode(Util, metaclass=TranslationMetaClass):\n    \"\"\"\n    将需要添加的转码类型按下列类似格式添加即可\n    def decode_自定义名(self):\n        self._key = 解密过程\n    \"\"\"\n    def __init__(self, _key):\n        self._key = _key\n        self._copy = _key\n        self.crumbs = ''\n\n    def main(self):\n        choice = self.msg()\n        while choice != 'e':\n            if choice == 'r':  # 重制\n                self._key, self.crumbs = self._copy, ''\n                self._print('blue', '重制成功: ' + self._key)\n                choice = self.msg()\n            elif choice in self.__Decode__:  # 选择是否在现有函数选项中\n                try:\n                    eval(\"self.{}()\".format(self.__Decode__[choice]))  # 字符串转函数运行\n                    self._print('blue', self._key)\n                    self.crumbs += self.__Decode__[choice][7:] + ' > '\n                    self._print('green', self.crumbs)\n                    choice = self.msg()\n                except Exception:\n                    choice = input('解码失败，换一种 >>>')\n\n        self._print('red', '调试结束')\n\n    def decode_base64(self):\n        \"\"\"解base64\"\"\"\n        self._key = base64.b64decode(self._key)\n\n    def decode_zlib(self):\n        \"\"\"解压串\"\"\"\n        self._key = zlib.decompress(self._key)\n\n    def decode_str(self):\n        \"\"\"转字符串\"\"\"\n        self._key = str(self._key, encoding=\"utf-8\")\n\n    def decode_hex(self):\n        \"\"\"转到16进制\"\"\"\n        self._key = self._key.hex()\n\n\nif __name__ == '__main__':\n    # _key = 'eJyrVnqxZdnT/u1KVgpKpcWpRUo6CkpP17c9X9AIEilILC4uzy9KUaoFAGxTEMo='  # 测试\n    _key = input('\\033[1;31m输入解码内容>>> \\033[0m')\n    ts = Decode(_key)\n    ts.main()\n"
  },
  {
    "path": "原创爬虫工具/Jsencrypt/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-29  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/Jsencrypt/make_encrypt.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-28  Python: 3.7\n\nimport base64\n\nfrom Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5\nfrom Crypto.PublicKey import RSA\n\n\npublic_key = \"\"\"\n-----BEGIN PUBLIC KEY-----\nYour PUBLIC KEY\n-----END PUBLIC KEY-----\n\"\"\"\n\n\ndef make_message(pwd):\n    rsakey = RSA.importKey(public_key)\n    cipher = Cipher_pkcs1_v1_5.new(rsakey)\n    cipher_text = base64.b64encode(cipher.encrypt(pwd.encode(encoding=\"utf-8\")))\n    return cipher_text.decode('utf8')\n\n\nif __name__ == '__main__':\n    print(make_message('hellow'))\n"
  },
  {
    "path": "原创爬虫工具/OSS/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-24  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/OSS/push_to_oss.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-24  Python: 3.7\n\n\"\"\"\n将图redis中储存的网络图片链接，并发直传到 OSS 上\n\"\"\"\n\nimport oss2\nimport redis\nimport requests\n\nfrom concurrent.futures import ThreadPoolExecutor  # 线程池模块\n\nKEY = ''\nKEYSECRET = ''\nBUCKETNAME = ''\nENDPOINT = 'http://oss-cn-hangzhou.aliyuncs.com'\n\nREDIS_HOST = \"localhost\"\nREDIS_USER = \"root\"\nREDIS_PASSWORD = \"\"\nREDIS_DB_NAME = 1\nREDIS_PORT = 6379\n\nlist_name = 'restaurant'  # 列队名\n\n# oss\nauth = oss2.Auth(KEY, KEYSECRET)\nbucket = oss2.Bucket(auth, ENDPOINT, BUCKETNAME)\n\n# redis 池\npool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB_NAME, password=REDIS_PASSWORD,\n                            decode_responses=True)\nr = redis.Redis(connection_pool=pool)\n\n\ndef put_img():\n    \"\"\"上传逻辑，根据项目需求修改即可\"\"\"\n    url = r.rpop(list_name)\n    input = requests.get(url)\n    if input.status_code == 200:\n        file_name = url  # this is file name\n        obj = bucket.put_object(file_name, input)\n        if obj.status == 200:\n            print('OK', file_name)\n    else:\n        r.lpush(list_name)\n\n\ndef get_len():\n    return r.llen(list_name)\n\n\nif __name__ == '__main__':\n    list_len = get_len()\n    print('专辑总图数量', list_len)\n    pool = ThreadPoolExecutor()  # 设置线程池大小，默认等于cpu核数\n    for i in range(list_len):\n        pool.submit(put_img)\n\n    pool.shutdown(wait=True)\n    print('主进程')\n"
  },
  {
    "path": "原创爬虫工具/Proxy/KDLProxyPool.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-17  Python: 3.7\n\n\"\"\"\n快代理IP池\nhttps://www.kuaidaili.com/ 放代理API\n\"\"\"\n\nimport redis\nimport requests\nimport json\n\nfrom apscheduler.schedulers.blocking import BlockingScheduler\n\n\nclass KDLProxyPool(object):\n    \"\"\"\n    快代理IP池\n    用的快代理开放代理API\n    \"\"\"\n\n    def __init__(self, key, count):\n        try:\n            self.key = key  # 订单号\n            self.count = count  # 代理池代理数量\n            \"\"\"redis数据库配置区\"\"\"\n            pool = redis.ConnectionPool(decode_responses=True)\n            self.r = redis.Redis(connection_pool=pool)\n        except:\n            print('请填入正确的API链接')\n\n    def check_ip(self):\n        \"\"\"\n        监控 IP 分数、个数，对其进行增删\n        \"\"\"\n        # 检查分数\n        nodes = self.r.zrevrange('KDLProxy', 0, -1, withscores=True)\n        for i in nodes:\n            node = list(i)\n            score = int(node[1])\n            if score <= 0:\n                print('\\033[1;33m分数过低剔除\\033[0m')\n                self.r.zrem('KDLProxy', node[0])\n\n        # 检查个数\n        _sum = self.r.zcard('KDLProxy')\n        if _sum < self.count:\n            self.add_ip(self.count - _sum)\n\n    def add_ip(self, num):\n        \"\"\"\n        提取IP\n        \"\"\"\n        get_url = 'http://svip.kdlapi.com/api/getproxy/?orderid={key}&num={num}&protocol=2&method=2&an_ha=1&sp1=1&quality=2&format=json&sep=1'.format(\n            key=self.key, num=num)\n\n        # 返回的文本进行解析\n        response = requests.get(get_url)\n        if response.status_code == 200:\n            ret = json.loads(response.text)\n            if ret.get('code') == 0:\n                self.parse(ret.get('data').get('proxy_list'))\n            else:\n                print(ret.get('msg'))\n        else:\n            print('提取失败')\n\n    def parse(self, proxy_list):\n        \"\"\"\n        解析返回数据\n        \"\"\"\n        for node in proxy_list:\n            self.save_to_redis(node, 10)  # 默认10分\n\n    def save_to_redis(self, proxy, expire):\n        \"\"\"\n        推送到redis集合中\n        \"\"\"\n        print('代理 %s 推入redis集合' % proxy)\n        self.r.zadd('KDLProxy', {proxy: expire})\n\n\ndef aps_run():\n    \"\"\"\n    监控\n    \"\"\"\n    kdl.check_ip()\n\n\nkdl = KDLProxyPool('填写开放代理订单号', 20)\n\n# 循环监控\nscheduler = BlockingScheduler()\nscheduler.add_job(aps_run, 'cron', second='*/1')  # 这里设置检测评论，推荐2s一次(默认)\nscheduler.start()\n"
  },
  {
    "path": "原创爬虫工具/Proxy/README.md",
    "content": "[TOC]\n\n# 安装模块\n\n```bush\npip3 install redis\npip3 install apscheduler\npip3 install reuqest\npip3 install python-dateutil\n```\n\n# 讯代理池使用 \n1. 登陆讯代理 进入API页码将下面下方生成的API复制\n    ![讯代理API](https://www.zhangkunzhi.com/images/xdl3.png)\n    \n2. 将链接复制到项目该位置\n    ![讯代理API](https://www.zhangkunzhi.com/images/xdl4.png)\n \n3. 配置redis， 默认是本机\n    ![讯代理API](https://www.zhangkunzhi.com/images/xdl5.png)\n \n4. 启动程序，大功告成，只需要在调用ip的时候对其进行增减分操作即可\n    ![讯代理API](https://www.zhangkunzhi.com/images/xdl1.png)\n    ![讯代理API](https://www.zhangkunzhi.com/images/xdl2.png)\n\n# 芝麻代理池使用\n\n1. 首先登陆你的芝麻代理后台管理，找到自己的key如图\n    ![key位置](https://www.zhangkunzhi.com/images/芝麻1.png)\n\n1. 在代码下方配置key\n    ![key位置](https://www.zhangkunzhi.com/images/填入芝麻key.png)\n    \n1. 在代码中配置 redis库连接 **默认链接的本地**\n    ![key位置](https://www.zhangkunzhi.com/images/代理模块.png)\n    \n1. 启动程序\n    > 如果在服务端可以使用后台运行命令\n    `nohup python3 ProxyPool.py >my.log &`\n \n1. 第一次启动芝麻代理会绑定你的ip白名单，稍等片刻就会开始提取     \n    \n    ![key位置](https://www.zhangkunzhi.com/images/提取ip.png)\n    \n1. 链接redis可以看到ip池了，大功告成\n    ![key位置](https://www.zhangkunzhi.com/images/20个ip.png)\n    \n1. 后续在使用代理ip时，根据访问结果对代理ip积分增减即可，后续会更新这个Demo继续关注Github即可。[**传送门**](https://github.com/wkunzhi/SpiderUtilPackage)\n    \n    \n# 额外配置\n- 可以自由配置，代理池上线值(默认20),实例化时配置即可\n    ```python\n    zm = ZhiMaPool('key', ip_sum=100)\n    ```\n- 可以自由配置，只取可用时间xx以上的ip(默认1号套餐下的1000秒以上),实例化时配置即可\n    ```python\n    zm = ZhiMaPool('key', ttl=1000)\n    ```\n- 还可以配置 每次提取数、提取套餐类型、提取ip HTTP或者HTTPS或者Sockets\n "
  },
  {
    "path": "原创爬虫工具/Proxy/XDLProxyPool.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-09  Python: 3.7\nimport redis\nimport requests\nimport re\nimport time\nimport json\n\nfrom apscheduler.schedulers.blocking import BlockingScheduler\n\n\"\"\"\n可自型拓展其他的代理ip产品，只需修改调用接口即可\n\"\"\"\n\n\nclass XDLProxyPool(object):\n    \"\"\"\n    迅代理IP池\n    \"\"\"\n\n    def __init__(self, api_url):\n        try:\n            \"\"\"redis数据库配置区\"\"\"\n            pool = redis.ConnectionPool(decode_responses=True)\n            self.r = redis.Redis(connection_pool=pool)\n\n            \"\"\"白名单初始化\"\"\"\n            ret = re.search(r'spiderId=(.*?)&orderno=(.*?)&returnType=\\d+&count=(\\d+)', api_url)\n            self.spiderId, self.orderno, self.count = ret.group(1), ret.group(2), int(ret.group(3))\n            self.init_proxy()\n        except:\n            print('请填入正确的API链接')\n\n    def init_proxy(self):\n        \"\"\"\n        初始化代理\n        \"\"\"\n        print('\\033[1;35m初始化中...\\033[0m')\n\n        # 取出当前IP地址\n        response = requests.get('http://pv.sohu.com/cityjson?ie=utf-8')\n        address = re.search(r'\"cip\": \"(.*?)\", \"cid', response.text).group(1)\n\n        # 加入白名单\n        url = 'http://www.xdaili.cn/ipagent/newWhilteList/updateByOrder?orderno={orderno}&ip={ip}&spiderId={spiderId}'.format(\n            orderno=self.orderno, ip=address, spiderId=self.spiderId)\n        status = requests.get(url=url).status_code\n        if status == 200:\n            print('\\033[1;35m初始化成功,启动中稍等..\\033[0m')\n            time.sleep(2)\n            print('监控已开启')\n        else:\n            print('初始化白名单失败')\n\n    def check_ip(self):\n        \"\"\"\n        监控 IP 分数、个数，对其进行增删\n        \"\"\"\n\n        # 检查分数\n        nodes = self.r.zrevrange('XDLProxy', 0, -1, withscores=True)\n        for i in nodes:\n            node = list(i)\n            score = int(node[1])\n            if score <= 0:\n                print('\\033[1;33m分数过低剔除\\033[0m')\n                self.r.zrem('XDLProxy', node[0])\n\n        # 检查个数\n        _sum = self.r.zcard('XDLProxy')\n        if _sum < self.count:\n            self.add_ip(self.count - _sum)\n\n    def add_ip(self, count):\n        \"\"\"\n        提取IP\n        \"\"\"\n        get_url = 'http://api.xdaili.cn/xdaili-api//greatRecharge/getGreatIp?spiderId={spiderId}&orderno={orderno}&returnType=2&count={count}'.format(\n            spiderId=self.spiderId, orderno=self.orderno, count=str(count))\n\n        # 返回的文本进行解析\n        response = requests.get(get_url)\n        if response.status_code == 200:\n            ret = json.loads(response.text)\n            if ret.get('ERRORCODE') in ['10036', '10038', '10055']:\n                print('提取速度过快5秒钟提取一次')\n            elif ret.get('ERRORCODE') == '10032':\n                print('余额不足或今日已到提取上线')\n            else:\n                self.parse(ret)\n        else:\n            print('提取失败')\n\n    def parse(self, data):\n        \"\"\"\n        解析返回数据\n        \"\"\"\n        proxy_list = data.get('RESULT')\n        for node in proxy_list:\n            proxy = node.get('ip') + ':' + node.get('port')\n            self.save_to_redis(proxy, 10)  # 默认10分\n\n    def save_to_redis(self, proxy, expire):\n        \"\"\"\n        推送到redis集合中\n        \"\"\"\n        print('代理 %s 推入redis集合' % proxy)\n        self.r.zadd('XDLProxy', {proxy: expire})\n\n\ndef aps_run():\n    \"\"\"\n    监控\n    \"\"\"\n    xdl.check_ip()\n\n\n# 填入提取链接\nxdl = XDLProxyPool('填写讯代理api链接')\n\n# 循环监控\nscheduler = BlockingScheduler()\nscheduler.add_job(aps_run, 'cron', second='*/1')  # 这里设置检测评论，推荐2s一次(默认)\nscheduler.start()\n"
  },
  {
    "path": "原创爬虫工具/Proxy/XDLProxyUseDemo.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-11  Python: 3.7\n\nimport redis\nimport random\n\n# 在scrapy中使用 代理池的demo\n\n\n\"\"\"\nmiddleware中代码如下\n\"\"\"\n\npool = redis.ConnectionPool(decode_responses=True)  # redis 池\nr = redis.Redis(connection_pool=pool)\n\n\n\n\n\"\"\"\nmiddleware中配置代理中间键\n注意，根据爬取网址是http 还是https 来设置\n\"\"\"\n\nclass MyProxy(object):\n    \"\"\"代理IP设置\"\"\"\n    def process_request(self, request, spider):\n        # 此处对接redis\n        data = r.zrangebyscore('XDLProxy', 1, 100, withscores=True)\n        ip, score = random.choice(data)\n        request.meta['proxy'] = 'http://'+ip  # 根据自己情况填写\n\n\n\n\n\"\"\"\n拦截中间键中配置如下，写入计分器，满分20分\n\"\"\"\n\nclass DownloaderMiddleware(object):\n    def process_response(self, request, response, spider):\n        # 对代理ip进行清洗\n        proxy = request._meta.get('proxy')\n        if not response.status == 200:\n            print('IP访问失败')\n            if proxy:\n                proxy = proxy[proxy.find('/')+2:]  # 提取当此访问proxy\n                r.zincrby('XDLProxy', -1, proxy)  # redis 命令修改\n        else:\n            if proxy:\n                proxy = proxy[proxy.find('/') + 2:]  # 提取当此访问proxy\n                score = r.zscore('XDLProxy', proxy)  # 取出分数\n                if score < 20:\n                    r.zincrby('XDLProxy', 1, proxy)  # redis 新版本命令更改这样了\n        return response\n\n    def process_exception(self, request, exception, spider):  # 可能由于IP质量问题无法访问超时\n        print('超时异常')\n        proxy = request._meta.get('proxy')\n        if proxy:\n            proxy = proxy[proxy.find('/') + 2:]\n            r.zincrby('XDLProxy', -1, proxy)  # redis 新版本命令更改这样了\n            return request\n\n\n\"\"\"\nsetting中配置\n\"\"\"\nDOWNLOAD_TIMEOUT = 5  # 有的时候代理ip失效，会导致一直卡在那里 ，也有可能是用http 访问https\nDOWNLOADER_MIDDLEWARES = {\n    'middlewares.MyProxy': 543,  # 自定义代理IP\n    'middlewares.spiderDownloaderMiddleware': 600,  # 拦截301、302等跳转  必须设置到600\n}"
  },
  {
    "path": "原创爬虫工具/Proxy/ZhiMaProxyPool.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-2  Python: 3.7\nimport redis\nimport datetime\nimport requests\nimport json\nimport re\nimport time\n\nfrom apscheduler.schedulers.blocking import BlockingScheduler\nfrom dateutil.parser import parse\n\n\nclass ZhiMaPool(object):\n    \"\"\"\n    芝麻代理按次提取(非套餐)代理IP\n    \"\"\"\n\n    \"\"\"redis数据库配置区\"\"\"\n    pool = redis.ConnectionPool(decode_responses=True)\n    r = redis.Redis(connection_pool=pool)\n\n    def __init__(self, key, ip_sum=20, ttl=1000):\n        \"\"\"\n        init zhima\n        :param key: ZhiMaProxy    http://h.zhimaruanjian.com/pay/\n        :param ip_sum: The largest number\n        :param ttl:  Set survival time | seconds\n        \"\"\"\n        self.key = key\n        self.ip_sum = ip_sum\n        self.ttl = ttl\n\n        self._init()  # init the proxy\n\n    def _init(self):\n        \"\"\"\n        Initialize the proxy\n        \"\"\"\n        print('\\033[1;35m初始化中...\\033[0m')\n        response = requests.get('http://pv.sohu.com/cityjson?ie=utf-8')\n\n        address = re.search(r'\"cip\": \"(.*?)\", \"cid', response.text).group(1)\n\n        url = 'http://web.http.cnapi.cc/index/index/save_white?neek=66439&appkey={key}&white={local}'.format(\n            key=self.key, local=address)\n        response = requests.get(url=url)\n        code = json.loads(response.text).get('code')\n        if code == 0 or code == 115:\n            print('\\033[1;35m初始化成功,启动中稍等..\\033[0m')\n        else:\n            print('初始化芝麻账号失败')\n        time.sleep(2)\n\n    def check_ip(self):\n        \"\"\"\n        Check scores & due dates & proxy sum\n        :return How many proxy are needed\n        \"\"\"\n        # check dates and scores\n        now_time = int(time.time())\n        nodes = self.r.zrevrange('ZhiMaProxy', 0, -1, withscores=True)\n        for i in nodes:\n            flag = False\n            node = list(i)\n            score_str = str(int(node[1]))\n            time_stamp = int(score_str[-10:])\n            if time_stamp-now_time <= 0:\n                print('代理过期删除', str(node[0]))\n                self.r.zrem('ZhiMaProxy', node[0])\n            if len(score_str[:-10]) == 0:\n                flag = True  # 删除\n            else:\n                # 可能由于频率过快出现负数\n                if int(node[1]) < 0:\n                    flag = True  # 删除\n\n            if flag:\n                print('分数过低剔除')\n                self.r.zrem('ZhiMaProxy', node[0])\n\n        # check num\n        _sum = self.r.zcard('ZhiMaProxy')\n        if _sum < self.ip_sum:\n            self.add_ip(count=self.ip_sum-_sum)\n\n    def add_ip(self, count=1, time_type=1, ip_type='http'):\n        \"\"\"\n        get proxy ip and port\n        \"\"\"\n        port = '11' if ip_type == 'https' else '1'  # http(default) & https\n\n        get_url = 'http://webapi.http.zhimacangku.com/getip?num={num}&type=2&pro=&city=0&yys=0&port={port}&time={time}&ts=1&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1&regions='.format(\n            num=count, port=port, time=time_type)\n\n        # time 1=5m~25m   2=25m~3h  3=3h~6h  4=6h~12h\n        response = requests.get(get_url)\n        self.parse(response.text)\n\n    def del_ip(self):\n        pass\n\n    def parse(self, json_data):\n        \"\"\"\n        parse response json\n        \"\"\"\n        count = 0\n        ret_dict = json.loads(json_data)\n        if ret_dict.get('success'):\n            nodes = ret_dict.get('data')\n            for node in nodes:\n                end_time = self.get_end_time(node.get('expire_time'))\n                if not end_time:\n                    \"\"\"该域名存活时间过短，已弃用\"\"\"\n                    continue\n                self.save_to_redis(node.get('ip') + ':' + str(node.get('port')), int('10' + str(end_time)))\n                count += 1\n\n            self.get_balance(count, len(nodes))  # get balance\n        else:\n            print('获取代理失败:', ret_dict)\n\n    def get_end_time(self, parse_time):\n        \"\"\"\n        time transformation\n        \"\"\"\n        a = parse(parse_time)\n        b = parse(datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\"))\n        results = (a - b).total_seconds()\n        if results > self.ttl:\n            stamp = int(time.mktime(time.strptime(parse_time, \"%Y-%m-%d %H:%M:%S\")))\n            return stamp\n        else:\n            return\n\n    def save_to_redis(self, proxy, expire):\n        \"\"\"\n        proxy save to redis，default score is 10\n        \"\"\"\n        self.r.zadd('ZhiMaProxy', {proxy: expire})\n\n    def get_balance(self, count, total):\n        \"\"\"\n        get balance from web api\n        \"\"\"\n        balance_url = 'http://web.http.cnapi.cc/index/index/get_my_balance?neek=66439&appkey={key}'.format(key=self.key)\n        response = json.loads(requests.get(balance_url).text)\n        if response.get('success'):\n            print('\\033[1;34m余额:%s ,提取%s个\\033[0m' % (response.get('data').get('balance'), str(count)))\n            if total != count:\n                print('\\033[1;31m由于剩下存活时间过短弃用%s个\\033[0m' % str(total - count))\n        else:\n            print(response.get('msg'))\n\n\ndef aps_run():\n    \"\"\"\n    apscheduler func\n    \"\"\"\n    zm.check_ip()\n\n\nzm = ZhiMaPool('your key')  # 请填写你的key  参考文章：https://blog.zhangkunzhi.com/2019/05/02/%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%B6%85%E7%AE%80%E5%8D%95%E7%9A%84%E5%AE%9E%E7%94%A8%E7%9A%84%E9%AB%98%E5%8F%AF%E7%94%A8%E4%BB%98%E8%B4%B9IP%E6%B1%A0/index.html\n\nscheduler = BlockingScheduler()\nscheduler.add_job(aps_run, 'cron', second='*/2')  # 这里设置检测评论，推荐2s一次(默认)\nscheduler.start()\n\n"
  },
  {
    "path": "原创爬虫工具/Proxy/ZhiMaProxyUseDemo.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-07  Python: 3.7\nimport redis\nimport random\n\n# 在scrapy中使用 代理池的demo\n\n\n\"\"\"\nscrapy 中 middleware中代码如下\n\"\"\"\n\npool = redis.ConnectionPool(decode_responses=True)\nr = redis.Redis(connection_pool=pool)\n\n\n\n\n\"\"\"\nmiddleware中配置代理中间键\n注意，根据爬取网址是http 还是https 来设置\n\"\"\"\n\nclass MyProxy(object):\n    \"\"\"代理IP设置\"\"\"\n    def process_request(self, request, spider):\n        # 此处对接redis\n        data = r.zrange('ZhiMaProxy', 0, -1, withscores=True)\n        ip, score = random.choice(data)\n        request.meta['proxy'] = 'http://'+ip\n\n\n\n\n\"\"\"\n拦截中间键中配置如下，写入计分器，满分20分\n\"\"\"\n\nclass DownloaderMiddleware(object):\n    def process_response(self, request, response, spider):\n        # 对代理ip进行清洗\n        proxy = request._meta.get('proxy')\n        if response.status == 302:\n            print('IP访问失败')\n            if proxy:\n                proxy = proxy[proxy.find('/')+2:]\n                r.zincrby('ZhiMaProxy', -10000000000, proxy)  # redis 命令修改\n        elif response.status == 200:\n            if proxy:\n                proxy = proxy[proxy.find('/') + 2:]\n                score = r.zscore('ZhiMaProxy',proxy)\n                if score < 200000000000:\n                    r.zincrby('ZhiMaProxy', 10000000000, proxy)  # redis 新版本命令更改这样了\n        return response\n\n    def process_exception(self, request, exception, spider):  # 可能由于IP质量问题无法访问超时，必须在这里捕获然后扣分\n        print('超时异常')\n        proxy = request._meta.get('proxy')\n        if proxy:\n            proxy = proxy[proxy.find('/') + 2:]\n            r.zincrby('ZhiMaProxy', -10000000000, proxy)  # redis 新版本命令更改这样了\n            return request\n\n\n\"\"\"\nsetting中配置\n\"\"\"\nDOWNLOAD_TIMEOUT = 5  # 有的时候代理ip失效，会导致一直卡在那里 ，也有可能是用http 访问https\nOWNLOADER_MIDDLEWARES = {\n    'middlewares.MyProxy': 543,  # 自定义代理IP\n    'middlewares.spiderDownloaderMiddleware': 600,  # 拦截301、302等跳转\n}"
  },
  {
    "path": "原创爬虫工具/README.md",
    "content": "## 工具表\n- [x] [解密工具-可拓展式解密器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Decode)\n- [x] [自动注册-验证短信接收器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Register)\n- [x] [代理IP-芝麻代理池监控器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy)\n- [x] [代理IP-芝麻代理池客户端Demo](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy)\n- [x] [代理IP-讯代理池监控器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy)\n- [x] [代理IP-讯代理池客户端Demo](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy)\n- [x] [代理IP-快代理池监控器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Proxy)\n- [x] [cookies获取-pyppeteer获取美团登陆cookies](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Cookies)\n- [x] [跨数据库迁移器-开发中](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/DataMigration)\n- [x] [网络图片并发直传OSS](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/OSS)\n- [x] [生成encrypt加密参数器](https://github.com/wkunzhi/SpiderUtilPackage/tree/master/Jsencrypt)\n\n<hr>\n\n\n\n# 可拓展式解密器\n\n[**博客传送门**](https://blog.zhangkunzhi.com/2019/06/02/%E5%8E%9F%E5%88%9B%E5%B7%A5%E5%85%B7%E4%B9%8B%E5%8F%AF%E6%8B%93%E5%B1%95%E8%A7%A3%E7%A0%81%E5%99%A8/index.html)\n\n> 方便测试可连续转换重制的编码转换器，可灵活拓展解码规则\n\n![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/特殊.gif)\n\n<hr>\n\n\n\n\n# 代理池清洗工具\n\n[**博客传送门**](https://blog.zhangkunzhi.com/2019/05/02/%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%B6%85%E7%AE%80%E5%8D%95%E7%9A%84%E5%AE%9E%E7%94%A8%E7%9A%84%E9%AB%98%E5%8F%AF%E7%94%A8%E4%BB%98%E8%B4%B9IP%E6%B1%A0/index.html)\n\n> 爬虫经常会用到代理ip，其中有很多收费ip，但是如何在scrapy中，高效使用这些ip是一个比较麻烦的事情，在这里基于[芝麻代理ip](http://h.zhimaruanjian.com/pay/)做一个代理池监控器，首先整理我们的需求再对其代理质量进行管理，从而保持高效IP使用率\n\n![key位置](https://www.zhangkunzhi.com/images/提取ip.png)\n\n\n<hr>\n\n# 验证码短信接收器\n\n> 基于短信接收平台的异步短信接收器，最大并发上限 20，Python3.5+。\n启动后会根据设置的异步并发数进行获取手机号码并监听短信接收情况（60秒） 超过60秒后会将未收到短信的手机号拉入黑名单，并是释放。\n\n若要配置具体某个网站使用，还需开发对应的账号注册器，配合调用本短信接收器来达到自动注册账号的功能\n\n<hr>\n\n# cookies获取Demo\n\n> 基于Pyppeteer 并发获取站点cookies\n- 美团登陆cookies\n![](https://www.zhangkunzhi.com/images/异步获取cookies.png)\n\n\n# 跨数据库迁移器\n**工作中经常有这种需求**\n> 将采集好的mongodb数据转存到mysql中，或者是redis数据转到mongodb，于是打算封装一个组件便于以后调用\n\n- [x] mysql 数据迁移 mongodb \n![](https://www.zhangkunzhi.com/images/to_mongo1.png)\n![](https://www.zhangkunzhi.com/images/to_mongo2.png)"
  },
  {
    "path": "原创爬虫工具/Register/MessageCode.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\n\nimport requests\nimport json\nimport time\nimport asyncio\nimport aiohttp\n\nERROR = {\n    '1001': '参数token不能为空',\n    '1002': '参数action不能为空',\n    '1003': '参数action错误',\n    '1004': 'token失效',\n    '1005': '用户名或密码错误',\n    '1006': '用户名不能为空',\n    '1007': '密码不能为空',\n    '1008': '账户余额不足',\n    '1009': '账户被禁用',\n    '1010': '参数错误',\n    '1011': '账户待审核',\n    '1012': '账户暂停使用',\n    '1013': '接口功能未开启',\n    '1014': '接口登录未开启',\n    '2001': '参数itemid不能为空',\n    '2002': '项目不存在',\n    '2003': '项目未启用',\n    '2004': '暂时没有可用的号码',\n    '2005': '获取号码数量已达到上限',\n    '2006': '参数mobile不能为空',\n    '2007': '号码已被释放',\n    '2008': '号码已离线',\n    '2009': '发送内容不能为空',\n    '2010': '号码正在使用中',\n    '3001': '尚未收到短信',\n    '3002': '等待发送',\n    '3003': '正在发送',\n    '3004': '发送失败',\n    '3005': '订单不存在',\n    '9001': '系统错误',\n    '9002': '系统异常',\n}\n\n\nclass YMReg(object):\n\n    def __init__(self, token, project_code, aio_count=20):\n        \"\"\"\n        :param token: 账号 token，在官网后台查询\n        :param project_code: 项目编码，官网查询\n        :param aio_count: 并发上限默认 20 (官方)\n        \"\"\"\n        self.token = token\n        self.project_code = project_code\n        self.aio_count = aio_count\n\n        print(self.get_balance)  # 打印余额\n\n    @property\n    def get_balance(self):\n        \"\"\"查询余额\n        \"\"\"\n        balance_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=getaccountinfo&token={token}&format=1'\n        target_url = balance_api.format(token=self.token)\n        response = requests.get(target_url)\n        if response.status_code == 200:\n            state, data = response.text.split('|')\n            return '当前余额： %s 元' % json.loads(data).get('Balance')\n        else:\n            return '获取失败请检测账号'\n\n    @ staticmethod\n    def filter_info(message):\n        if message in ERROR:\n            return ERROR.get('message')\n        elif len(message.split('|')) == 2:\n            return message.split('|')[1]  # 返回正确信息\n        elif message == 'success':\n            return '拉黑或释放成功'\n        else:\n            return '未知错误'\n\n    async def get_node(self, session, phone):\n        \"\"\"接收短信\n        \"\"\"\n        for i in range(12):\n            await asyncio.sleep(5)\n            node_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=getsms&token={token}&itemid={itemid}&mobile={phone}&release=1&timestamp={time}'\n            target_url = node_api.format(token=self.token, itemid=self.project_code, phone=phone, time=time.time())\n            async with session.get(target_url) as response:\n                message = await response.text()\n                rest = self.filter_info(message)\n                if rest:\n                    return phone + rest\n\n        await self.join_black_list(session, phone)  # 获取失败加入黑名单\n        return '%s 短信获取失败' % phone\n\n    async def fetch_phone(self, session):\n        \"\"\"获取手机\n        \"\"\"\n        get_phone_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=getmobile&token={token}&itemid={itemid}&timestamp={time}'\n        target_url = get_phone_api.format(token=self.token, itemid=self.project_code, time=time.time())\n        async with session.get(target_url) as response:\n            message = await response.text()\n            return self.filter_info(message)\n\n    async def work(self):\n        \"\"\"开始工作\n        \"\"\"\n        async with aiohttp.ClientSession() as session:\n            result = await self.fetch_phone(session)\n            print('提取手机', result)\n\n            # 短信接收\n            result2 = await self.get_node(session, result)\n            print(result2)\n\n            # 释放\n            result3 = await self.del_phone(session, result)\n            print(result3)\n\n    async def del_phone(self, session, phone):\n        \"\"\"默认收到短信自动释放手机号，特殊情况可以单独调用释放\n        \"\"\"\n        del_phone_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=release&token={token}&itemid={itemid}&mobile={phone}'\n        target_url = del_phone_api.format(token=self.token, itemid=self.project_code, phone=phone)\n        async with session.get(target_url) as response:\n            message = await response.text()\n            return self.filter_info(message)\n\n    async def join_black_list(self, session, phone):\n        \"\"\"拉入黑名单，获取短信失败情况下拉入黑名单\n        \"\"\"\n        black_list_api = 'http://api.fxhyd.cn/UserInterface.aspx?action=addignore&token={token}&itemid={itemid}&mobile={phone}'\n        target_url = black_list_api.format(token=self.token, itemid=self.project_code, phone=phone)\n        async with session.get(target_url) as response:\n            message = await response.text()\n            return self.filter_info(message)\n\n    def start(self):\n        \"\"\"开始工作\n        \"\"\"\n        loop = asyncio.get_event_loop()\n        tasks = [asyncio.ensure_future(self.work()) for _ in range(self.aio_count)]\n        loop.run_until_complete(asyncio.wait(tasks))\n\n\nif __name__ == '__main__':\n    \"\"\"验证码平台 http://www.51ym.me/User/Default.aspx\"\"\"\n\n    ym = YMReg('后台查询token', '填写int类型项目编号，后台查询', 1)\n    ym.start()\n"
  },
  {
    "path": "原创爬虫工具/Register/README.md",
    "content": "# 注册短信并发异步接收器\n\n> 基于短信接收平台的异步短信接收器，最大并发上限20，Python3.5+\n\n`pip3 install asyncio`\n`pip3 install aiohttp`\n\n[平台网址](http://www.51ym.me/User/Default.aspx)\n\n## 使用步骤\n1. 实例化对象时填入平台 token\n2. 实例化对象时填入后台查询的项目 id\n3. 实例化对象时填入手机短信并发上限（最大20并发）\n\n> 启动后会根据设置的异步并发数进行获取手机号码并监听短信接收情况（60秒） 超过60秒后会将未收到短信的手机号拉入黑名单，并是释放。\n\n若要配置具体某个网站使用，还需开发对应的账号注册器，配合调用本短信接收器来达到自动注册账号的功能"
  },
  {
    "path": "原创爬虫工具/Register/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-05-13  Python: 3.7\n\n"
  },
  {
    "path": "原创爬虫工具/zok/README.md",
    "content": "# Zok 组件使用说明\n> by: 362416272@qq.com  自用\n\n### 目录\n- repetition 内容更新处理\n- save 通用持久化存储组件\n- random_UA 随机UA\n- proxies 阿布云代理组件\n\n\n\n**mysql储存**\n1. 必须在zok_config中配置要持久化的数据库账户密码\n2. 在爬虫项目文件pipelines管道中，引入并使用\n```python\nfrom zok.save.to_mysql import SaveToMysqlBase\n\nclass CityLandmarkListPipeline(SaveToMysqlBase):\n    member = 'city'  # redis集合名  如果是分布式无需设置\n\n    @staticmethod\n    def get_sql(item):\n        sql = \"\"\"INSERT INTO base_city_landmark(city, county, landmark) VALUES (\"{city}\",\"{county}\",\"{landmark}\") \"\"\".format(\n            city=item['city'],\n            county=item['county'],\n            landmark=item['landmark'],\n        )\n        return sql\n        \n'''必须调用 def_sql(item)方法，并返回sql语句即可'''\n```\n\n**随机UA**\n```python\n# setting.py中 加入即可\nDOWNLOADER_MIDDLEWARES = {\n   'zok.random_UA.ua_random.RandomUserAgentMiddleware': 20,\n}\n```\n\n**代理ip设置**\n```python\n# 在setting中配置即可\nDOWNLOADER_MIDDLEWARES = {\n   'zok.proxies.proxies.ProxyMiddleware': 15,  # 自定义的中间件\n}\n```\n\n**基于redis内容去重更新**\n> 原理： 在储存数据之前取到hash数据值，并加以对比，如果有值就跳过不储存，无值就set(md5, id)\n1. 开启redis服务\n2. 在 zok_config中配置 redis配置\n3. 应用储存组件 mysql 就会自动启用去重增量更新功能\n    "
  },
  {
    "path": "原创爬虫工具/zok/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/get_db/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/16  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/get_db/from_mongodb.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-04-23  Python: 3.7\nfrom pymongo import MongoClient\n\nfrom zok.zok_config import MONGODB_URL\n\nclient = MongoClient(MONGODB_URL)\n\ndatabase = client.meituan_db  # 链接数据库\ncollection = database.href_coolections  # 链接结合\n\ndata = collection.find({},{'_id': 0})\n"
  },
  {
    "path": "原创爬虫工具/zok/get_db/from_mysql.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"\n# Date: 2019/3/7  Python: 3.7\n\nimport pymysql\n\nfrom zok.zok_config import *\n\n\ndef get_data(sql):\n    conn = pymysql.Connect(\n        host=MYSQL_HOST,\n        port=MYSQL_PORT,\n        user=MYSQL_USER,\n        password=MYSQL_PASSWORD,\n        db=MYSQL_DB_NAME,\n    )\n    # 创建游标对象\n    cursor = conn.cursor()\n    # 提交事务\n    try:\n        cursor.execute(sql)\n        data = cursor.fetchall()\n        cursor.close()\n        conn.close()\n        return data\n    except Exception as e:\n        print(e)\n        print('异常回滚')\n        conn.rollback()\n        cursor.close()\n        conn.close()\n        return None\n\n"
  },
  {
    "path": "原创爬虫工具/zok/proxies/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/proxies/proxies.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n\nimport base64\nfrom zok.zok_config import *\n\n# 代理服务器\nproxyServer = \"http://http-dyn.abuyun.com:9020\"\n\n\nproxyAuth = \"Basic \" + base64.urlsafe_b64encode(bytes((PROXY_USER + \":\" + PROXY_PASS), \"ascii\")).decode(\"utf8\")\n\n\nclass ProxyMiddleware(object):\n    \"\"\"自定义中间件代理IP\"\"\"\n    def process_request(self, request, spider):\n        request.meta[\"proxy\"] = proxyServer\n        request.headers[\"Proxy-Authorization\"] = proxyAuth\n\n"
  },
  {
    "path": "原创爬虫工具/zok/random_UA/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/random_UA/fake_useragent.json",
    "content": "{\n\t\"browsers\": {\n\t\t\"chrome\": [\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36\", \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36\", \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36\", \"Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36\", \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10\", \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36\", \"Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36\", \"Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36\", \"Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14\"],\n\t\t\"opera\": [\"Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16\", \"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14\", \"Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14\", \"Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02\", \"Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00\", \"Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00\", \"Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00\", \"Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00\", \"Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0\", \"Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62\", \"Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62\", \"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52\", \"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52\", \"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51\", \"Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50\", \"Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50\", \"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11\", \"Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11\", \"Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11\", \"Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10\", \"Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10\", \"Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10\", \"Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1\", \"Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01\", \"Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01\", \"Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01\", \"Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00\"],\n\t\t\"firefox\": [\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1\", \"Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0\", \"Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0\", \"Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0\", \"Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101  Firefox/28.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0\", \"Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0\", \"Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0\", \"Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0\", \"Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0\", \"Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0)  Gecko/20100101 Firefox/18.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6\"],\n\t\t\"internetexplorer\": [\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko\", \"Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0;  rv:11.0) like Gecko\", \"Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)\", \"Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)\", \"Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)\", \"Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)\", \"Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))\", \"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30)\", \"Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)\"],\n\t\t\"safari\": [\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A\", \"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10\", \"Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\"]\n\t},\n\t\"randomize\": {\n\t\t\"344\": \"chrome\",\n\t\t\"819\": \"firefox\",\n\t\t\"346\": \"chrome\",\n\t\t\"347\": \"chrome\",\n\t\t\"340\": \"chrome\",\n\t\t\"341\": \"chrome\",\n\t\t\"342\": \"chrome\",\n\t\t\"343\": \"chrome\",\n\t\t\"810\": \"internetexplorer\",\n\t\t\"811\": \"internetexplorer\",\n\t\t\"812\": \"internetexplorer\",\n\t\t\"813\": \"firefox\",\n\t\t\"348\": \"chrome\",\n\t\t\"349\": \"chrome\",\n\t\t\"816\": \"firefox\",\n\t\t\"817\": \"firefox\",\n\t\t\"737\": \"chrome\",\n\t\t\"719\": \"chrome\",\n\t\t\"718\": \"chrome\",\n\t\t\"717\": \"chrome\",\n\t\t\"716\": \"chrome\",\n\t\t\"715\": \"chrome\",\n\t\t\"714\": \"chrome\",\n\t\t\"713\": \"chrome\",\n\t\t\"712\": \"chrome\",\n\t\t\"711\": \"chrome\",\n\t\t\"710\": \"chrome\",\n\t\t\"421\": \"chrome\",\n\t\t\"129\": \"chrome\",\n\t\t\"420\": \"chrome\",\n\t\t\"423\": \"chrome\",\n\t\t\"422\": \"chrome\",\n\t\t\"425\": \"chrome\",\n\t\t\"619\": \"chrome\",\n\t\t\"424\": \"chrome\",\n\t\t\"427\": \"chrome\",\n\t\t\"298\": \"chrome\",\n\t\t\"299\": \"chrome\",\n\t\t\"296\": \"chrome\",\n\t\t\"297\": \"chrome\",\n\t\t\"294\": \"chrome\",\n\t\t\"295\": \"chrome\",\n\t\t\"292\": \"chrome\",\n\t\t\"293\": \"chrome\",\n\t\t\"290\": \"chrome\",\n\t\t\"291\": \"chrome\",\n\t\t\"591\": \"chrome\",\n\t\t\"590\": \"chrome\",\n\t\t\"593\": \"chrome\",\n\t\t\"592\": \"chrome\",\n\t\t\"595\": \"chrome\",\n\t\t\"594\": \"chrome\",\n\t\t\"597\": \"chrome\",\n\t\t\"596\": \"chrome\",\n\t\t\"195\": \"chrome\",\n\t\t\"194\": \"chrome\",\n\t\t\"197\": \"chrome\",\n\t\t\"196\": \"chrome\",\n\t\t\"191\": \"chrome\",\n\t\t\"190\": \"chrome\",\n\t\t\"193\": \"chrome\",\n\t\t\"192\": \"chrome\",\n\t\t\"270\": \"chrome\",\n\t\t\"271\": \"chrome\",\n\t\t\"272\": \"chrome\",\n\t\t\"273\": \"chrome\",\n\t\t\"274\": \"chrome\",\n\t\t\"275\": \"chrome\",\n\t\t\"276\": \"chrome\",\n\t\t\"277\": \"chrome\",\n\t\t\"278\": \"chrome\",\n\t\t\"279\": \"chrome\",\n\t\t\"569\": \"chrome\",\n\t\t\"497\": \"chrome\",\n\t\t\"524\": \"chrome\",\n\t\t\"525\": \"chrome\",\n\t\t\"526\": \"chrome\",\n\t\t\"527\": \"chrome\",\n\t\t\"520\": \"chrome\",\n\t\t\"521\": \"chrome\",\n\t\t\"522\": \"chrome\",\n\t\t\"523\": \"chrome\",\n\t\t\"528\": \"chrome\",\n\t\t\"529\": \"chrome\",\n\t\t\"449\": \"chrome\",\n\t\t\"448\": \"chrome\",\n\t\t\"345\": \"chrome\",\n\t\t\"443\": \"chrome\",\n\t\t\"442\": \"chrome\",\n\t\t\"441\": \"chrome\",\n\t\t\"440\": \"chrome\",\n\t\t\"447\": \"chrome\",\n\t\t\"446\": \"chrome\",\n\t\t\"445\": \"chrome\",\n\t\t\"444\": \"chrome\",\n\t\t\"47\": \"chrome\",\n\t\t\"108\": \"chrome\",\n\t\t\"109\": \"chrome\",\n\t\t\"102\": \"chrome\",\n\t\t\"103\": \"chrome\",\n\t\t\"100\": \"chrome\",\n\t\t\"101\": \"chrome\",\n\t\t\"106\": \"chrome\",\n\t\t\"107\": \"chrome\",\n\t\t\"104\": \"chrome\",\n\t\t\"105\": \"chrome\",\n\t\t\"902\": \"firefox\",\n\t\t\"903\": \"firefox\",\n\t\t\"39\": \"chrome\",\n\t\t\"38\": \"chrome\",\n\t\t\"906\": \"firefox\",\n\t\t\"907\": \"firefox\",\n\t\t\"904\": \"firefox\",\n\t\t\"905\": \"firefox\",\n\t\t\"33\": \"chrome\",\n\t\t\"32\": \"chrome\",\n\t\t\"31\": \"chrome\",\n\t\t\"30\": \"chrome\",\n\t\t\"37\": \"chrome\",\n\t\t\"36\": \"chrome\",\n\t\t\"35\": \"chrome\",\n\t\t\"34\": \"chrome\",\n\t\t\"641\": \"chrome\",\n\t\t\"640\": \"chrome\",\n\t\t\"643\": \"chrome\",\n\t\t\"642\": \"chrome\",\n\t\t\"645\": \"chrome\",\n\t\t\"644\": \"chrome\",\n\t\t\"438\": \"chrome\",\n\t\t\"439\": \"chrome\",\n\t\t\"436\": \"chrome\",\n\t\t\"437\": \"chrome\",\n\t\t\"434\": \"chrome\",\n\t\t\"435\": \"chrome\",\n\t\t\"432\": \"chrome\",\n\t\t\"433\": \"chrome\",\n\t\t\"430\": \"chrome\",\n\t\t\"431\": \"chrome\",\n\t\t\"826\": \"firefox\",\n\t\t\"339\": \"chrome\",\n\t\t\"338\": \"chrome\",\n\t\t\"335\": \"chrome\",\n\t\t\"334\": \"chrome\",\n\t\t\"337\": \"chrome\",\n\t\t\"336\": \"chrome\",\n\t\t\"331\": \"chrome\",\n\t\t\"330\": \"chrome\",\n\t\t\"333\": \"chrome\",\n\t\t\"332\": \"chrome\",\n\t\t\"559\": \"chrome\",\n\t\t\"745\": \"chrome\",\n\t\t\"854\": \"firefox\",\n\t\t\"818\": \"firefox\",\n\t\t\"856\": \"firefox\",\n\t\t\"857\": \"firefox\",\n\t\t\"850\": \"firefox\",\n\t\t\"851\": \"firefox\",\n\t\t\"852\": \"firefox\",\n\t\t\"0\": \"chrome\",\n\t\t\"858\": \"firefox\",\n\t\t\"859\": \"firefox\",\n\t\t\"748\": \"chrome\",\n\t\t\"6\": \"chrome\",\n\t\t\"43\": \"chrome\",\n\t\t\"99\": \"chrome\",\n\t\t\"98\": \"chrome\",\n\t\t\"91\": \"chrome\",\n\t\t\"90\": \"chrome\",\n\t\t\"93\": \"chrome\",\n\t\t\"92\": \"chrome\",\n\t\t\"95\": \"chrome\",\n\t\t\"94\": \"chrome\",\n\t\t\"97\": \"chrome\",\n\t\t\"96\": \"chrome\",\n\t\t\"814\": \"firefox\",\n\t\t\"815\": \"firefox\",\n\t\t\"153\": \"chrome\",\n\t\t\"740\": \"chrome\",\n\t\t\"741\": \"chrome\",\n\t\t\"742\": \"chrome\",\n\t\t\"743\": \"chrome\",\n\t\t\"744\": \"chrome\",\n\t\t\"558\": \"chrome\",\n\t\t\"746\": \"chrome\",\n\t\t\"747\": \"chrome\",\n\t\t\"555\": \"chrome\",\n\t\t\"554\": \"chrome\",\n\t\t\"557\": \"chrome\",\n\t\t\"556\": \"chrome\",\n\t\t\"551\": \"chrome\",\n\t\t\"550\": \"chrome\",\n\t\t\"553\": \"chrome\",\n\t\t\"552\": \"chrome\",\n\t\t\"238\": \"chrome\",\n\t\t\"239\": \"chrome\",\n\t\t\"234\": \"chrome\",\n\t\t\"235\": \"chrome\",\n\t\t\"236\": \"chrome\",\n\t\t\"237\": \"chrome\",\n\t\t\"230\": \"chrome\",\n\t\t\"231\": \"chrome\",\n\t\t\"232\": \"chrome\",\n\t\t\"233\": \"chrome\",\n\t\t\"1\": \"chrome\",\n\t\t\"155\": \"chrome\",\n\t\t\"146\": \"chrome\",\n\t\t\"147\": \"chrome\",\n\t\t\"618\": \"chrome\",\n\t\t\"145\": \"chrome\",\n\t\t\"142\": \"chrome\",\n\t\t\"143\": \"chrome\",\n\t\t\"140\": \"chrome\",\n\t\t\"141\": \"chrome\",\n\t\t\"612\": \"chrome\",\n\t\t\"613\": \"chrome\",\n\t\t\"610\": \"chrome\",\n\t\t\"611\": \"chrome\",\n\t\t\"616\": \"chrome\",\n\t\t\"617\": \"chrome\",\n\t\t\"148\": \"chrome\",\n\t\t\"149\": \"chrome\",\n\t\t\"46\": \"chrome\",\n\t\t\"154\": \"chrome\",\n\t\t\"948\": \"safari\",\n\t\t\"949\": \"safari\",\n\t\t\"946\": \"safari\",\n\t\t\"947\": \"safari\",\n\t\t\"944\": \"safari\",\n\t\t\"945\": \"safari\",\n\t\t\"942\": \"safari\",\n\t\t\"943\": \"safari\",\n\t\t\"940\": \"safari\",\n\t\t\"941\": \"safari\",\n\t\t\"689\": \"chrome\",\n\t\t\"688\": \"chrome\",\n\t\t\"685\": \"chrome\",\n\t\t\"684\": \"chrome\",\n\t\t\"687\": \"chrome\",\n\t\t\"686\": \"chrome\",\n\t\t\"681\": \"chrome\",\n\t\t\"680\": \"chrome\",\n\t\t\"683\": \"chrome\",\n\t\t\"682\": \"chrome\",\n\t\t\"458\": \"chrome\",\n\t\t\"459\": \"chrome\",\n\t\t\"133\": \"chrome\",\n\t\t\"132\": \"chrome\",\n\t\t\"131\": \"chrome\",\n\t\t\"130\": \"chrome\",\n\t\t\"137\": \"chrome\",\n\t\t\"136\": \"chrome\",\n\t\t\"135\": \"chrome\",\n\t\t\"134\": \"chrome\",\n\t\t\"494\": \"chrome\",\n\t\t\"495\": \"chrome\",\n\t\t\"139\": \"chrome\",\n\t\t\"138\": \"chrome\",\n\t\t\"490\": \"chrome\",\n\t\t\"491\": \"chrome\",\n\t\t\"492\": \"chrome\",\n\t\t\"493\": \"chrome\",\n\t\t\"24\": \"chrome\",\n\t\t\"25\": \"chrome\",\n\t\t\"26\": \"chrome\",\n\t\t\"27\": \"chrome\",\n\t\t\"20\": \"chrome\",\n\t\t\"21\": \"chrome\",\n\t\t\"22\": \"chrome\",\n\t\t\"23\": \"chrome\",\n\t\t\"28\": \"chrome\",\n\t\t\"29\": \"chrome\",\n\t\t\"820\": \"firefox\",\n\t\t\"407\": \"chrome\",\n\t\t\"406\": \"chrome\",\n\t\t\"405\": \"chrome\",\n\t\t\"404\": \"chrome\",\n\t\t\"403\": \"chrome\",\n\t\t\"402\": \"chrome\",\n\t\t\"401\": \"chrome\",\n\t\t\"400\": \"chrome\",\n\t\t\"933\": \"firefox\",\n\t\t\"932\": \"firefox\",\n\t\t\"931\": \"firefox\",\n\t\t\"930\": \"firefox\",\n\t\t\"937\": \"safari\",\n\t\t\"452\": \"chrome\",\n\t\t\"409\": \"chrome\",\n\t\t\"408\": \"chrome\",\n\t\t\"453\": \"chrome\",\n\t\t\"414\": \"chrome\",\n\t\t\"183\": \"chrome\",\n\t\t\"415\": \"chrome\",\n\t\t\"379\": \"chrome\",\n\t\t\"378\": \"chrome\",\n\t\t\"228\": \"chrome\",\n\t\t\"829\": \"firefox\",\n\t\t\"828\": \"firefox\",\n\t\t\"371\": \"chrome\",\n\t\t\"370\": \"chrome\",\n\t\t\"373\": \"chrome\",\n\t\t\"372\": \"chrome\",\n\t\t\"375\": \"chrome\",\n\t\t\"374\": \"chrome\",\n\t\t\"377\": \"chrome\",\n\t\t\"376\": \"chrome\",\n\t\t\"708\": \"chrome\",\n\t\t\"709\": \"chrome\",\n\t\t\"704\": \"chrome\",\n\t\t\"705\": \"chrome\",\n\t\t\"706\": \"chrome\",\n\t\t\"707\": \"chrome\",\n\t\t\"700\": \"chrome\",\n\t\t\"144\": \"chrome\",\n\t\t\"702\": \"chrome\",\n\t\t\"703\": \"chrome\",\n\t\t\"393\": \"chrome\",\n\t\t\"392\": \"chrome\",\n\t\t\"88\": \"chrome\",\n\t\t\"89\": \"chrome\",\n\t\t\"397\": \"chrome\",\n\t\t\"396\": \"chrome\",\n\t\t\"395\": \"chrome\",\n\t\t\"394\": \"chrome\",\n\t\t\"82\": \"chrome\",\n\t\t\"83\": \"chrome\",\n\t\t\"80\": \"chrome\",\n\t\t\"81\": \"chrome\",\n\t\t\"86\": \"chrome\",\n\t\t\"87\": \"chrome\",\n\t\t\"84\": \"chrome\",\n\t\t\"85\": \"chrome\",\n\t\t\"797\": \"internetexplorer\",\n\t\t\"796\": \"internetexplorer\",\n\t\t\"795\": \"internetexplorer\",\n\t\t\"794\": \"internetexplorer\",\n\t\t\"793\": \"internetexplorer\",\n\t\t\"792\": \"internetexplorer\",\n\t\t\"791\": \"internetexplorer\",\n\t\t\"790\": \"internetexplorer\",\n\t\t\"749\": \"chrome\",\n\t\t\"799\": \"internetexplorer\",\n\t\t\"798\": \"internetexplorer\",\n\t\t\"7\": \"chrome\",\n\t\t\"170\": \"chrome\",\n\t\t\"586\": \"chrome\",\n\t\t\"587\": \"chrome\",\n\t\t\"584\": \"chrome\",\n\t\t\"585\": \"chrome\",\n\t\t\"582\": \"chrome\",\n\t\t\"583\": \"chrome\",\n\t\t\"580\": \"chrome\",\n\t\t\"581\": \"chrome\",\n\t\t\"588\": \"chrome\",\n\t\t\"589\": \"chrome\",\n\t\t\"245\": \"chrome\",\n\t\t\"244\": \"chrome\",\n\t\t\"247\": \"chrome\",\n\t\t\"246\": \"chrome\",\n\t\t\"241\": \"chrome\",\n\t\t\"614\": \"chrome\",\n\t\t\"243\": \"chrome\",\n\t\t\"242\": \"chrome\",\n\t\t\"615\": \"chrome\",\n\t\t\"249\": \"chrome\",\n\t\t\"248\": \"chrome\",\n\t\t\"418\": \"chrome\",\n\t\t\"419\": \"chrome\",\n\t\t\"519\": \"chrome\",\n\t\t\"518\": \"chrome\",\n\t\t\"511\": \"chrome\",\n\t\t\"510\": \"chrome\",\n\t\t\"513\": \"chrome\",\n\t\t\"512\": \"chrome\",\n\t\t\"515\": \"chrome\",\n\t\t\"514\": \"chrome\",\n\t\t\"517\": \"chrome\",\n\t\t\"516\": \"chrome\",\n\t\t\"623\": \"chrome\",\n\t\t\"622\": \"chrome\",\n\t\t\"621\": \"chrome\",\n\t\t\"620\": \"chrome\",\n\t\t\"627\": \"chrome\",\n\t\t\"626\": \"chrome\",\n\t\t\"625\": \"chrome\",\n\t\t\"624\": \"chrome\",\n\t\t\"450\": \"chrome\",\n\t\t\"451\": \"chrome\",\n\t\t\"629\": \"chrome\",\n\t\t\"628\": \"chrome\",\n\t\t\"454\": \"chrome\",\n\t\t\"455\": \"chrome\",\n\t\t\"456\": \"chrome\",\n\t\t\"457\": \"chrome\",\n\t\t\"179\": \"chrome\",\n\t\t\"178\": \"chrome\",\n\t\t\"177\": \"chrome\",\n\t\t\"199\": \"chrome\",\n\t\t\"175\": \"chrome\",\n\t\t\"174\": \"chrome\",\n\t\t\"173\": \"chrome\",\n\t\t\"172\": \"chrome\",\n\t\t\"171\": \"chrome\",\n\t\t\"198\": \"chrome\",\n\t\t\"977\": \"opera\",\n\t\t\"182\": \"chrome\",\n\t\t\"975\": \"opera\",\n\t\t\"974\": \"opera\",\n\t\t\"973\": \"opera\",\n\t\t\"972\": \"opera\",\n\t\t\"971\": \"opera\",\n\t\t\"970\": \"opera\",\n\t\t\"180\": \"chrome\",\n\t\t\"979\": \"opera\",\n\t\t\"978\": \"opera\",\n\t\t\"656\": \"chrome\",\n\t\t\"599\": \"chrome\",\n\t\t\"654\": \"chrome\",\n\t\t\"181\": \"chrome\",\n\t\t\"186\": \"chrome\",\n\t\t\"187\": \"chrome\",\n\t\t\"184\": \"chrome\",\n\t\t\"185\": \"chrome\",\n\t\t\"652\": \"chrome\",\n\t\t\"188\": \"chrome\",\n\t\t\"189\": \"chrome\",\n\t\t\"658\": \"chrome\",\n\t\t\"653\": \"chrome\",\n\t\t\"650\": \"chrome\",\n\t\t\"651\": \"chrome\",\n\t\t\"11\": \"chrome\",\n\t\t\"10\": \"chrome\",\n\t\t\"13\": \"chrome\",\n\t\t\"12\": \"chrome\",\n\t\t\"15\": \"chrome\",\n\t\t\"14\": \"chrome\",\n\t\t\"17\": \"chrome\",\n\t\t\"16\": \"chrome\",\n\t\t\"19\": \"chrome\",\n\t\t\"18\": \"chrome\",\n\t\t\"863\": \"firefox\",\n\t\t\"862\": \"firefox\",\n\t\t\"865\": \"firefox\",\n\t\t\"864\": \"firefox\",\n\t\t\"867\": \"firefox\",\n\t\t\"866\": \"firefox\",\n\t\t\"354\": \"chrome\",\n\t\t\"659\": \"chrome\",\n\t\t\"44\": \"chrome\",\n\t\t\"883\": \"firefox\",\n\t\t\"882\": \"firefox\",\n\t\t\"881\": \"firefox\",\n\t\t\"880\": \"firefox\",\n\t\t\"887\": \"firefox\",\n\t\t\"886\": \"firefox\",\n\t\t\"885\": \"firefox\",\n\t\t\"884\": \"firefox\",\n\t\t\"889\": \"firefox\",\n\t\t\"888\": \"firefox\",\n\t\t\"116\": \"chrome\",\n\t\t\"45\": \"chrome\",\n\t\t\"657\": \"chrome\",\n\t\t\"355\": \"chrome\",\n\t\t\"322\": \"chrome\",\n\t\t\"323\": \"chrome\",\n\t\t\"320\": \"chrome\",\n\t\t\"321\": \"chrome\",\n\t\t\"326\": \"chrome\",\n\t\t\"327\": \"chrome\",\n\t\t\"324\": \"chrome\",\n\t\t\"325\": \"chrome\",\n\t\t\"328\": \"chrome\",\n\t\t\"329\": \"chrome\",\n\t\t\"562\": \"chrome\",\n\t\t\"201\": \"chrome\",\n\t\t\"200\": \"chrome\",\n\t\t\"203\": \"chrome\",\n\t\t\"202\": \"chrome\",\n\t\t\"205\": \"chrome\",\n\t\t\"204\": \"chrome\",\n\t\t\"207\": \"chrome\",\n\t\t\"206\": \"chrome\",\n\t\t\"209\": \"chrome\",\n\t\t\"208\": \"chrome\",\n\t\t\"779\": \"internetexplorer\",\n\t\t\"778\": \"internetexplorer\",\n\t\t\"77\": \"chrome\",\n\t\t\"76\": \"chrome\",\n\t\t\"75\": \"chrome\",\n\t\t\"74\": \"chrome\",\n\t\t\"73\": \"chrome\",\n\t\t\"72\": \"chrome\",\n\t\t\"71\": \"chrome\",\n\t\t\"70\": \"chrome\",\n\t\t\"655\": \"chrome\",\n\t\t\"567\": \"chrome\",\n\t\t\"79\": \"chrome\",\n\t\t\"78\": \"chrome\",\n\t\t\"359\": \"chrome\",\n\t\t\"358\": \"chrome\",\n\t\t\"669\": \"chrome\",\n\t\t\"668\": \"chrome\",\n\t\t\"667\": \"chrome\",\n\t\t\"666\": \"chrome\",\n\t\t\"665\": \"chrome\",\n\t\t\"664\": \"chrome\",\n\t\t\"663\": \"chrome\",\n\t\t\"662\": \"chrome\",\n\t\t\"661\": \"chrome\",\n\t\t\"660\": \"chrome\",\n\t\t\"215\": \"chrome\",\n\t\t\"692\": \"chrome\",\n\t\t\"693\": \"chrome\",\n\t\t\"690\": \"chrome\",\n\t\t\"691\": \"chrome\",\n\t\t\"696\": \"chrome\",\n\t\t\"697\": \"chrome\",\n\t\t\"694\": \"chrome\",\n\t\t\"695\": \"chrome\",\n\t\t\"698\": \"chrome\",\n\t\t\"699\": \"chrome\",\n\t\t\"542\": \"chrome\",\n\t\t\"543\": \"chrome\",\n\t\t\"540\": \"chrome\",\n\t\t\"541\": \"chrome\",\n\t\t\"546\": \"chrome\",\n\t\t\"547\": \"chrome\",\n\t\t\"544\": \"chrome\",\n\t\t\"545\": \"chrome\",\n\t\t\"8\": \"chrome\",\n\t\t\"548\": \"chrome\",\n\t\t\"549\": \"chrome\",\n\t\t\"598\": \"chrome\",\n\t\t\"869\": \"firefox\",\n\t\t\"868\": \"firefox\",\n\t\t\"120\": \"chrome\",\n\t\t\"121\": \"chrome\",\n\t\t\"122\": \"chrome\",\n\t\t\"123\": \"chrome\",\n\t\t\"124\": \"chrome\",\n\t\t\"125\": \"chrome\",\n\t\t\"126\": \"chrome\",\n\t\t\"127\": \"chrome\",\n\t\t\"128\": \"chrome\",\n\t\t\"2\": \"chrome\",\n\t\t\"219\": \"chrome\",\n\t\t\"176\": \"chrome\",\n\t\t\"214\": \"chrome\",\n\t\t\"563\": \"chrome\",\n\t\t\"928\": \"firefox\",\n\t\t\"929\": \"firefox\",\n\t\t\"416\": \"chrome\",\n\t\t\"417\": \"chrome\",\n\t\t\"410\": \"chrome\",\n\t\t\"411\": \"chrome\",\n\t\t\"412\": \"chrome\",\n\t\t\"413\": \"chrome\",\n\t\t\"920\": \"firefox\",\n\t\t\"498\": \"chrome\",\n\t\t\"922\": \"firefox\",\n\t\t\"923\": \"firefox\",\n\t\t\"924\": \"firefox\",\n\t\t\"925\": \"firefox\",\n\t\t\"926\": \"firefox\",\n\t\t\"927\": \"firefox\",\n\t\t\"319\": \"chrome\",\n\t\t\"318\": \"chrome\",\n\t\t\"313\": \"chrome\",\n\t\t\"312\": \"chrome\",\n\t\t\"311\": \"chrome\",\n\t\t\"310\": \"chrome\",\n\t\t\"317\": \"chrome\",\n\t\t\"316\": \"chrome\",\n\t\t\"315\": \"chrome\",\n\t\t\"314\": \"chrome\",\n\t\t\"921\": \"firefox\",\n\t\t\"496\": \"chrome\",\n\t\t\"832\": \"firefox\",\n\t\t\"833\": \"firefox\",\n\t\t\"830\": \"firefox\",\n\t\t\"831\": \"firefox\",\n\t\t\"836\": \"firefox\",\n\t\t\"837\": \"firefox\",\n\t\t\"834\": \"firefox\",\n\t\t\"835\": \"firefox\",\n\t\t\"838\": \"firefox\",\n\t\t\"839\": \"firefox\",\n\t\t\"3\": \"chrome\",\n\t\t\"368\": \"chrome\",\n\t\t\"369\": \"chrome\",\n\t\t\"366\": \"chrome\",\n\t\t\"367\": \"chrome\",\n\t\t\"364\": \"chrome\",\n\t\t\"365\": \"chrome\",\n\t\t\"362\": \"chrome\",\n\t\t\"363\": \"chrome\",\n\t\t\"360\": \"chrome\",\n\t\t\"361\": \"chrome\",\n\t\t\"218\": \"chrome\",\n\t\t\"380\": \"chrome\",\n\t\t\"861\": \"firefox\",\n\t\t\"382\": \"chrome\",\n\t\t\"383\": \"chrome\",\n\t\t\"384\": \"chrome\",\n\t\t\"385\": \"chrome\",\n\t\t\"386\": \"chrome\",\n\t\t\"387\": \"chrome\",\n\t\t\"388\": \"chrome\",\n\t\t\"389\": \"chrome\",\n\t\t\"784\": \"internetexplorer\",\n\t\t\"785\": \"internetexplorer\",\n\t\t\"786\": \"internetexplorer\",\n\t\t\"787\": \"internetexplorer\",\n\t\t\"780\": \"internetexplorer\",\n\t\t\"781\": \"internetexplorer\",\n\t\t\"782\": \"internetexplorer\",\n\t\t\"381\": \"chrome\",\n\t\t\"788\": \"internetexplorer\",\n\t\t\"789\": \"internetexplorer\",\n\t\t\"860\": \"firefox\",\n\t\t\"151\": \"chrome\",\n\t\t\"579\": \"chrome\",\n\t\t\"578\": \"chrome\",\n\t\t\"150\": \"chrome\",\n\t\t\"573\": \"chrome\",\n\t\t\"572\": \"chrome\",\n\t\t\"571\": \"chrome\",\n\t\t\"570\": \"chrome\",\n\t\t\"577\": \"chrome\",\n\t\t\"576\": \"chrome\",\n\t\t\"575\": \"chrome\",\n\t\t\"574\": \"chrome\",\n\t\t\"60\": \"chrome\",\n\t\t\"61\": \"chrome\",\n\t\t\"62\": \"chrome\",\n\t\t\"259\": \"chrome\",\n\t\t\"64\": \"chrome\",\n\t\t\"65\": \"chrome\",\n\t\t\"66\": \"chrome\",\n\t\t\"67\": \"chrome\",\n\t\t\"68\": \"chrome\",\n\t\t\"253\": \"chrome\",\n\t\t\"250\": \"chrome\",\n\t\t\"251\": \"chrome\",\n\t\t\"256\": \"chrome\",\n\t\t\"257\": \"chrome\",\n\t\t\"254\": \"chrome\",\n\t\t\"255\": \"chrome\",\n\t\t\"499\": \"chrome\",\n\t\t\"157\": \"chrome\",\n\t\t\"156\": \"chrome\",\n\t\t\"939\": \"safari\",\n\t\t\"731\": \"chrome\",\n\t\t\"730\": \"chrome\",\n\t\t\"733\": \"chrome\",\n\t\t\"938\": \"safari\",\n\t\t\"735\": \"chrome\",\n\t\t\"734\": \"chrome\",\n\t\t\"508\": \"chrome\",\n\t\t\"736\": \"chrome\",\n\t\t\"506\": \"chrome\",\n\t\t\"738\": \"chrome\",\n\t\t\"504\": \"chrome\",\n\t\t\"505\": \"chrome\",\n\t\t\"502\": \"chrome\",\n\t\t\"503\": \"chrome\",\n\t\t\"500\": \"chrome\",\n\t\t\"501\": \"chrome\",\n\t\t\"630\": \"chrome\",\n\t\t\"631\": \"chrome\",\n\t\t\"632\": \"chrome\",\n\t\t\"633\": \"chrome\",\n\t\t\"469\": \"chrome\",\n\t\t\"468\": \"chrome\",\n\t\t\"636\": \"chrome\",\n\t\t\"637\": \"chrome\",\n\t\t\"465\": \"chrome\",\n\t\t\"464\": \"chrome\",\n\t\t\"467\": \"chrome\",\n\t\t\"466\": \"chrome\",\n\t\t\"461\": \"chrome\",\n\t\t\"900\": \"firefox\",\n\t\t\"463\": \"chrome\",\n\t\t\"462\": \"chrome\",\n\t\t\"901\": \"firefox\",\n\t\t\"168\": \"chrome\",\n\t\t\"169\": \"chrome\",\n\t\t\"164\": \"chrome\",\n\t\t\"165\": \"chrome\",\n\t\t\"166\": \"chrome\",\n\t\t\"167\": \"chrome\",\n\t\t\"160\": \"chrome\",\n\t\t\"161\": \"chrome\",\n\t\t\"162\": \"chrome\",\n\t\t\"163\": \"chrome\",\n\t\t\"964\": \"safari\",\n\t\t\"965\": \"safari\",\n\t\t\"966\": \"safari\",\n\t\t\"967\": \"safari\",\n\t\t\"960\": \"safari\",\n\t\t\"961\": \"safari\",\n\t\t\"962\": \"safari\",\n\t\t\"963\": \"safari\",\n\t\t\"783\": \"internetexplorer\",\n\t\t\"968\": \"safari\",\n\t\t\"969\": \"opera\",\n\t\t\"936\": \"firefox\",\n\t\t\"935\": \"firefox\",\n\t\t\"934\": \"firefox\",\n\t\t\"908\": \"firefox\",\n\t\t\"909\": \"firefox\",\n\t\t\"722\": \"chrome\",\n\t\t\"426\": \"chrome\",\n\t\t\"878\": \"firefox\",\n\t\t\"879\": \"firefox\",\n\t\t\"876\": \"firefox\",\n\t\t\"877\": \"firefox\",\n\t\t\"874\": \"firefox\",\n\t\t\"875\": \"firefox\",\n\t\t\"872\": \"firefox\",\n\t\t\"873\": \"firefox\",\n\t\t\"870\": \"firefox\",\n\t\t\"871\": \"firefox\",\n\t\t\"9\": \"chrome\",\n\t\t\"890\": \"firefox\",\n\t\t\"891\": \"firefox\",\n\t\t\"892\": \"firefox\",\n\t\t\"893\": \"firefox\",\n\t\t\"894\": \"firefox\",\n\t\t\"647\": \"chrome\",\n\t\t\"896\": \"firefox\",\n\t\t\"897\": \"firefox\",\n\t\t\"898\": \"firefox\",\n\t\t\"899\": \"firefox\",\n\t\t\"646\": \"chrome\",\n\t\t\"649\": \"chrome\",\n\t\t\"648\": \"chrome\",\n\t\t\"357\": \"chrome\",\n\t\t\"356\": \"chrome\",\n\t\t\"809\": \"internetexplorer\",\n\t\t\"808\": \"internetexplorer\",\n\t\t\"353\": \"chrome\",\n\t\t\"352\": \"chrome\",\n\t\t\"351\": \"chrome\",\n\t\t\"350\": \"chrome\",\n\t\t\"803\": \"internetexplorer\",\n\t\t\"802\": \"internetexplorer\",\n\t\t\"801\": \"internetexplorer\",\n\t\t\"800\": \"internetexplorer\",\n\t\t\"807\": \"internetexplorer\",\n\t\t\"806\": \"internetexplorer\",\n\t\t\"805\": \"internetexplorer\",\n\t\t\"804\": \"internetexplorer\",\n\t\t\"216\": \"chrome\",\n\t\t\"217\": \"chrome\",\n\t\t\"768\": \"chrome\",\n\t\t\"769\": \"chrome\",\n\t\t\"212\": \"chrome\",\n\t\t\"213\": \"chrome\",\n\t\t\"210\": \"chrome\",\n\t\t\"211\": \"chrome\",\n\t\t\"762\": \"chrome\",\n\t\t\"763\": \"chrome\",\n\t\t\"760\": \"chrome\",\n\t\t\"761\": \"chrome\",\n\t\t\"766\": \"chrome\",\n\t\t\"767\": \"chrome\",\n\t\t\"764\": \"chrome\",\n\t\t\"765\": \"chrome\",\n\t\t\"40\": \"chrome\",\n\t\t\"41\": \"chrome\",\n\t\t\"289\": \"chrome\",\n\t\t\"288\": \"chrome\",\n\t\t\"4\": \"chrome\",\n\t\t\"281\": \"chrome\",\n\t\t\"280\": \"chrome\",\n\t\t\"283\": \"chrome\",\n\t\t\"282\": \"chrome\",\n\t\t\"285\": \"chrome\",\n\t\t\"284\": \"chrome\",\n\t\t\"287\": \"chrome\",\n\t\t\"286\": \"chrome\",\n\t\t\"678\": \"chrome\",\n\t\t\"679\": \"chrome\",\n\t\t\"674\": \"chrome\",\n\t\t\"675\": \"chrome\",\n\t\t\"676\": \"chrome\",\n\t\t\"677\": \"chrome\",\n\t\t\"670\": \"chrome\",\n\t\t\"671\": \"chrome\",\n\t\t\"672\": \"chrome\",\n\t\t\"673\": \"chrome\",\n\t\t\"263\": \"chrome\",\n\t\t\"262\": \"chrome\",\n\t\t\"261\": \"chrome\",\n\t\t\"260\": \"chrome\",\n\t\t\"267\": \"chrome\",\n\t\t\"266\": \"chrome\",\n\t\t\"265\": \"chrome\",\n\t\t\"264\": \"chrome\",\n\t\t\"269\": \"chrome\",\n\t\t\"268\": \"chrome\",\n\t\t\"59\": \"chrome\",\n\t\t\"58\": \"chrome\",\n\t\t\"55\": \"chrome\",\n\t\t\"54\": \"chrome\",\n\t\t\"57\": \"chrome\",\n\t\t\"56\": \"chrome\",\n\t\t\"51\": \"chrome\",\n\t\t\"258\": \"chrome\",\n\t\t\"53\": \"chrome\",\n\t\t\"52\": \"chrome\",\n\t\t\"537\": \"chrome\",\n\t\t\"536\": \"chrome\",\n\t\t\"535\": \"chrome\",\n\t\t\"63\": \"chrome\",\n\t\t\"533\": \"chrome\",\n\t\t\"532\": \"chrome\",\n\t\t\"531\": \"chrome\",\n\t\t\"530\": \"chrome\",\n\t\t\"152\": \"chrome\",\n\t\t\"539\": \"chrome\",\n\t\t\"538\": \"chrome\",\n\t\t\"775\": \"internetexplorer\",\n\t\t\"774\": \"internetexplorer\",\n\t\t\"982\": \"opera\",\n\t\t\"983\": \"opera\",\n\t\t\"980\": \"opera\",\n\t\t\"981\": \"opera\",\n\t\t\"777\": \"internetexplorer\",\n\t\t\"984\": \"opera\",\n\t\t\"50\": \"chrome\",\n\t\t\"115\": \"chrome\",\n\t\t\"252\": \"chrome\",\n\t\t\"117\": \"chrome\",\n\t\t\"776\": \"internetexplorer\",\n\t\t\"111\": \"chrome\",\n\t\t\"110\": \"chrome\",\n\t\t\"113\": \"chrome\",\n\t\t\"69\": \"chrome\",\n\t\t\"771\": \"chrome\",\n\t\t\"119\": \"chrome\",\n\t\t\"118\": \"chrome\",\n\t\t\"770\": \"chrome\",\n\t\t\"773\": \"internetexplorer\",\n\t\t\"772\": \"internetexplorer\",\n\t\t\"429\": \"chrome\",\n\t\t\"428\": \"chrome\",\n\t\t\"534\": \"chrome\",\n\t\t\"919\": \"firefox\",\n\t\t\"918\": \"firefox\",\n\t\t\"915\": \"firefox\",\n\t\t\"914\": \"firefox\",\n\t\t\"917\": \"firefox\",\n\t\t\"916\": \"firefox\",\n\t\t\"911\": \"firefox\",\n\t\t\"910\": \"firefox\",\n\t\t\"913\": \"firefox\",\n\t\t\"912\": \"firefox\",\n\t\t\"308\": \"chrome\",\n\t\t\"309\": \"chrome\",\n\t\t\"855\": \"firefox\",\n\t\t\"300\": \"chrome\",\n\t\t\"301\": \"chrome\",\n\t\t\"302\": \"chrome\",\n\t\t\"303\": \"chrome\",\n\t\t\"304\": \"chrome\",\n\t\t\"305\": \"chrome\",\n\t\t\"306\": \"chrome\",\n\t\t\"307\": \"chrome\",\n\t\t\"895\": \"firefox\",\n\t\t\"825\": \"firefox\",\n\t\t\"824\": \"firefox\",\n\t\t\"827\": \"firefox\",\n\t\t\"847\": \"firefox\",\n\t\t\"846\": \"firefox\",\n\t\t\"845\": \"firefox\",\n\t\t\"844\": \"firefox\",\n\t\t\"843\": \"firefox\",\n\t\t\"842\": \"firefox\",\n\t\t\"841\": \"firefox\",\n\t\t\"840\": \"firefox\",\n\t\t\"821\": \"firefox\",\n\t\t\"853\": \"firefox\",\n\t\t\"849\": \"firefox\",\n\t\t\"848\": \"firefox\",\n\t\t\"823\": \"firefox\",\n\t\t\"822\": \"firefox\",\n\t\t\"240\": \"chrome\",\n\t\t\"390\": \"chrome\",\n\t\t\"732\": \"chrome\",\n\t\t\"753\": \"chrome\",\n\t\t\"752\": \"chrome\",\n\t\t\"751\": \"chrome\",\n\t\t\"750\": \"chrome\",\n\t\t\"757\": \"chrome\",\n\t\t\"756\": \"chrome\",\n\t\t\"755\": \"chrome\",\n\t\t\"754\": \"chrome\",\n\t\t\"560\": \"chrome\",\n\t\t\"561\": \"chrome\",\n\t\t\"759\": \"chrome\",\n\t\t\"758\": \"chrome\",\n\t\t\"564\": \"chrome\",\n\t\t\"565\": \"chrome\",\n\t\t\"566\": \"chrome\",\n\t\t\"701\": \"chrome\",\n\t\t\"739\": \"chrome\",\n\t\t\"229\": \"chrome\",\n\t\t\"507\": \"chrome\",\n\t\t\"227\": \"chrome\",\n\t\t\"226\": \"chrome\",\n\t\t\"225\": \"chrome\",\n\t\t\"224\": \"chrome\",\n\t\t\"223\": \"chrome\",\n\t\t\"222\": \"chrome\",\n\t\t\"221\": \"chrome\",\n\t\t\"220\": \"chrome\",\n\t\t\"114\": \"chrome\",\n\t\t\"391\": \"chrome\",\n\t\t\"726\": \"chrome\",\n\t\t\"727\": \"chrome\",\n\t\t\"724\": \"chrome\",\n\t\t\"725\": \"chrome\",\n\t\t\"568\": \"chrome\",\n\t\t\"723\": \"chrome\",\n\t\t\"720\": \"chrome\",\n\t\t\"721\": \"chrome\",\n\t\t\"728\": \"chrome\",\n\t\t\"729\": \"chrome\",\n\t\t\"605\": \"chrome\",\n\t\t\"604\": \"chrome\",\n\t\t\"607\": \"chrome\",\n\t\t\"606\": \"chrome\",\n\t\t\"601\": \"chrome\",\n\t\t\"600\": \"chrome\",\n\t\t\"603\": \"chrome\",\n\t\t\"602\": \"chrome\",\n\t\t\"159\": \"chrome\",\n\t\t\"158\": \"chrome\",\n\t\t\"112\": \"chrome\",\n\t\t\"609\": \"chrome\",\n\t\t\"608\": \"chrome\",\n\t\t\"976\": \"opera\",\n\t\t\"634\": \"chrome\",\n\t\t\"399\": \"chrome\",\n\t\t\"635\": \"chrome\",\n\t\t\"959\": \"safari\",\n\t\t\"958\": \"safari\",\n\t\t\"398\": \"chrome\",\n\t\t\"48\": \"chrome\",\n\t\t\"49\": \"chrome\",\n\t\t\"951\": \"safari\",\n\t\t\"950\": \"safari\",\n\t\t\"953\": \"safari\",\n\t\t\"952\": \"safari\",\n\t\t\"42\": \"chrome\",\n\t\t\"954\": \"safari\",\n\t\t\"957\": \"safari\",\n\t\t\"956\": \"safari\",\n\t\t\"638\": \"chrome\",\n\t\t\"5\": \"chrome\",\n\t\t\"639\": \"chrome\",\n\t\t\"460\": \"chrome\",\n\t\t\"489\": \"chrome\",\n\t\t\"488\": \"chrome\",\n\t\t\"487\": \"chrome\",\n\t\t\"486\": \"chrome\",\n\t\t\"485\": \"chrome\",\n\t\t\"484\": \"chrome\",\n\t\t\"483\": \"chrome\",\n\t\t\"482\": \"chrome\",\n\t\t\"481\": \"chrome\",\n\t\t\"480\": \"chrome\",\n\t\t\"509\": \"chrome\",\n\t\t\"955\": \"safari\",\n\t\t\"472\": \"chrome\",\n\t\t\"473\": \"chrome\",\n\t\t\"470\": \"chrome\",\n\t\t\"471\": \"chrome\",\n\t\t\"476\": \"chrome\",\n\t\t\"477\": \"chrome\",\n\t\t\"474\": \"chrome\",\n\t\t\"475\": \"chrome\",\n\t\t\"478\": \"chrome\",\n\t\t\"479\": \"chrome\"\n\t}\n}"
  },
  {
    "path": "原创爬虫工具/zok/random_UA/ua_random.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\nimport os\n\nfrom fake_useragent import UserAgent\n\n\nclass RandomUserAgentMiddleware(object):\n    \"\"\"\n    first to use location  because it is the fastest\n    \"\"\"\n\n    def __init__(self):\n        location = os.getcwd() + '/zok/random_UA/fake_useragent.json'\n        self.agent = UserAgent(path=location)  # 调用本地 ua池\n        # self.agent = UserAgent(verify_ssl=False)\n        # self.agent = UserAgent(use_cache_server=False)\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        return cls()\n\n    def process_request(self, request, spider):\n        request.headers.setdefault('User-Agent', self.agent.random)\n\n"
  },
  {
    "path": "原创爬虫工具/zok/repetition/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/repetition/update_cache.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n\nimport redis\nimport hashlib\n\nfrom zok.zok_config import REDIS_PORT, REDIS_DB_NAME, REDIS_HOST, REDIS_USER, REDIS_PASSWORD\n\n\nclass CacheRedis(object):\n\n    pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB_NAME, password=REDIS_PASSWORD, decode_responses=True)\n    r = redis.Redis(connection_pool=pool)\n    # 加上decode_responses=True，写入的键值对中的value为str类型，不加这个参数写入的则为字节类型。\n\n    # 1. 根据储存数据取值判断是否存在\n    # 3. 不存在-已有数据: 需要更新\n    # 4. 不存在-无数据: 需要插入\n    # 5. 存在 直接跳过储存\n\n    # BUG 在redis数据库丢失的情况下【会全体重新录入】\n\n    @staticmethod\n    def get_md5(data):\n        md5 = hashlib.md5(data.encode('utf-8')).hexdigest()\n        return md5\n\n    def redis_exists(self, member, md5):\n        \"\"\"\n        验证hash是否存在， 有返回True，没有返回False\n        :param member: 验证区域集合Key\n        :param md5: 要储存的数据\n        :return: True or False\n        \"\"\"\n        print()\n        if self.r.sismember(member, md5):\n            return True\n        else:\n            return False\n\n    def save_redis(self, member, md5):\n        self.r.sadd(member, md5)\n\n"
  },
  {
    "path": "原创爬虫工具/zok/save/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n"
  },
  {
    "path": "原创爬虫工具/zok/save/to_mysql.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\n\nimport pymysql\n\nfrom zok.zok_config import *\nfrom zok.repetition.update_cache import CacheRedis\n\n\nclass SaveToMysqlBase(object):\n    \"\"\"\n    mysql储存基类\n    新增语法 INSERT INTO 表名(city, county, district) VALUES (\"%s\",\"%s\",\"%s\")\n    更新语法 UPDATE 表名 SET mail = \"playstation.com\" WHERE user_name = \"Peter\"\n    \"\"\"\n    member = None  # 不设置默认不开启 redis去重校验\n    conn = None\n    cursor = None  # 游标对象\n    redis = CacheRedis()\n\n    def open_spider(self, spider):\n        print('开始爬虫，链接数据库')\n        self.conn = pymysql.Connect(\n            host=MYSQL_HOST,\n            port=MYSQL_PORT,\n            user=MYSQL_USER,\n            password=MYSQL_PASSWORD,\n            db=MYSQL_DB_NAME,\n        )\n\n    def process_item(self, item, spider):\n        # 写sql语句 插数据，没有表的话要先在数据库创建\n        sql = self.get_sql(item)\n        if self.member:\n            sql_md5 = self.redis.get_md5(sql)\n            if not self.redis.redis_exists(self.member, sql_md5):\n                # 创建游标对象\n                self.cursor = self.conn.cursor()\n                # 提交事务\n                try:\n                    self.cursor.execute(sql)\n                    self.conn.commit()\n                    self.redis.save_redis(self.member, sql_md5)\n                    # int(conn.insert_id())  # 最新插入行的主键ID，conn.insert_id()一定要在conn.commit()之前，否则会返回0\n                except Exception as e:\n                    print(e)\n                    print('异常回滚')\n                    self.conn.rollback()\n\n                self.cursor.close()\n                return item\n            else:\n                print('已有相同数据无需插入')\n        else:\n            # 创建游标对象\n            self.cursor = self.conn.cursor()\n            # 提交事务\n            try:\n                self.cursor.execute(sql)\n                self.conn.commit()\n            except Exception as e:\n                print(e)\n                print('异常回滚')\n                self.conn.rollback()\n            self.cursor.close()\n            return item\n\n    def close_spider(self, spider):\n        print('爬虫结束, 关闭通道')\n        self.conn.close()\n"
  },
  {
    "path": "原创爬虫工具/zok/zok_config.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\nfrom urllib import parse\n\n\nMONGODB_URL = 'mongodb://localhost:27017'\n\n\nREDIS_HOST = \"localhost\"\nREDIS_USER = \"root\"\nREDIS_PASSWORD = \"\"\nREDIS_DB_NAME = 0\nREDIS_PORT = 6379\n\n\n"
  },
  {
    "path": "滑动验证码/【w3c】滑块验证/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-10  Python: 3.7\n\n"
  },
  {
    "path": "滑动验证码/【w3c】滑块验证/w3c.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-10  Python: 3.7\n\nimport requests\nimport re\nimport json\nfrom PIL import Image  # 图像处理模块\nfrom io import BytesIO  # io 加载\n\n\nclass W3C:\n    \"\"\"\n    滑块验证码识别与破解\n\n    w3c 网站滑块网址 https://www.w3cschool.cn/register\n    \"\"\"\n\n    def __init__(self):\n        self.headers = {\n            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',\n            'Host': 'www.w3cschool.cn'\n        }\n        self.local = 'https://www.w3cschool.cn'\n        self.check = 'https://www.w3cschool.cn/dragcheck'\n        self.session = requests.session()\n        self.height = 58  # 碎片高\n        self.width = 13  # 碎片宽\n\n    def get_img(self):\n        \"\"\"获取页面滑块图片\"\"\"\n        response = self.session.get('https://www.w3cschool.cn/register', headers=self.headers)\n        results = re.findall(r'background-image: url\\(\"(.*?)\"\\);', response.text)\n        bg_img = self.local + results[0]  # 背景图\n        hk_img = self.local + results[1]  # 滑块图\n        # print(bg_img, hk_img)\n        # 取 css\n        css_list = re.findall(r'background-position:(.*?);\">', response.text)\n\n        # 缺口滑块\n        ret = self.session.get(hk_img)\n        with open('hk.png', 'wb') as f:\n            f.write(ret.content)\n\n        # 图片对象\n        img_cha = self.split_img(bg_img, css_list)\n        xy = None  # 识别结果\n        for n in range(4):\n            full_image = Image.open('img/'+str(n)+'.png')\n            # 获取缺口位置\n            xy = self.get_distance(img_cha, full_image)\n            if xy and xy > 0:\n                break\n\n        return xy\n\n    def get_distance(self, bg_image, full_image):\n        \"\"\"\n        计算滑块移动距离\n        :param bg_image: (Image) 有缺口的整图\n        :param full_image: (Image) 完整原图\n        :return: (Int)缺口离滑块的距离\n        \"\"\"\n\n        # 滑块的初始位置\n        distance = 0\n        # 遍历像素点横坐标\n        for i in range(distance, full_image.size[0]):\n            # 遍历像素点纵坐标\n            for j in range(full_image.size[1]):\n                # 如果不是相同像素\n                if not self.is_pixel_equal(bg_image, full_image, i, j):\n                    # 返回此时横轴坐标就是滑块需要移动的距离\n                    return i\n\n    @staticmethod\n    def is_pixel_equal(bg_image, full_image, x, y):\n        \"\"\"\n        判断像素是否相同算法\n        :param bg_image: (Image)缺口图片\n        :param full_image: (Image)完整图片\n        :param x: (Int)位置x\n        :param y: (Int)位置y\n        :return: (Boolean)像素是否相同\n        \"\"\"\n        # 获取缺口图片的像素点(按照RGB格式)\n        bg_pixel = bg_image.load()[x, y]\n        # 获取完整图片的像素点(按照RGB格式)\n        full_pixel = full_image.load()[x, y]\n        # 设置一个判定值，像素值之差超过判定值则认为该像素不相同\n        threshold = 1  # 可根据识别效果调整\n        # 判断像素的各个颜色之差，abs()用于取绝对值\n        if (abs(bg_pixel[0] - full_pixel[0] < threshold) and abs(bg_pixel[1] - full_pixel[1] < threshold) and abs(\n                bg_pixel[2] - full_pixel[2] < threshold)):\n            # 如果差值在判断值之内，返回是相同像素\n            return True\n        else:\n            # 如果差值在判断值之外，返回不是相同像素\n            return False\n\n    def split_img(self, bg_img, css_list):\n        \"\"\"图片还原\"\"\"\n        # 背景\n        ret = self.session.get(bg_img)\n        bytes_io = BytesIO()\n        bytes_io.write(ret.content)\n        img = Image.open(bytes_io)\n        img_cha = Image.open('chache.png')\n        img.save('bg.png')   # 记录一下原始图片\n\n        for index, i in enumerate(css_list):\n            x, y = [abs(int(xy[:-2])) for xy in i.split(' ')]  # 将 css 坐标抽离出来\n            box = [x, y, x + self.width, y + self.height]\n            im_crop = img.crop(box)\n            if index < 20:  # 第一行\n                img_cha.paste(im_crop, (index*self.width, 0))\n            else:  # 第二行\n                img_cha.paste(im_crop, ((index-20)*self.width, self.height))\n        img_cha.save('chache.png')  # 储存\n        return img_cha\n\n    def check_code(self):\n        \"\"\"滑块认证\"\"\"\n        point = self.get_img()\n\n        if point:\n            print('\\033[1;34m识别成功: 缺口位置 x: %s \\033[0m' % point)\n            print('\\033[1;36m提交数据中...\\033[0m')\n            result = self.session.post(self.check, data={'point': point}, headers=self.headers)\n            print(json.loads(result.text).get('message'))\n        else:\n            print('滑块识别失败。。运气不佳。。重试即可。')\n\n\nif __name__ == '__main__':\n    wc = W3C()\n    wc.check_code()\n"
  },
  {
    "path": "滑动验证码/【腾讯】滑块验证/discriminate.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-11  Python: 3.7\n\n\n\"\"\"\npip3 install opencv-python\n\"\"\"\n\nimport cv2 as cv\n\n\ndef get_pos(image):\n    \"\"\"\n    缺口轮廓检测\n    对付腾讯滑块够用\n    该方法识别率 95% 左右\n    \"\"\"\n    blurred = cv.GaussianBlur(image, (5, 5), 0)\n    canny = cv.Canny(blurred, 200, 400)\n    contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\n    for i, contour in enumerate(contours):\n        m = cv.moments(contour)\n        if m['m00'] == 0:\n            cx = cy = 0\n        else:\n            cx, cy = m['m10'] / m['m00'], m['m01'] / m['m00']\n        if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390:\n            if cx < 400:\n                continue\n            x, y, w, h = cv.boundingRect(contour)  # 外接矩形\n            cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)\n            cv.imshow('image', image)\n            return x\n    return 0\n\n\nif __name__ == '__main__':\n    \"\"\"\n    这里是滑块缺口识别\n    识别到后\n    1。可以通过自动化工具取拖动滑块\n    2。可以通过参数解析的形式生成参数提交通过验证\n    \"\"\"\n    img0 = cv.imread('bg.jpeg')\n    get_pos(img0)\n    cv.waitKey(0)\n    cv.destroyAllWindows()\n"
  },
  {
    "path": "滑动验证码/【腾讯】滑块验证/sel.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-10-28  Python: 3.7\n\nimport requests\nimport time\nimport cv2 as cv\nimport random\nfrom selenium.webdriver import ActionChains\nfrom selenium import webdriver\nfrom selenium.webdriver.support.wait import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC  # 显性等待\nfrom selenium.webdriver.common.by import By\n\n\nclass TX:\n    def __init__(self):\n        # 初始化\n        profile = webdriver.FirefoxOptions()  # 配置无头\n        profile.add_argument('-headless')\n        self.browser = webdriver.Firefox()\n        wait = WebDriverWait(self.browser, 10)\n        self.api_url = ''\n\n    def end(self):\n        self.browser.quit()\n\n    def tx_code(self):\n\n        \"\"\"这里需要访问，带有滑动验证码的页面，然后会获取滑块对其进行滑动\"\"\"\n\n        WebDriverWait(self.browser, 20, 0.5).until(EC.presence_of_element_located((By.ID, 'tcaptcha_iframe')))  # 等待 iframe\n        self.browser.switch_to.frame(self.browser.find_element_by_id('tcaptcha_iframe'))  # 加载 iframe\n        time.sleep(0.5)\n        bk_block = self.browser.find_element_by_xpath('//img[@id=\"slideBg\"]').get_attribute('src')\n        print(bk_block)\n        if self.save_img(bk_block):\n            dex = self.get_pos()\n            track_list = self.get_track(dex)\n            time.sleep(0.5)\n            slid_ing = self.browser.find_element_by_xpath('//div[@id=\"tcaptcha_drag_thumb\"]')  # 滑块定位\n            ActionChains(self.browser).click_and_hold(on_element=slid_ing).perform()  # 鼠标按下\n            time.sleep(0.2)\n            print('轨迹', track_list)\n            for track in track_list:\n                ActionChains(self.browser).move_by_offset(xoffset=track, yoffset=0).perform()  # 鼠标移动到距离当前位置（x,y）\n            time.sleep(1)\n            ActionChains(self.browser).release(on_element=slid_ing).perform()  # print('第三步,释放鼠标')\n            time.sleep(1)\n            # 识别图片\n            return True\n        else:\n            print('缺口图片捕获失败')\n            return False\n\n    @staticmethod\n    def save_img(bk_block):\n        \"\"\"保存图片\"\"\"\n        try:\n            img = requests.get(bk_block).content\n            with open('bg.jpeg', 'wb') as f:\n                f.write(img)\n            return True\n        except:\n            return False\n\n    @staticmethod\n    def get_pos():\n        \"\"\"识别缺口\n        注意：网页上显示的图片为缩放图片，缩放 50% 所以识别坐标需要 0.5\n        \"\"\"\n        image = cv.imread('bg.jpeg')\n        blurred = cv.GaussianBlur(image, (5, 5), 0)\n        canny = cv.Canny(blurred, 200, 400)\n        contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)\n        for i, contour in enumerate(contours):\n            m = cv.moments(contour)\n            if m['m00'] == 0:\n                cx = cy = 0\n            else:\n                cx, cy = m['m10'] / m['m00'], m['m01'] / m['m00']\n            if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390:\n                if cx < 400:\n                    continue\n                x, y, w, h = cv.boundingRect(contour)  # 外接矩形\n                cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)\n                # cv.imshow('image', image)  # 显示识别结果\n                print('【缺口识别】 {x}px'.format(x=x/2))\n                return x/2\n        return 0\n\n    @staticmethod\n    def get_track(distance):\n        \"\"\"模拟轨迹\n        \"\"\"\n        distance -= 37  # 初始位置\n        # 初速度\n        v = 0\n        # 单位时间为0.2s来统计轨迹，轨迹即0.2内的位移\n        t = 0.2\n        # 位移/轨迹列表，列表内的一个元素代表0.2s的位移\n        tracks = []\n        # 当前的位移\n        current = 0\n        # 到达mid值开始减速\n        mid = distance * 7 / 8\n\n        distance += 10  # 先滑过一点，最后再反着滑动回来\n        # a = random.randint(1,3)\n        while current < distance:\n            if current < mid:\n                # 加速度越小，单位时间的位移越小,模拟的轨迹就越多越详细\n                a = random.randint(2, 4)  # 加速运动\n            else:\n                a = -random.randint(3, 5)  # 减速运动\n\n            # 初速度\n            v0 = v\n            # 0.2秒时间内的位移\n            s = v0 * t + 0.5 * a * (t ** 2)\n            # 当前的位置\n            current += s\n            # 添加到轨迹列表\n            tracks.append(round(s))\n\n            # 速度已经达到v,该速度作为下次的初速度\n            v = v0 + a * t\n\n        # 反着滑动到大概准确位置\n        for i in range(4):\n            tracks.append(-random.randint(2, 3))\n        for i in range(4):\n            tracks.append(-random.randint(1, 3))\n        return tracks\n\n    def move_to(self, index):\n        \"\"\"滑动滑块\"\"\"\n        pass\n\n    def re_start(self):\n        self.tx_code()\n        self.end()\n\n\nif __name__ == '__main__':\n    \"\"\"\n    请在 tx_code 中访问含有 腾讯滑块的页面，然后会对其自动滑动\n    \"\"\"\n    xbt = TX()\n    xbt.re_start()\n"
  },
  {
    "path": "项目/HouseScrapy/requirements",
    "content": "scrapy\nscrapy-redis\npymysql\nredis>=3.2.1\npymongo"
  },
  {
    "path": "项目/HouseScrapy/scrapy.cfg",
    "content": "# Automatically created by: scrapy startproject\n#\n# For more information about the [deploy] section see:\n# https://scrapyd.readthedocs.io/en/latest/deploy.html\n\n[settings]\ndefault = settings\n\n[deploy]\n#url = http://localhost:6800/\nproject = HouseScrapy\n"
  },
  {
    "path": "项目/HouseScrapy/settings.py",
    "content": "# -*- coding: utf-8 -*-\n\n# 阿布云代理 IP\nPROXY_USER = ''\nPROXY_PASS = ''\n\nBOT_NAME = 'HouseScrapy'\n\nSPIDER_MODULES = ['spiders']\nNEWSPIDER_MODULE = 'spiders'\n\n# 否认协议\nROBOTSTXT_OBEY = False\n\n# 随机延迟\nRANDOMIZE_DOWNLOAD_DELAY = True\n\n# 重试处理\nDOWNLOAD_FAIL_ON_DATALOSS = False\n\n# 设置超时时间\nDOWNLOAD_TIMEOUT = 5\n\n# MongoDB\nMONGODB_URL = 'mongodb://localhost:27017'\nMONGODB_DB = '房产'\nMONGODB_COLL = '地产数据'\n\n\n# Redis\nREDIS_HOST = '127.0.0.1'  # 本机\nREDIS_WORD = None\nREDIS_PORT = 6379\n\n# 限流 秒/次\nDOWNLOAD_DELAY = 1 / 10\n\n# 禁止301\n# HTTPERROR_ALLOWED_CODES = [301]\n\n# 日志配置\n# LOG_LEVEL = 'WARNING'\n# LOG_FILE = 'log/error_log.txt'\n\n\n# Headers\nDEFAULT_REQUEST_HEADERS = {\n    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',\n    'Host': 'www.funi.com'\n}\n\n\n\"\"\"项目独立配置区\"\"\"\n\n# HOST\nHOST = 'http://www.funi.com'\n\n\n\"\"\"===== 分布式配置区 =====\"\"\"\n\n# # 去重，利用set指纹去重\n# DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'\n#\n# # 调度器\n# SCHEDULER = 'scrapy_redis.scheduler.Scheduler'\n#\n# # 去重指纹的set\n# SCHEDULER_PERSIST = True\n#\n# # 配置密码\n# REDIS_PARAMS = {\n#     'password': REDIS_WORD,\n# }\n#\n#"
  },
  {
    "path": "项目/HouseScrapy/spiders/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-15  Python: 3.7\n\n"
  },
  {
    "path": "项目/HouseScrapy/spiders/house.py",
    "content": "# -*- coding: utf-8 -*-\nimport scrapy\n\nfrom settings import HOST\nfrom toolkits.items import HousesItem\n\n\nclass HouseSpider(scrapy.Spider):\n    name = 'house'\n    start_urls = ['http://www.funi.com/loupan/region_0_0_0_0_1']\n    target_url = 'http://www.funi.com/loupan/region_0_0_0_0_{page}'\n\n    custom_settings = {\n        'ITEM_PIPELINES': {\n            'toolkits.pipelines.HousePipeline': 300,\n        },\n        'DOWNLOADER_MIDDLEWARES': {\n            'toolkits.proxies.ProxyMiddleware': 15,  # Proxy\n            'toolkits.make_ua.RandomUserAgentMiddleware': 20,  # random UA\n        },\n    }\n\n    def parse(self, response):\n        \"\"\"取总页数\n        \"\"\"\n        total_page = response.xpath('//*[@class=\"fleft\"]/div[3]/a[9]/text()').extract_first()\n        try:\n            for page in range(1, int(total_page)):\n                url = self.target_url.format(page=page)\n                yield scrapy.Request(url, callback=self.parse_url)\n        except Exception:\n            print('获取页数失败')\n\n    def parse_url(self, response):\n        \"\"\"获取房产链接\n        \"\"\"\n        # 获取并清洗链接\n        a_list = response.xpath('//*[@class=\"fleft\"]/div[2]/dl/dt/a')\n\n        # 访问楼盘\n        for a in a_list:\n            href = a.xpath('./@href').extract_first()\n            title = a.xpath('./@title').extract_first()\n            url = HOST + href[:href.find(';')] if ';' in href else HOST + href\n\n            # 获取基础信息\n            yield scrapy.Request(url + '/detail.htm', callback=self.parse_base, meta={'name': title, 'base_url': url})\n\n    def parse_base(self, response):\n        \"\"\"解析楼盘基础信息\n        \"\"\"\n\n        dls = response.xpath('//*[@class=\"intro\"]/dl')\n\n        if len(dls) == 2:\n            key_base = dls[0].xpath('./dd/ul/li/span/text()').extract()\n            values_base = [node.strip() for node in dls[0].xpath('./dd/ul/li/em/text()').extract()]\n            key_info = dls[1].xpath('./dd/ul/li/span/text()').extract()\n            values_info = dls[1].xpath('./dd/ul/li/em/text()').extract()\n\n            # 数据压缩\n            data = dict(dict(zip(key_base, values_base)), **dict(zip(key_info, values_info)))\n\n            # 提取传输数据\n            data['楼盘名'] = response.meta.get('name')\n            base_url = response.meta.get('base_url')\n\n            # 获取 最新动态\n            yield scrapy.Request(base_url + '/news.htm', callback=self.parse_news,\n                                 meta={'base_url': base_url, 'data': data})\n\n    def parse_news(self, response):\n        \"\"\"解析新闻\n        \"\"\"\n        dls = response.xpath('//*[@class=\"tml_main\"]/dl')\n\n        news = []\n\n        for dl in dls:\n            number = dl.xpath('./dd/div/div[1]/b/i/text()').extract_first()\n            ps = dl.xpath('./dd/div/div[2]/p')\n\n            strong_info = dl.xpath('./dd/div/div[2]/p[1]/em/text()').extract()  # 预售\n            new_info = dl.xpath('./dd/div/div[2]/ul/li/text()').extract()  # 最新动态\n\n            # 组装数据\n            info = {'商品房预售许可证': number}\n\n            # 数组清洗\n            for node in strong_info:  # 预售信息\n                _str = node.split('：')\n                if len(_str) == 2:\n                    info[_str[0]] = _str[1]\n\n            for node in new_info:  # 预售资质\n                _str = node.split('：')\n                if len(_str) == 2:\n                    info[_str[0]] = _str[1]\n\n            for index, p in enumerate(ps):  # 户数\n                n = p.xpath('./text()').extract_first()\n                if index == 1 or not n:\n                    continue\n                _str = n.split('：')\n                if len(_str) == 2:\n                    info[_str[0]] = _str[1]\n\n            news.append(info)\n\n        # 组装数据\n        data = response.meta.get('data')\n        data['最新动态'] = news\n        base_url = response.meta.get('base_url')\n\n        yield scrapy.Request(base_url, callback=self.parse_info, meta={'base_url': base_url, 'data': data})\n\n    def parse_info(self, response):\n        \"\"\"小区基础数据\n        \"\"\"\n        address = response.xpath('//*[@class=\"pro_info\"]/p[2]/i/text()').extract_first()  # 楼盘地址\n        company = response.xpath('//*[@class=\"pro_info\"]/p[3]/i/text()').extract_first()  # 开发商\n        tags = response.xpath('//*[@class=\"pro_info\"]/p[4]/span/text()').extract()  # 标签\n        phone = response.xpath('//*[@class=\"pro_info\"]/p[5]/b/text()').extract_first()  # 售楼部电话\n        open_time = response.xpath('//*[@class=\"pro_info\"]/p[6]/i/text()').extract_first()  # 开盘时间\n        house_type = response.xpath('//*[@class=\"pro_info\"]/p[7]/i/text()').extract_first()  # 建筑类型\n        number = response.xpath('//*[@class=\"pro_info\"]/p[8]/i/text()').extract_first()  # 规划用户\n        expense = response.xpath('//*[@class=\"pro_info\"]/p[8]/i[2]/text()').extract_first()  # 物管费\n        expense = expense.strip() if expense else ''\n        phone = phone.strip() if phone else ''\n\n        data = response.meta.get('data')\n        data['楼盘地址'] = address\n        data['开发商'] = company\n        data['特色'] = tags\n        data['售楼电话'] = phone\n        data['开盘时间'] = open_time\n        data['建筑类型'] = house_type\n        data['规划户数'] = number\n        data['物管费'] = expense\n        data['网址'] = response.meta.get('base_url')\n\n        item = HousesItem()\n        item['data'] = data\n\n        yield item\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-15  Python: 3.7\n\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/fake_useragent.json",
    "content": "{\n\t\"browsers\": {\n\t\t\"chrome\": [\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36\", \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36\", \"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36\", \"Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36\", \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10\", \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36\", \"Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1467.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1500.55 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.90 Safari/537.36\", \"Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36\", \"Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36\", \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15\", \"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14\"],\n\t\t\"opera\": [\"Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16\", \"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14\", \"Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14\", \"Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02\", \"Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00\", \"Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00\", \"Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00\", \"Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00\", \"Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0\", \"Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62\", \"Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62\", \"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52\", \"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52\", \"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51\", \"Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50\", \"Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50\", \"Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11\", \"Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11\", \"Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11\", \"Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10\", \"Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10\", \"Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10\", \"Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1\", \"Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; sv) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; en-US) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.1; U; cs) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 5.1; U;) Presto/2.7.62 Version/11.01\", \"Opera/9.80 (Windows NT 5.1; U; cs) Presto/2.7.62 Version/11.01\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101213 Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01\", \"Mozilla/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01\", \"Mozilla/5.0 (Windows NT 6.1; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.01\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01\", \"Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.6.37 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; ko) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; fi) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1; U; en-GB) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.1 x64; U; en) Presto/2.7.62 Version/11.00\", \"Opera/9.80 (Windows NT 6.0; U; en) Presto/2.7.39 Version/11.00\"],\n\t\t\"firefox\": [\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1\", \"Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0\", \"Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0\", \"Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0\", \"Mozilla/5.0 (X11; Linux x86_64; rv:28.0) Gecko/20100101  Firefox/28.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:27.3) Gecko/20130101 Firefox/27.3\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:27.0) Gecko/20121011 Firefox/27.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0\", \"Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0\", \"Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/23.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0\", \"Mozilla/5.0 (Windows NT 6.2; rv:22.0) Gecko/20130405 Firefox/22.0\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0\", \"Mozilla/5.0 (Microsoft Windows NT 6.2.9200.0); rv:22.0) Gecko/20130405 Firefox/22.0\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1\", \"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/21.0.1\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:21.0.0) Gecko/20121011 Firefox/21.0.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20130331 Firefox/21.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20130514 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.2; rv:21.0) Gecko/20130326 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130401 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130331 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20130330 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130328 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130401 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20130331 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.1; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0\", \"Mozilla/5.0 (Windows NT 6.2; Win64; x64;) Gecko/20100101 Firefox/20.0\", \"Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/19.0\", \"Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/18.0.1\", \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0)  Gecko/20100101 Firefox/18.0\", \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0.6\"],\n\t\t\"internetexplorer\": [\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko\", \"Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0;  rv:11.0) like Gecko\", \"Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)\", \"Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)\", \"Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)\", \"Mozilla/4.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)\", \"Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)\", \"Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))\", \"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; chromeframe/12.0.742.112)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; FunWebProducts)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/13.0.782.215)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; chromeframe/11.0.696.57)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0) chromeframe/10.0.648.205\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.1; SV1; .NET CLR 2.8.52393; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)\", \"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0; GTB7.4; InfoPath.3; SV1; .NET CLR 3.1.76908; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; SLCC1; .NET CLR 1.1.4322)\", \"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 3.0.04506.30)\", \"Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.0; Trident/4.0; FBSMTWB; .NET CLR 2.0.34861; .NET CLR 3.0.3746.3218; .NET CLR 3.5.33652; msn OptimizedIE8;ENUS)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.2; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; Media Center PC 6.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.3; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MS-RTC LM 8)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)\", \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)\"],\n\t\t\"safari\": [\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A\", \"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2\", \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10\", \"Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ko-KR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; fr-FR) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; cs-CZ) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10_5_8; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; zh-cn) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; sv-se) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ko-kr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; it-it) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; es-es) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-gb) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; de-de) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; hu-HU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; de-DE) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; it-IT) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/534.16+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-ch) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15+ (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Android 2.2; Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-HK) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; tr-TR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; nb-NO) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 6.0; fr-FR) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\", \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; zh-cn) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5\"]\n\t},\n\t\"randomize\": {\n\t\t\"344\": \"chrome\",\n\t\t\"819\": \"firefox\",\n\t\t\"346\": \"chrome\",\n\t\t\"347\": \"chrome\",\n\t\t\"340\": \"chrome\",\n\t\t\"341\": \"chrome\",\n\t\t\"342\": \"chrome\",\n\t\t\"343\": \"chrome\",\n\t\t\"810\": \"internetexplorer\",\n\t\t\"811\": \"internetexplorer\",\n\t\t\"812\": \"internetexplorer\",\n\t\t\"813\": \"firefox\",\n\t\t\"348\": \"chrome\",\n\t\t\"349\": \"chrome\",\n\t\t\"816\": \"firefox\",\n\t\t\"817\": \"firefox\",\n\t\t\"737\": \"chrome\",\n\t\t\"719\": \"chrome\",\n\t\t\"718\": \"chrome\",\n\t\t\"717\": \"chrome\",\n\t\t\"716\": \"chrome\",\n\t\t\"715\": \"chrome\",\n\t\t\"714\": \"chrome\",\n\t\t\"713\": \"chrome\",\n\t\t\"712\": \"chrome\",\n\t\t\"711\": \"chrome\",\n\t\t\"710\": \"chrome\",\n\t\t\"421\": \"chrome\",\n\t\t\"129\": \"chrome\",\n\t\t\"420\": \"chrome\",\n\t\t\"423\": \"chrome\",\n\t\t\"422\": \"chrome\",\n\t\t\"425\": \"chrome\",\n\t\t\"619\": \"chrome\",\n\t\t\"424\": \"chrome\",\n\t\t\"427\": \"chrome\",\n\t\t\"298\": \"chrome\",\n\t\t\"299\": \"chrome\",\n\t\t\"296\": \"chrome\",\n\t\t\"297\": \"chrome\",\n\t\t\"294\": \"chrome\",\n\t\t\"295\": \"chrome\",\n\t\t\"292\": \"chrome\",\n\t\t\"293\": \"chrome\",\n\t\t\"290\": \"chrome\",\n\t\t\"291\": \"chrome\",\n\t\t\"591\": \"chrome\",\n\t\t\"590\": \"chrome\",\n\t\t\"593\": \"chrome\",\n\t\t\"592\": \"chrome\",\n\t\t\"595\": \"chrome\",\n\t\t\"594\": \"chrome\",\n\t\t\"597\": \"chrome\",\n\t\t\"596\": \"chrome\",\n\t\t\"195\": \"chrome\",\n\t\t\"194\": \"chrome\",\n\t\t\"197\": \"chrome\",\n\t\t\"196\": \"chrome\",\n\t\t\"191\": \"chrome\",\n\t\t\"190\": \"chrome\",\n\t\t\"193\": \"chrome\",\n\t\t\"192\": \"chrome\",\n\t\t\"270\": \"chrome\",\n\t\t\"271\": \"chrome\",\n\t\t\"272\": \"chrome\",\n\t\t\"273\": \"chrome\",\n\t\t\"274\": \"chrome\",\n\t\t\"275\": \"chrome\",\n\t\t\"276\": \"chrome\",\n\t\t\"277\": \"chrome\",\n\t\t\"278\": \"chrome\",\n\t\t\"279\": \"chrome\",\n\t\t\"569\": \"chrome\",\n\t\t\"497\": \"chrome\",\n\t\t\"524\": \"chrome\",\n\t\t\"525\": \"chrome\",\n\t\t\"526\": \"chrome\",\n\t\t\"527\": \"chrome\",\n\t\t\"520\": \"chrome\",\n\t\t\"521\": \"chrome\",\n\t\t\"522\": \"chrome\",\n\t\t\"523\": \"chrome\",\n\t\t\"528\": \"chrome\",\n\t\t\"529\": \"chrome\",\n\t\t\"449\": \"chrome\",\n\t\t\"448\": \"chrome\",\n\t\t\"345\": \"chrome\",\n\t\t\"443\": \"chrome\",\n\t\t\"442\": \"chrome\",\n\t\t\"441\": \"chrome\",\n\t\t\"440\": \"chrome\",\n\t\t\"447\": \"chrome\",\n\t\t\"446\": \"chrome\",\n\t\t\"445\": \"chrome\",\n\t\t\"444\": \"chrome\",\n\t\t\"47\": \"chrome\",\n\t\t\"108\": \"chrome\",\n\t\t\"109\": \"chrome\",\n\t\t\"102\": \"chrome\",\n\t\t\"103\": \"chrome\",\n\t\t\"100\": \"chrome\",\n\t\t\"101\": \"chrome\",\n\t\t\"106\": \"chrome\",\n\t\t\"107\": \"chrome\",\n\t\t\"104\": \"chrome\",\n\t\t\"105\": \"chrome\",\n\t\t\"902\": \"firefox\",\n\t\t\"903\": \"firefox\",\n\t\t\"39\": \"chrome\",\n\t\t\"38\": \"chrome\",\n\t\t\"906\": \"firefox\",\n\t\t\"907\": \"firefox\",\n\t\t\"904\": \"firefox\",\n\t\t\"905\": \"firefox\",\n\t\t\"33\": \"chrome\",\n\t\t\"32\": \"chrome\",\n\t\t\"31\": \"chrome\",\n\t\t\"30\": \"chrome\",\n\t\t\"37\": \"chrome\",\n\t\t\"36\": \"chrome\",\n\t\t\"35\": \"chrome\",\n\t\t\"34\": \"chrome\",\n\t\t\"641\": \"chrome\",\n\t\t\"640\": \"chrome\",\n\t\t\"643\": \"chrome\",\n\t\t\"642\": \"chrome\",\n\t\t\"645\": \"chrome\",\n\t\t\"644\": \"chrome\",\n\t\t\"438\": \"chrome\",\n\t\t\"439\": \"chrome\",\n\t\t\"436\": \"chrome\",\n\t\t\"437\": \"chrome\",\n\t\t\"434\": \"chrome\",\n\t\t\"435\": \"chrome\",\n\t\t\"432\": \"chrome\",\n\t\t\"433\": \"chrome\",\n\t\t\"430\": \"chrome\",\n\t\t\"431\": \"chrome\",\n\t\t\"826\": \"firefox\",\n\t\t\"339\": \"chrome\",\n\t\t\"338\": \"chrome\",\n\t\t\"335\": \"chrome\",\n\t\t\"334\": \"chrome\",\n\t\t\"337\": \"chrome\",\n\t\t\"336\": \"chrome\",\n\t\t\"331\": \"chrome\",\n\t\t\"330\": \"chrome\",\n\t\t\"333\": \"chrome\",\n\t\t\"332\": \"chrome\",\n\t\t\"559\": \"chrome\",\n\t\t\"745\": \"chrome\",\n\t\t\"854\": \"firefox\",\n\t\t\"818\": \"firefox\",\n\t\t\"856\": \"firefox\",\n\t\t\"857\": \"firefox\",\n\t\t\"850\": \"firefox\",\n\t\t\"851\": \"firefox\",\n\t\t\"852\": \"firefox\",\n\t\t\"0\": \"chrome\",\n\t\t\"858\": \"firefox\",\n\t\t\"859\": \"firefox\",\n\t\t\"748\": \"chrome\",\n\t\t\"6\": \"chrome\",\n\t\t\"43\": \"chrome\",\n\t\t\"99\": \"chrome\",\n\t\t\"98\": \"chrome\",\n\t\t\"91\": \"chrome\",\n\t\t\"90\": \"chrome\",\n\t\t\"93\": \"chrome\",\n\t\t\"92\": \"chrome\",\n\t\t\"95\": \"chrome\",\n\t\t\"94\": \"chrome\",\n\t\t\"97\": \"chrome\",\n\t\t\"96\": \"chrome\",\n\t\t\"814\": \"firefox\",\n\t\t\"815\": \"firefox\",\n\t\t\"153\": \"chrome\",\n\t\t\"740\": \"chrome\",\n\t\t\"741\": \"chrome\",\n\t\t\"742\": \"chrome\",\n\t\t\"743\": \"chrome\",\n\t\t\"744\": \"chrome\",\n\t\t\"558\": \"chrome\",\n\t\t\"746\": \"chrome\",\n\t\t\"747\": \"chrome\",\n\t\t\"555\": \"chrome\",\n\t\t\"554\": \"chrome\",\n\t\t\"557\": \"chrome\",\n\t\t\"556\": \"chrome\",\n\t\t\"551\": \"chrome\",\n\t\t\"550\": \"chrome\",\n\t\t\"553\": \"chrome\",\n\t\t\"552\": \"chrome\",\n\t\t\"238\": \"chrome\",\n\t\t\"239\": \"chrome\",\n\t\t\"234\": \"chrome\",\n\t\t\"235\": \"chrome\",\n\t\t\"236\": \"chrome\",\n\t\t\"237\": \"chrome\",\n\t\t\"230\": \"chrome\",\n\t\t\"231\": \"chrome\",\n\t\t\"232\": \"chrome\",\n\t\t\"233\": \"chrome\",\n\t\t\"1\": \"chrome\",\n\t\t\"155\": \"chrome\",\n\t\t\"146\": \"chrome\",\n\t\t\"147\": \"chrome\",\n\t\t\"618\": \"chrome\",\n\t\t\"145\": \"chrome\",\n\t\t\"142\": \"chrome\",\n\t\t\"143\": \"chrome\",\n\t\t\"140\": \"chrome\",\n\t\t\"141\": \"chrome\",\n\t\t\"612\": \"chrome\",\n\t\t\"613\": \"chrome\",\n\t\t\"610\": \"chrome\",\n\t\t\"611\": \"chrome\",\n\t\t\"616\": \"chrome\",\n\t\t\"617\": \"chrome\",\n\t\t\"148\": \"chrome\",\n\t\t\"149\": \"chrome\",\n\t\t\"46\": \"chrome\",\n\t\t\"154\": \"chrome\",\n\t\t\"948\": \"safari\",\n\t\t\"949\": \"safari\",\n\t\t\"946\": \"safari\",\n\t\t\"947\": \"safari\",\n\t\t\"944\": \"safari\",\n\t\t\"945\": \"safari\",\n\t\t\"942\": \"safari\",\n\t\t\"943\": \"safari\",\n\t\t\"940\": \"safari\",\n\t\t\"941\": \"safari\",\n\t\t\"689\": \"chrome\",\n\t\t\"688\": \"chrome\",\n\t\t\"685\": \"chrome\",\n\t\t\"684\": \"chrome\",\n\t\t\"687\": \"chrome\",\n\t\t\"686\": \"chrome\",\n\t\t\"681\": \"chrome\",\n\t\t\"680\": \"chrome\",\n\t\t\"683\": \"chrome\",\n\t\t\"682\": \"chrome\",\n\t\t\"458\": \"chrome\",\n\t\t\"459\": \"chrome\",\n\t\t\"133\": \"chrome\",\n\t\t\"132\": \"chrome\",\n\t\t\"131\": \"chrome\",\n\t\t\"130\": \"chrome\",\n\t\t\"137\": \"chrome\",\n\t\t\"136\": \"chrome\",\n\t\t\"135\": \"chrome\",\n\t\t\"134\": \"chrome\",\n\t\t\"494\": \"chrome\",\n\t\t\"495\": \"chrome\",\n\t\t\"139\": \"chrome\",\n\t\t\"138\": \"chrome\",\n\t\t\"490\": \"chrome\",\n\t\t\"491\": \"chrome\",\n\t\t\"492\": \"chrome\",\n\t\t\"493\": \"chrome\",\n\t\t\"24\": \"chrome\",\n\t\t\"25\": \"chrome\",\n\t\t\"26\": \"chrome\",\n\t\t\"27\": \"chrome\",\n\t\t\"20\": \"chrome\",\n\t\t\"21\": \"chrome\",\n\t\t\"22\": \"chrome\",\n\t\t\"23\": \"chrome\",\n\t\t\"28\": \"chrome\",\n\t\t\"29\": \"chrome\",\n\t\t\"820\": \"firefox\",\n\t\t\"407\": \"chrome\",\n\t\t\"406\": \"chrome\",\n\t\t\"405\": \"chrome\",\n\t\t\"404\": \"chrome\",\n\t\t\"403\": \"chrome\",\n\t\t\"402\": \"chrome\",\n\t\t\"401\": \"chrome\",\n\t\t\"400\": \"chrome\",\n\t\t\"933\": \"firefox\",\n\t\t\"932\": \"firefox\",\n\t\t\"931\": \"firefox\",\n\t\t\"930\": \"firefox\",\n\t\t\"937\": \"safari\",\n\t\t\"452\": \"chrome\",\n\t\t\"409\": \"chrome\",\n\t\t\"408\": \"chrome\",\n\t\t\"453\": \"chrome\",\n\t\t\"414\": \"chrome\",\n\t\t\"183\": \"chrome\",\n\t\t\"415\": \"chrome\",\n\t\t\"379\": \"chrome\",\n\t\t\"378\": \"chrome\",\n\t\t\"228\": \"chrome\",\n\t\t\"829\": \"firefox\",\n\t\t\"828\": \"firefox\",\n\t\t\"371\": \"chrome\",\n\t\t\"370\": \"chrome\",\n\t\t\"373\": \"chrome\",\n\t\t\"372\": \"chrome\",\n\t\t\"375\": \"chrome\",\n\t\t\"374\": \"chrome\",\n\t\t\"377\": \"chrome\",\n\t\t\"376\": \"chrome\",\n\t\t\"708\": \"chrome\",\n\t\t\"709\": \"chrome\",\n\t\t\"704\": \"chrome\",\n\t\t\"705\": \"chrome\",\n\t\t\"706\": \"chrome\",\n\t\t\"707\": \"chrome\",\n\t\t\"700\": \"chrome\",\n\t\t\"144\": \"chrome\",\n\t\t\"702\": \"chrome\",\n\t\t\"703\": \"chrome\",\n\t\t\"393\": \"chrome\",\n\t\t\"392\": \"chrome\",\n\t\t\"88\": \"chrome\",\n\t\t\"89\": \"chrome\",\n\t\t\"397\": \"chrome\",\n\t\t\"396\": \"chrome\",\n\t\t\"395\": \"chrome\",\n\t\t\"394\": \"chrome\",\n\t\t\"82\": \"chrome\",\n\t\t\"83\": \"chrome\",\n\t\t\"80\": \"chrome\",\n\t\t\"81\": \"chrome\",\n\t\t\"86\": \"chrome\",\n\t\t\"87\": \"chrome\",\n\t\t\"84\": \"chrome\",\n\t\t\"85\": \"chrome\",\n\t\t\"797\": \"internetexplorer\",\n\t\t\"796\": \"internetexplorer\",\n\t\t\"795\": \"internetexplorer\",\n\t\t\"794\": \"internetexplorer\",\n\t\t\"793\": \"internetexplorer\",\n\t\t\"792\": \"internetexplorer\",\n\t\t\"791\": \"internetexplorer\",\n\t\t\"790\": \"internetexplorer\",\n\t\t\"749\": \"chrome\",\n\t\t\"799\": \"internetexplorer\",\n\t\t\"798\": \"internetexplorer\",\n\t\t\"7\": \"chrome\",\n\t\t\"170\": \"chrome\",\n\t\t\"586\": \"chrome\",\n\t\t\"587\": \"chrome\",\n\t\t\"584\": \"chrome\",\n\t\t\"585\": \"chrome\",\n\t\t\"582\": \"chrome\",\n\t\t\"583\": \"chrome\",\n\t\t\"580\": \"chrome\",\n\t\t\"581\": \"chrome\",\n\t\t\"588\": \"chrome\",\n\t\t\"589\": \"chrome\",\n\t\t\"245\": \"chrome\",\n\t\t\"244\": \"chrome\",\n\t\t\"247\": \"chrome\",\n\t\t\"246\": \"chrome\",\n\t\t\"241\": \"chrome\",\n\t\t\"614\": \"chrome\",\n\t\t\"243\": \"chrome\",\n\t\t\"242\": \"chrome\",\n\t\t\"615\": \"chrome\",\n\t\t\"249\": \"chrome\",\n\t\t\"248\": \"chrome\",\n\t\t\"418\": \"chrome\",\n\t\t\"419\": \"chrome\",\n\t\t\"519\": \"chrome\",\n\t\t\"518\": \"chrome\",\n\t\t\"511\": \"chrome\",\n\t\t\"510\": \"chrome\",\n\t\t\"513\": \"chrome\",\n\t\t\"512\": \"chrome\",\n\t\t\"515\": \"chrome\",\n\t\t\"514\": \"chrome\",\n\t\t\"517\": \"chrome\",\n\t\t\"516\": \"chrome\",\n\t\t\"623\": \"chrome\",\n\t\t\"622\": \"chrome\",\n\t\t\"621\": \"chrome\",\n\t\t\"620\": \"chrome\",\n\t\t\"627\": \"chrome\",\n\t\t\"626\": \"chrome\",\n\t\t\"625\": \"chrome\",\n\t\t\"624\": \"chrome\",\n\t\t\"450\": \"chrome\",\n\t\t\"451\": \"chrome\",\n\t\t\"629\": \"chrome\",\n\t\t\"628\": \"chrome\",\n\t\t\"454\": \"chrome\",\n\t\t\"455\": \"chrome\",\n\t\t\"456\": \"chrome\",\n\t\t\"457\": \"chrome\",\n\t\t\"179\": \"chrome\",\n\t\t\"178\": \"chrome\",\n\t\t\"177\": \"chrome\",\n\t\t\"199\": \"chrome\",\n\t\t\"175\": \"chrome\",\n\t\t\"174\": \"chrome\",\n\t\t\"173\": \"chrome\",\n\t\t\"172\": \"chrome\",\n\t\t\"171\": \"chrome\",\n\t\t\"198\": \"chrome\",\n\t\t\"977\": \"opera\",\n\t\t\"182\": \"chrome\",\n\t\t\"975\": \"opera\",\n\t\t\"974\": \"opera\",\n\t\t\"973\": \"opera\",\n\t\t\"972\": \"opera\",\n\t\t\"971\": \"opera\",\n\t\t\"970\": \"opera\",\n\t\t\"180\": \"chrome\",\n\t\t\"979\": \"opera\",\n\t\t\"978\": \"opera\",\n\t\t\"656\": \"chrome\",\n\t\t\"599\": \"chrome\",\n\t\t\"654\": \"chrome\",\n\t\t\"181\": \"chrome\",\n\t\t\"186\": \"chrome\",\n\t\t\"187\": \"chrome\",\n\t\t\"184\": \"chrome\",\n\t\t\"185\": \"chrome\",\n\t\t\"652\": \"chrome\",\n\t\t\"188\": \"chrome\",\n\t\t\"189\": \"chrome\",\n\t\t\"658\": \"chrome\",\n\t\t\"653\": \"chrome\",\n\t\t\"650\": \"chrome\",\n\t\t\"651\": \"chrome\",\n\t\t\"11\": \"chrome\",\n\t\t\"10\": \"chrome\",\n\t\t\"13\": \"chrome\",\n\t\t\"12\": \"chrome\",\n\t\t\"15\": \"chrome\",\n\t\t\"14\": \"chrome\",\n\t\t\"17\": \"chrome\",\n\t\t\"16\": \"chrome\",\n\t\t\"19\": \"chrome\",\n\t\t\"18\": \"chrome\",\n\t\t\"863\": \"firefox\",\n\t\t\"862\": \"firefox\",\n\t\t\"865\": \"firefox\",\n\t\t\"864\": \"firefox\",\n\t\t\"867\": \"firefox\",\n\t\t\"866\": \"firefox\",\n\t\t\"354\": \"chrome\",\n\t\t\"659\": \"chrome\",\n\t\t\"44\": \"chrome\",\n\t\t\"883\": \"firefox\",\n\t\t\"882\": \"firefox\",\n\t\t\"881\": \"firefox\",\n\t\t\"880\": \"firefox\",\n\t\t\"887\": \"firefox\",\n\t\t\"886\": \"firefox\",\n\t\t\"885\": \"firefox\",\n\t\t\"884\": \"firefox\",\n\t\t\"889\": \"firefox\",\n\t\t\"888\": \"firefox\",\n\t\t\"116\": \"chrome\",\n\t\t\"45\": \"chrome\",\n\t\t\"657\": \"chrome\",\n\t\t\"355\": \"chrome\",\n\t\t\"322\": \"chrome\",\n\t\t\"323\": \"chrome\",\n\t\t\"320\": \"chrome\",\n\t\t\"321\": \"chrome\",\n\t\t\"326\": \"chrome\",\n\t\t\"327\": \"chrome\",\n\t\t\"324\": \"chrome\",\n\t\t\"325\": \"chrome\",\n\t\t\"328\": \"chrome\",\n\t\t\"329\": \"chrome\",\n\t\t\"562\": \"chrome\",\n\t\t\"201\": \"chrome\",\n\t\t\"200\": \"chrome\",\n\t\t\"203\": \"chrome\",\n\t\t\"202\": \"chrome\",\n\t\t\"205\": \"chrome\",\n\t\t\"204\": \"chrome\",\n\t\t\"207\": \"chrome\",\n\t\t\"206\": \"chrome\",\n\t\t\"209\": \"chrome\",\n\t\t\"208\": \"chrome\",\n\t\t\"779\": \"internetexplorer\",\n\t\t\"778\": \"internetexplorer\",\n\t\t\"77\": \"chrome\",\n\t\t\"76\": \"chrome\",\n\t\t\"75\": \"chrome\",\n\t\t\"74\": \"chrome\",\n\t\t\"73\": \"chrome\",\n\t\t\"72\": \"chrome\",\n\t\t\"71\": \"chrome\",\n\t\t\"70\": \"chrome\",\n\t\t\"655\": \"chrome\",\n\t\t\"567\": \"chrome\",\n\t\t\"79\": \"chrome\",\n\t\t\"78\": \"chrome\",\n\t\t\"359\": \"chrome\",\n\t\t\"358\": \"chrome\",\n\t\t\"669\": \"chrome\",\n\t\t\"668\": \"chrome\",\n\t\t\"667\": \"chrome\",\n\t\t\"666\": \"chrome\",\n\t\t\"665\": \"chrome\",\n\t\t\"664\": \"chrome\",\n\t\t\"663\": \"chrome\",\n\t\t\"662\": \"chrome\",\n\t\t\"661\": \"chrome\",\n\t\t\"660\": \"chrome\",\n\t\t\"215\": \"chrome\",\n\t\t\"692\": \"chrome\",\n\t\t\"693\": \"chrome\",\n\t\t\"690\": \"chrome\",\n\t\t\"691\": \"chrome\",\n\t\t\"696\": \"chrome\",\n\t\t\"697\": \"chrome\",\n\t\t\"694\": \"chrome\",\n\t\t\"695\": \"chrome\",\n\t\t\"698\": \"chrome\",\n\t\t\"699\": \"chrome\",\n\t\t\"542\": \"chrome\",\n\t\t\"543\": \"chrome\",\n\t\t\"540\": \"chrome\",\n\t\t\"541\": \"chrome\",\n\t\t\"546\": \"chrome\",\n\t\t\"547\": \"chrome\",\n\t\t\"544\": \"chrome\",\n\t\t\"545\": \"chrome\",\n\t\t\"8\": \"chrome\",\n\t\t\"548\": \"chrome\",\n\t\t\"549\": \"chrome\",\n\t\t\"598\": \"chrome\",\n\t\t\"869\": \"firefox\",\n\t\t\"868\": \"firefox\",\n\t\t\"120\": \"chrome\",\n\t\t\"121\": \"chrome\",\n\t\t\"122\": \"chrome\",\n\t\t\"123\": \"chrome\",\n\t\t\"124\": \"chrome\",\n\t\t\"125\": \"chrome\",\n\t\t\"126\": \"chrome\",\n\t\t\"127\": \"chrome\",\n\t\t\"128\": \"chrome\",\n\t\t\"2\": \"chrome\",\n\t\t\"219\": \"chrome\",\n\t\t\"176\": \"chrome\",\n\t\t\"214\": \"chrome\",\n\t\t\"563\": \"chrome\",\n\t\t\"928\": \"firefox\",\n\t\t\"929\": \"firefox\",\n\t\t\"416\": \"chrome\",\n\t\t\"417\": \"chrome\",\n\t\t\"410\": \"chrome\",\n\t\t\"411\": \"chrome\",\n\t\t\"412\": \"chrome\",\n\t\t\"413\": \"chrome\",\n\t\t\"920\": \"firefox\",\n\t\t\"498\": \"chrome\",\n\t\t\"922\": \"firefox\",\n\t\t\"923\": \"firefox\",\n\t\t\"924\": \"firefox\",\n\t\t\"925\": \"firefox\",\n\t\t\"926\": \"firefox\",\n\t\t\"927\": \"firefox\",\n\t\t\"319\": \"chrome\",\n\t\t\"318\": \"chrome\",\n\t\t\"313\": \"chrome\",\n\t\t\"312\": \"chrome\",\n\t\t\"311\": \"chrome\",\n\t\t\"310\": \"chrome\",\n\t\t\"317\": \"chrome\",\n\t\t\"316\": \"chrome\",\n\t\t\"315\": \"chrome\",\n\t\t\"314\": \"chrome\",\n\t\t\"921\": \"firefox\",\n\t\t\"496\": \"chrome\",\n\t\t\"832\": \"firefox\",\n\t\t\"833\": \"firefox\",\n\t\t\"830\": \"firefox\",\n\t\t\"831\": \"firefox\",\n\t\t\"836\": \"firefox\",\n\t\t\"837\": \"firefox\",\n\t\t\"834\": \"firefox\",\n\t\t\"835\": \"firefox\",\n\t\t\"838\": \"firefox\",\n\t\t\"839\": \"firefox\",\n\t\t\"3\": \"chrome\",\n\t\t\"368\": \"chrome\",\n\t\t\"369\": \"chrome\",\n\t\t\"366\": \"chrome\",\n\t\t\"367\": \"chrome\",\n\t\t\"364\": \"chrome\",\n\t\t\"365\": \"chrome\",\n\t\t\"362\": \"chrome\",\n\t\t\"363\": \"chrome\",\n\t\t\"360\": \"chrome\",\n\t\t\"361\": \"chrome\",\n\t\t\"218\": \"chrome\",\n\t\t\"380\": \"chrome\",\n\t\t\"861\": \"firefox\",\n\t\t\"382\": \"chrome\",\n\t\t\"383\": \"chrome\",\n\t\t\"384\": \"chrome\",\n\t\t\"385\": \"chrome\",\n\t\t\"386\": \"chrome\",\n\t\t\"387\": \"chrome\",\n\t\t\"388\": \"chrome\",\n\t\t\"389\": \"chrome\",\n\t\t\"784\": \"internetexplorer\",\n\t\t\"785\": \"internetexplorer\",\n\t\t\"786\": \"internetexplorer\",\n\t\t\"787\": \"internetexplorer\",\n\t\t\"780\": \"internetexplorer\",\n\t\t\"781\": \"internetexplorer\",\n\t\t\"782\": \"internetexplorer\",\n\t\t\"381\": \"chrome\",\n\t\t\"788\": \"internetexplorer\",\n\t\t\"789\": \"internetexplorer\",\n\t\t\"860\": \"firefox\",\n\t\t\"151\": \"chrome\",\n\t\t\"579\": \"chrome\",\n\t\t\"578\": \"chrome\",\n\t\t\"150\": \"chrome\",\n\t\t\"573\": \"chrome\",\n\t\t\"572\": \"chrome\",\n\t\t\"571\": \"chrome\",\n\t\t\"570\": \"chrome\",\n\t\t\"577\": \"chrome\",\n\t\t\"576\": \"chrome\",\n\t\t\"575\": \"chrome\",\n\t\t\"574\": \"chrome\",\n\t\t\"60\": \"chrome\",\n\t\t\"61\": \"chrome\",\n\t\t\"62\": \"chrome\",\n\t\t\"259\": \"chrome\",\n\t\t\"64\": \"chrome\",\n\t\t\"65\": \"chrome\",\n\t\t\"66\": \"chrome\",\n\t\t\"67\": \"chrome\",\n\t\t\"68\": \"chrome\",\n\t\t\"253\": \"chrome\",\n\t\t\"250\": \"chrome\",\n\t\t\"251\": \"chrome\",\n\t\t\"256\": \"chrome\",\n\t\t\"257\": \"chrome\",\n\t\t\"254\": \"chrome\",\n\t\t\"255\": \"chrome\",\n\t\t\"499\": \"chrome\",\n\t\t\"157\": \"chrome\",\n\t\t\"156\": \"chrome\",\n\t\t\"939\": \"safari\",\n\t\t\"731\": \"chrome\",\n\t\t\"730\": \"chrome\",\n\t\t\"733\": \"chrome\",\n\t\t\"938\": \"safari\",\n\t\t\"735\": \"chrome\",\n\t\t\"734\": \"chrome\",\n\t\t\"508\": \"chrome\",\n\t\t\"736\": \"chrome\",\n\t\t\"506\": \"chrome\",\n\t\t\"738\": \"chrome\",\n\t\t\"504\": \"chrome\",\n\t\t\"505\": \"chrome\",\n\t\t\"502\": \"chrome\",\n\t\t\"503\": \"chrome\",\n\t\t\"500\": \"chrome\",\n\t\t\"501\": \"chrome\",\n\t\t\"630\": \"chrome\",\n\t\t\"631\": \"chrome\",\n\t\t\"632\": \"chrome\",\n\t\t\"633\": \"chrome\",\n\t\t\"469\": \"chrome\",\n\t\t\"468\": \"chrome\",\n\t\t\"636\": \"chrome\",\n\t\t\"637\": \"chrome\",\n\t\t\"465\": \"chrome\",\n\t\t\"464\": \"chrome\",\n\t\t\"467\": \"chrome\",\n\t\t\"466\": \"chrome\",\n\t\t\"461\": \"chrome\",\n\t\t\"900\": \"firefox\",\n\t\t\"463\": \"chrome\",\n\t\t\"462\": \"chrome\",\n\t\t\"901\": \"firefox\",\n\t\t\"168\": \"chrome\",\n\t\t\"169\": \"chrome\",\n\t\t\"164\": \"chrome\",\n\t\t\"165\": \"chrome\",\n\t\t\"166\": \"chrome\",\n\t\t\"167\": \"chrome\",\n\t\t\"160\": \"chrome\",\n\t\t\"161\": \"chrome\",\n\t\t\"162\": \"chrome\",\n\t\t\"163\": \"chrome\",\n\t\t\"964\": \"safari\",\n\t\t\"965\": \"safari\",\n\t\t\"966\": \"safari\",\n\t\t\"967\": \"safari\",\n\t\t\"960\": \"safari\",\n\t\t\"961\": \"safari\",\n\t\t\"962\": \"safari\",\n\t\t\"963\": \"safari\",\n\t\t\"783\": \"internetexplorer\",\n\t\t\"968\": \"safari\",\n\t\t\"969\": \"opera\",\n\t\t\"936\": \"firefox\",\n\t\t\"935\": \"firefox\",\n\t\t\"934\": \"firefox\",\n\t\t\"908\": \"firefox\",\n\t\t\"909\": \"firefox\",\n\t\t\"722\": \"chrome\",\n\t\t\"426\": \"chrome\",\n\t\t\"878\": \"firefox\",\n\t\t\"879\": \"firefox\",\n\t\t\"876\": \"firefox\",\n\t\t\"877\": \"firefox\",\n\t\t\"874\": \"firefox\",\n\t\t\"875\": \"firefox\",\n\t\t\"872\": \"firefox\",\n\t\t\"873\": \"firefox\",\n\t\t\"870\": \"firefox\",\n\t\t\"871\": \"firefox\",\n\t\t\"9\": \"chrome\",\n\t\t\"890\": \"firefox\",\n\t\t\"891\": \"firefox\",\n\t\t\"892\": \"firefox\",\n\t\t\"893\": \"firefox\",\n\t\t\"894\": \"firefox\",\n\t\t\"647\": \"chrome\",\n\t\t\"896\": \"firefox\",\n\t\t\"897\": \"firefox\",\n\t\t\"898\": \"firefox\",\n\t\t\"899\": \"firefox\",\n\t\t\"646\": \"chrome\",\n\t\t\"649\": \"chrome\",\n\t\t\"648\": \"chrome\",\n\t\t\"357\": \"chrome\",\n\t\t\"356\": \"chrome\",\n\t\t\"809\": \"internetexplorer\",\n\t\t\"808\": \"internetexplorer\",\n\t\t\"353\": \"chrome\",\n\t\t\"352\": \"chrome\",\n\t\t\"351\": \"chrome\",\n\t\t\"350\": \"chrome\",\n\t\t\"803\": \"internetexplorer\",\n\t\t\"802\": \"internetexplorer\",\n\t\t\"801\": \"internetexplorer\",\n\t\t\"800\": \"internetexplorer\",\n\t\t\"807\": \"internetexplorer\",\n\t\t\"806\": \"internetexplorer\",\n\t\t\"805\": \"internetexplorer\",\n\t\t\"804\": \"internetexplorer\",\n\t\t\"216\": \"chrome\",\n\t\t\"217\": \"chrome\",\n\t\t\"768\": \"chrome\",\n\t\t\"769\": \"chrome\",\n\t\t\"212\": \"chrome\",\n\t\t\"213\": \"chrome\",\n\t\t\"210\": \"chrome\",\n\t\t\"211\": \"chrome\",\n\t\t\"762\": \"chrome\",\n\t\t\"763\": \"chrome\",\n\t\t\"760\": \"chrome\",\n\t\t\"761\": \"chrome\",\n\t\t\"766\": \"chrome\",\n\t\t\"767\": \"chrome\",\n\t\t\"764\": \"chrome\",\n\t\t\"765\": \"chrome\",\n\t\t\"40\": \"chrome\",\n\t\t\"41\": \"chrome\",\n\t\t\"289\": \"chrome\",\n\t\t\"288\": \"chrome\",\n\t\t\"4\": \"chrome\",\n\t\t\"281\": \"chrome\",\n\t\t\"280\": \"chrome\",\n\t\t\"283\": \"chrome\",\n\t\t\"282\": \"chrome\",\n\t\t\"285\": \"chrome\",\n\t\t\"284\": \"chrome\",\n\t\t\"287\": \"chrome\",\n\t\t\"286\": \"chrome\",\n\t\t\"678\": \"chrome\",\n\t\t\"679\": \"chrome\",\n\t\t\"674\": \"chrome\",\n\t\t\"675\": \"chrome\",\n\t\t\"676\": \"chrome\",\n\t\t\"677\": \"chrome\",\n\t\t\"670\": \"chrome\",\n\t\t\"671\": \"chrome\",\n\t\t\"672\": \"chrome\",\n\t\t\"673\": \"chrome\",\n\t\t\"263\": \"chrome\",\n\t\t\"262\": \"chrome\",\n\t\t\"261\": \"chrome\",\n\t\t\"260\": \"chrome\",\n\t\t\"267\": \"chrome\",\n\t\t\"266\": \"chrome\",\n\t\t\"265\": \"chrome\",\n\t\t\"264\": \"chrome\",\n\t\t\"269\": \"chrome\",\n\t\t\"268\": \"chrome\",\n\t\t\"59\": \"chrome\",\n\t\t\"58\": \"chrome\",\n\t\t\"55\": \"chrome\",\n\t\t\"54\": \"chrome\",\n\t\t\"57\": \"chrome\",\n\t\t\"56\": \"chrome\",\n\t\t\"51\": \"chrome\",\n\t\t\"258\": \"chrome\",\n\t\t\"53\": \"chrome\",\n\t\t\"52\": \"chrome\",\n\t\t\"537\": \"chrome\",\n\t\t\"536\": \"chrome\",\n\t\t\"535\": \"chrome\",\n\t\t\"63\": \"chrome\",\n\t\t\"533\": \"chrome\",\n\t\t\"532\": \"chrome\",\n\t\t\"531\": \"chrome\",\n\t\t\"530\": \"chrome\",\n\t\t\"152\": \"chrome\",\n\t\t\"539\": \"chrome\",\n\t\t\"538\": \"chrome\",\n\t\t\"775\": \"internetexplorer\",\n\t\t\"774\": \"internetexplorer\",\n\t\t\"982\": \"opera\",\n\t\t\"983\": \"opera\",\n\t\t\"980\": \"opera\",\n\t\t\"981\": \"opera\",\n\t\t\"777\": \"internetexplorer\",\n\t\t\"984\": \"opera\",\n\t\t\"50\": \"chrome\",\n\t\t\"115\": \"chrome\",\n\t\t\"252\": \"chrome\",\n\t\t\"117\": \"chrome\",\n\t\t\"776\": \"internetexplorer\",\n\t\t\"111\": \"chrome\",\n\t\t\"110\": \"chrome\",\n\t\t\"113\": \"chrome\",\n\t\t\"69\": \"chrome\",\n\t\t\"771\": \"chrome\",\n\t\t\"119\": \"chrome\",\n\t\t\"118\": \"chrome\",\n\t\t\"770\": \"chrome\",\n\t\t\"773\": \"internetexplorer\",\n\t\t\"772\": \"internetexplorer\",\n\t\t\"429\": \"chrome\",\n\t\t\"428\": \"chrome\",\n\t\t\"534\": \"chrome\",\n\t\t\"919\": \"firefox\",\n\t\t\"918\": \"firefox\",\n\t\t\"915\": \"firefox\",\n\t\t\"914\": \"firefox\",\n\t\t\"917\": \"firefox\",\n\t\t\"916\": \"firefox\",\n\t\t\"911\": \"firefox\",\n\t\t\"910\": \"firefox\",\n\t\t\"913\": \"firefox\",\n\t\t\"912\": \"firefox\",\n\t\t\"308\": \"chrome\",\n\t\t\"309\": \"chrome\",\n\t\t\"855\": \"firefox\",\n\t\t\"300\": \"chrome\",\n\t\t\"301\": \"chrome\",\n\t\t\"302\": \"chrome\",\n\t\t\"303\": \"chrome\",\n\t\t\"304\": \"chrome\",\n\t\t\"305\": \"chrome\",\n\t\t\"306\": \"chrome\",\n\t\t\"307\": \"chrome\",\n\t\t\"895\": \"firefox\",\n\t\t\"825\": \"firefox\",\n\t\t\"824\": \"firefox\",\n\t\t\"827\": \"firefox\",\n\t\t\"847\": \"firefox\",\n\t\t\"846\": \"firefox\",\n\t\t\"845\": \"firefox\",\n\t\t\"844\": \"firefox\",\n\t\t\"843\": \"firefox\",\n\t\t\"842\": \"firefox\",\n\t\t\"841\": \"firefox\",\n\t\t\"840\": \"firefox\",\n\t\t\"821\": \"firefox\",\n\t\t\"853\": \"firefox\",\n\t\t\"849\": \"firefox\",\n\t\t\"848\": \"firefox\",\n\t\t\"823\": \"firefox\",\n\t\t\"822\": \"firefox\",\n\t\t\"240\": \"chrome\",\n\t\t\"390\": \"chrome\",\n\t\t\"732\": \"chrome\",\n\t\t\"753\": \"chrome\",\n\t\t\"752\": \"chrome\",\n\t\t\"751\": \"chrome\",\n\t\t\"750\": \"chrome\",\n\t\t\"757\": \"chrome\",\n\t\t\"756\": \"chrome\",\n\t\t\"755\": \"chrome\",\n\t\t\"754\": \"chrome\",\n\t\t\"560\": \"chrome\",\n\t\t\"561\": \"chrome\",\n\t\t\"759\": \"chrome\",\n\t\t\"758\": \"chrome\",\n\t\t\"564\": \"chrome\",\n\t\t\"565\": \"chrome\",\n\t\t\"566\": \"chrome\",\n\t\t\"701\": \"chrome\",\n\t\t\"739\": \"chrome\",\n\t\t\"229\": \"chrome\",\n\t\t\"507\": \"chrome\",\n\t\t\"227\": \"chrome\",\n\t\t\"226\": \"chrome\",\n\t\t\"225\": \"chrome\",\n\t\t\"224\": \"chrome\",\n\t\t\"223\": \"chrome\",\n\t\t\"222\": \"chrome\",\n\t\t\"221\": \"chrome\",\n\t\t\"220\": \"chrome\",\n\t\t\"114\": \"chrome\",\n\t\t\"391\": \"chrome\",\n\t\t\"726\": \"chrome\",\n\t\t\"727\": \"chrome\",\n\t\t\"724\": \"chrome\",\n\t\t\"725\": \"chrome\",\n\t\t\"568\": \"chrome\",\n\t\t\"723\": \"chrome\",\n\t\t\"720\": \"chrome\",\n\t\t\"721\": \"chrome\",\n\t\t\"728\": \"chrome\",\n\t\t\"729\": \"chrome\",\n\t\t\"605\": \"chrome\",\n\t\t\"604\": \"chrome\",\n\t\t\"607\": \"chrome\",\n\t\t\"606\": \"chrome\",\n\t\t\"601\": \"chrome\",\n\t\t\"600\": \"chrome\",\n\t\t\"603\": \"chrome\",\n\t\t\"602\": \"chrome\",\n\t\t\"159\": \"chrome\",\n\t\t\"158\": \"chrome\",\n\t\t\"112\": \"chrome\",\n\t\t\"609\": \"chrome\",\n\t\t\"608\": \"chrome\",\n\t\t\"976\": \"opera\",\n\t\t\"634\": \"chrome\",\n\t\t\"399\": \"chrome\",\n\t\t\"635\": \"chrome\",\n\t\t\"959\": \"safari\",\n\t\t\"958\": \"safari\",\n\t\t\"398\": \"chrome\",\n\t\t\"48\": \"chrome\",\n\t\t\"49\": \"chrome\",\n\t\t\"951\": \"safari\",\n\t\t\"950\": \"safari\",\n\t\t\"953\": \"safari\",\n\t\t\"952\": \"safari\",\n\t\t\"42\": \"chrome\",\n\t\t\"954\": \"safari\",\n\t\t\"957\": \"safari\",\n\t\t\"956\": \"safari\",\n\t\t\"638\": \"chrome\",\n\t\t\"5\": \"chrome\",\n\t\t\"639\": \"chrome\",\n\t\t\"460\": \"chrome\",\n\t\t\"489\": \"chrome\",\n\t\t\"488\": \"chrome\",\n\t\t\"487\": \"chrome\",\n\t\t\"486\": \"chrome\",\n\t\t\"485\": \"chrome\",\n\t\t\"484\": \"chrome\",\n\t\t\"483\": \"chrome\",\n\t\t\"482\": \"chrome\",\n\t\t\"481\": \"chrome\",\n\t\t\"480\": \"chrome\",\n\t\t\"509\": \"chrome\",\n\t\t\"955\": \"safari\",\n\t\t\"472\": \"chrome\",\n\t\t\"473\": \"chrome\",\n\t\t\"470\": \"chrome\",\n\t\t\"471\": \"chrome\",\n\t\t\"476\": \"chrome\",\n\t\t\"477\": \"chrome\",\n\t\t\"474\": \"chrome\",\n\t\t\"475\": \"chrome\",\n\t\t\"478\": \"chrome\",\n\t\t\"479\": \"chrome\"\n\t}\n}"
  },
  {
    "path": "项目/HouseScrapy/toolkits/items.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport scrapy\n\n\nclass HousesItem(scrapy.Item):\n    data = scrapy.Field()\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/make_ua.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/7  Python: 3.7\nimport os\n\nfrom fake_useragent import UserAgent\n\n\nclass RandomUserAgentMiddleware(object):\n    \"\"\"\n    first to use location  because it is the fastest\n    \"\"\"\n\n    def __init__(self):\n        location = os.getcwd() + '/toolkits/fake_useragent.json'\n        self.agent = UserAgent(path=location)\n        # self.agent = UserAgent(verify_ssl=False)\n        # self.agent = UserAgent(use_cache_server=False)\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        return cls()\n\n    def process_request(self, request, spider):\n        request.headers.setdefault('User-Agent', self.agent.random)\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/middlewares.py",
    "content": "# -*- coding: utf-8 -*-\n\n# Define here the models for your spider middleware\n#\n# See documentation in:\n# https://doc.scrapy.org/en/latest/topics/spider-middleware.html\n\nfrom scrapy import signals\n\n\nclass HousescrapySpiderMiddleware(object):\n    # Not all methods need to be defined. If a method is not defined,\n    # scrapy acts as if the spider middleware does not modify the\n    # passed objects.\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        # This method is used by Scrapy to create your spiders.\n        s = cls()\n        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)\n        return s\n\n    def process_spider_input(self, response, spider):\n        # Called for each response that goes through the spider\n        # middleware and into the spider.\n\n        # Should return None or raise an exception.\n        return None\n\n    def process_spider_output(self, response, result, spider):\n        # Called with the results returned from the Spider, after\n        # it has processed the response.\n\n        # Must return an iterable of Request, dict or Item objects.\n        for i in result:\n            yield i\n\n    def process_spider_exception(self, response, exception, spider):\n        # Called when a spider or process_spider_input() method\n        # (from other spider middleware) raises an exception.\n\n        # Should return either None or an iterable of Response, dict\n        # or Item objects.\n        pass\n\n    def process_start_requests(self, start_requests, spider):\n        # Called with the start requests of the spider, and works\n        # similarly to the process_spider_output() method, except\n        # that it doesn’t have a response associated.\n\n        # Must return only requests (not items).\n        for r in start_requests:\n            yield r\n\n    def spider_opened(self, spider):\n        spider.logger.info('Spider opened: %s' % spider.name)\n\n\nclass HousescrapyDownloaderMiddleware(object):\n    # Not all methods need to be defined. If a method is not defined,\n    # scrapy acts as if the downloader middleware does not modify the\n    # passed objects.\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        # This method is used by Scrapy to create your spiders.\n        s = cls()\n        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)\n        return s\n\n    def process_request(self, request, spider):\n        # Called for each request that goes through the downloader\n        # middleware.\n\n        # Must either:\n        # - return None: continue processing this request\n        # - or return a Response object\n        # - or return a Request object\n        # - or raise IgnoreRequest: process_exception() methods of\n        #   installed downloader middleware will be called\n        return None\n\n    def process_response(self, request, response, spider):\n        # Called with the response returned from the downloader.\n\n        # Must either;\n        # - return a Response object\n        # - return a Request object\n        # - or raise IgnoreRequest\n        return response\n\n    def process_exception(self, request, exception, spider):\n        # Called when a download handler or a process_request()\n        # (from other downloader middleware) raises an exception.\n\n        # Must either:\n        # - return None: continue processing this exception\n        # - return a Response object: stops process_exception() chain\n        # - return a Request object: stops process_exception() chain\n        pass\n\n    def spider_opened(self, spider):\n        spider.logger.info('Spider opened: %s' % spider.name)\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/pipelines.py",
    "content": "# -*- coding: utf-8 -*-\n\nfrom pymongo import MongoClient\nfrom bson.objectid import ObjectId\nfrom settings import MONGODB_URL, MONGODB_DB, MONGODB_COLL\n\n\nclass HousePipeline(object):\n    \"\"\"地产基础数据\n    \"\"\"\n\n    def __init__(self):\n        client = MongoClient(MONGODB_URL)\n        self.coll = client[MONGODB_DB][MONGODB_COLL]  # 地产链接\n\n    def process_item(self, item, spider):\n        self.coll.insert_one(item['data'])\n"
  },
  {
    "path": "项目/HouseScrapy/toolkits/proxies.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\" \n# Date: 2019/3/5  Python: 3.7\n\nimport base64\nfrom settings import PROXY_USER, PROXY_PASS\n\n# 代理服务器\nproxyServer = \"http://http-dyn.abuyun.com:9020\"\n\n\nproxyAuth = \"Basic \" + base64.urlsafe_b64encode(bytes((PROXY_USER + \":\" + PROXY_PASS), \"ascii\")).decode(\"utf8\")\n\n\nclass ProxyMiddleware(object):\n    \"\"\"自定义中间件代理IP\"\"\"\n    def process_request(self, request, spider):\n        request.meta[\"proxy\"] = proxyServer\n        request.headers[\"Proxy-Authorization\"] = proxyAuth\n\n\n\n"
  },
  {
    "path": "项目/HouseSpider/README.md",
    "content": "# 目前项目还在抽空更新中\n> 慢慢填坑\n\n# 概述\n> 对 `www.funi.com` 网站进行数据爬取"
  },
  {
    "path": "项目/HouseSpider/config.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-12  Python: 3.7\n\n# Redis\nREDIS_HOST = '127.0.0.1'\nREDIS_PORT = '6379'\nREDIS_PASSWORD = None\n\n# MongoDB\nMONGO_CLEAN = 'mongodb://localhost:27017'\n\n# TargetUrl\nTARGET_URL = \"http://www.funi.com/loupan/region_0_0_0_0_{page}\"\n\n# ProxyIP\nPROXY_USER = \"\"\nPROXY_PASS = \"\"\n\n# HOST\nHOST = 'http://www.funi.com'\n"
  },
  {
    "path": "项目/HouseSpider/db/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-12  Python: 3.7\n\n"
  },
  {
    "path": "项目/HouseSpider/main.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-12  Python: 3.7\n\nimport asyncio\n\nfrom tool.parse import *\nfrom tool.toolkit import *\n\n\nasync def get_max_page():\n    \"\"\"获取总页数\n    \"\"\"\n    url = TARGET_URL.format(page=1)\n    result = await get(url)\n    return await parse_total_page(result)\n\n\nasync def get_house_url(page):\n    \"\"\"获取地产链接\n    \"\"\"\n    url = TARGET_URL.format(page=page)\n    result = await get(url)\n    await parse_house_url(result, page)\n\n\n@count_time\ndef main():\n    loop = asyncio.get_event_loop()\n\n    # 1. 获取总页数\n    task = loop.create_task(get_max_page())\n    total_page = loop.run_until_complete(task)\n\n    # 2. 获取链接\n    house_url_func = [asyncio.ensure_future(get_house_url(_)) for _ in range(1, int(total_page))]\n    loop.run_until_complete(asyncio.wait(house_url_func))\n\n    # 3. 楼盘详情\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "项目/HouseSpider/tool/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-12  Python: 3.7\n\n"
  },
  {
    "path": "项目/HouseSpider/tool/parse.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-12  Python: 3.7\n\nfrom pyquery import PyQuery as pq\nfrom config import *\n\n\nasync def parse_total_page(result):\n    \"\"\"解析总页数\n    \"\"\"\n    doc = pq(result)\n    max_page = doc('.pages a').eq(-2).text()\n    print('数据总: {total} 页'.format(total=max_page))\n    return max_page\n\n\nasync def parse_house_url(result, page):\n    \"\"\"页面解析链接\n    \"\"\"\n    doc = pq(result)\n    dls = doc('.fleft div').eq(-2)('dl')\n    n = 0\n    for dl in dls:\n        href = pq(dl)('dt a').attr('href')\n        href = HOST + href[: href.find(';')]  # 清洗链接\n        print(href)\n        n += 1\n    if not n:\n        print('第 {page} 抽取链接失败'.format(page=page))\n\n\n"
  },
  {
    "path": "项目/HouseSpider/tool/proxy.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-12  Python: 3.7\n\n\nfrom config import PROXY_PASS, PROXY_USER\n\n# 代理服务器\nproxyHost = \"http-dyn.abuyun.com\"\nproxyPort = \"9020\"\n\n\nproxyServer = \"http://%(user)s:%(pass)s@%(host)s:%(port)s\" % {\n    \"host\": proxyHost,\n    \"port\": proxyPort,\n    \"user\": PROXY_USER,\n    \"pass\": PROXY_PASS,\n}\n\nif not PROXY_USER or not PROXY_PASS:\n    msg = \"\"\"\n    请先在 config.py 配置文件内填入代理IP账号\n    阿布云代理IP：https://www.abuyun.com/http-proxy/products.html\n    \"\"\"\n    print(msg)\n    exit()\n"
  },
  {
    "path": "项目/HouseSpider/tool/toolkit.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-07-13  Python: 3.7\nimport datetime\nimport aiohttp\n\nfrom tool.proxy import proxyServer\n\n\nasync def get(url):\n    \"\"\"请求页面\n    \"\"\"\n    headers = {\n        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',\n        'Host': 'www.funi.com'\n    }\n\n    try:\n        \"\"\"conn = aiohttp.TCPConnector(verify_ssl=False) connector=conn\"\"\"\n        async with aiohttp.ClientSession(headers=headers) as session:\n            async with session.get(url, proxy=proxyServer) as response:\n                return await response.text(\"utf-8\")\n    except TimeoutError as te:\n        print('超时', te)\n\n\ndef count_time(func):\n    \"\"\"取运行时间\n    \"\"\"\n    def int_time(*args, **kwargs):\n        start_time = datetime.datetime.now()  # 程序开始时间\n        func()\n        over_time = datetime.datetime.now()   # 程序结束时间\n        total_time = (over_time-start_time).total_seconds()\n        print('程序耗时: %s 秒' % total_time)\n    return int_time\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/__init__.py",
    "content": ""
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/items.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport scrapy\n\n\nclass AreaItem(scrapy.Item):\n    \"\"\"地区\"\"\"\n    type = scrapy.Field()\n    id = scrapy.Field()\n    pid = scrapy.Field()\n    name = scrapy.Field()\n    pinyin = scrapy.Field()\n    first = scrapy.Field()\n    haschild = scrapy.Field()\n\n\nclass CoordItem(scrapy.Item):\n    \"\"\"坐标录入\"\"\"\n    type = scrapy.Field()\n    id = scrapy.Field()\n    lng = scrapy.Field()\n    lat = scrapy.Field()\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/middlewares.py",
    "content": "# -*- coding: utf-8 -*-\n\n# Define here the models for your spider middleware\n#\n# See documentation in:\n# https://doc.scrapy.org/en/latest/topics/spider-middleware.html\n\nfrom scrapy import signals\n\n\nclass MeituanareaSpiderMiddleware(object):\n    # Not all methods need to be defined. If a method is not defined,\n    # scrapy acts as if the spider middleware does not modify the\n    # passed objects.\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        # This method is used by Scrapy to create your spiders.\n        s = cls()\n        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)\n        return s\n\n    def process_spider_input(self, response, spider):\n        # Called for each response that goes through the spider\n        # middleware and into the spider.\n\n        # Should return None or raise an exception.\n        return None\n\n    def process_spider_output(self, response, result, spider):\n        # Called with the results returned from the Spider, after\n        # it has processed the response.\n\n        # Must return an iterable of Request, dict or Item objects.\n        for i in result:\n            yield i\n\n    def process_spider_exception(self, response, exception, spider):\n        # Called when a spider or process_spider_input() method\n        # (from other spider middleware) raises an exception.\n\n        # Should return either None or an iterable of Response, dict\n        # or Item objects.\n        pass\n\n    def process_start_requests(self, start_requests, spider):\n        # Called with the start requests of the spider, and works\n        # similarly to the process_spider_output() method, except\n        # that it doesn’t have a response associated.\n\n        # Must return only requests (not items).\n        for r in start_requests:\n            yield r\n\n    def spider_opened(self, spider):\n        spider.logger.info('Spider opened: %s' % spider.name)\n\n\nclass MeituanareaDownloaderMiddleware(object):\n    # Not all methods need to be defined. If a method is not defined,\n    # scrapy acts as if the downloader middleware does not modify the\n    # passed objects.\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        # This method is used by Scrapy to create your spiders.\n        s = cls()\n        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)\n        return s\n\n    def process_request(self, request, spider):\n        # Called for each request that goes through the downloader\n        # middleware.\n\n        # Must either:\n        # - return None: continue processing this request\n        # - or return a Response object\n        # - or return a Request object\n        # - or raise IgnoreRequest: process_exception() methods of\n        #   installed downloader middleware will be called\n        return None\n\n    def process_response(self, request, response, spider):\n        # Called with the response returned from the downloader.\n\n        # Must either;\n        # - return a Response object\n        # - return a Request object\n        # - or raise IgnoreRequest\n        return response\n\n    def process_exception(self, request, exception, spider):\n        # Called when a download handler or a process_request()\n        # (from other downloader middleware) raises an exception.\n\n        # Must either:\n        # - return None: continue processing this exception\n        # - return a Response object: stops process_exception() chain\n        # - return a Request object: stops process_exception() chain\n        pass\n\n    def spider_opened(self, spider):\n        spider.logger.info('Spider opened: %s' % spider.name)\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/pipelines.py",
    "content": "# -*- coding: utf-8 -*-\n\nimport pymysql\n\nfrom MeiTuanArea.settings import MYSQL_DB_NAME, MYSQL_HOST, MYSQL_PASSWORD, MYSQL_PORT, MYSQL_USER\n\n\nclass AreaPipeline(object):\n    \"\"\"区域采集\"\"\"\n    conn = None\n    cursor = None  # 游标对象\n\n    def open_spider(self, spider):\n        print('开始爬虫，链接数据库')\n        self.conn = pymysql.Connect(\n            host=MYSQL_HOST,\n            port=MYSQL_PORT,\n            user=MYSQL_USER,\n            password=MYSQL_PASSWORD,\n            db=MYSQL_DB_NAME,\n        )\n\n    def process_item(self, item, spider):\n        sql = None\n        if item['type'] == 'province':  # 一级 省市\n            sql = \"\"\"INSERT INTO province(id, `name`, pinyin, `first`) VALUES (\"{id}\",\"{name}\",\"{pinyin}\",\"{first}\") \"\"\".format(\n                id=int(item['id']),\n                name=item['name'],\n                pinyin=item['pinyin'],\n                first=item['first'],\n            )\n\n        elif item['type'] == 'city':  # 二级 市\n            sql = \"\"\"INSERT INTO city(id,pid, `name`, pinyin, `first`) VALUES (\"{id}\",\"{pid}\",\"{name}\",\"{pinyin}\",\"{first}\") \"\"\".format(\n                id=int(item['id']),\n                pid=int(item['pid']),\n                name=item['name'],\n                pinyin=item['pinyin'],\n                first=item['first'],\n            )\n\n        elif item['type'] == 'area':  # 三级 区域\n            sql = \"\"\"INSERT INTO area(id,pid, `name`, pinyin, `first`, haschild) VALUES (\"{id}\",\"{pid}\",\"{name}\",\"{pinyin}\",\"{first}\",\"{haschild}\") \"\"\".format(\n                id=int(item['id']),\n                pid=int(item['pid']),\n                name=item['name'],\n                pinyin=item['pinyin'],\n                first=item['first'],\n                haschild=item['haschild'],\n            )\n\n        elif item['type'] == 'address':  # 四季 地区\n            sql = \"\"\"INSERT INTO address(id,pid, `name`, pinyin, `first`) VALUES (\"{id}\",\"{pid}\",\"{name}\",\"{pinyin}\",\"{first}\") \"\"\".format(\n                id=int(item['id']),\n                pid=int(item['pid']),\n                name=item['name'],\n                pinyin=item['pinyin'],\n                first=item['first'],\n            )\n\n        # 创建游标对象\n        self.cursor = self.conn.cursor()\n        # 提交事务\n        try:\n            self.cursor.execute(sql)\n            self.conn.commit()\n        except Exception as e:\n            print(e)\n            print('异常回滚')\n            self.conn.rollback()\n\n        self.cursor.close()\n\n        return item\n\n    def close_spider(self, spider):\n        print('爬虫结束, 关闭通道')\n        self.conn.close()\n\n\nclass CoordPipeline(object):\n    \"\"\"坐标采集更新\"\"\"\n    conn = None\n    cursor = None  # 游标对象\n\n    def open_spider(self, spider):\n        print('开始爬虫，链接数据库')\n        self.conn = pymysql.Connect(\n            host=MYSQL_HOST,\n            port=MYSQL_PORT,\n            user=MYSQL_USER,\n            password=MYSQL_PASSWORD,\n            db=MYSQL_DB_NAME,\n        )\n\n    def process_item(self, item, spider):\n        sql = None\n        if item['type'] == 'province':  # 一级 省市\n            sql = \"\"\"UPDATE province SET lng={lng}, lat={lat} where id={id}\"\"\".format(\n                id=int(item['id']),\n                lng=item['lng'],\n                lat=item['lat'],\n            )\n\n        elif item['type'] == 'city':  # 二级 市\n            sql = \"\"\"UPDATE city SET lng={lng}, lat={lat} where id={id}\"\"\".format(\n                id=int(item['id']),\n                lng=item['lng'],\n                lat=item['lat'],\n            )\n\n        elif item['type'] == 'area':  # 三级 区域\n            sql = \"\"\"UPDATE area SET lng={lng}, lat={lat} where id={id}\"\"\".format(\n                id=int(item['id']),\n                lng=item['lng'],\n                lat=item['lat'],\n            )\n\n        elif item['type'] == 'address':  # 四季 地区\n            sql = \"\"\"UPDATE address SET lng={lng}, lat={lat} where id={id}\"\"\".format(\n                id=int(item['id']),\n                lng=item['lng'],\n                lat=item['lat'],\n            )\n\n        # 创建游标对象\n        self.cursor = self.conn.cursor()\n        # 提交事务\n        try:\n            self.cursor.execute(sql)\n            self.conn.commit()\n        except Exception as e:\n            print(e)\n            print('异常回滚')\n            self.conn.rollback()\n\n        self.cursor.close()\n\n        return item\n\n    def close_spider(self, spider):\n        print('爬虫结束, 关闭通道')\n        self.conn.close()\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/settings.py",
    "content": "# -*- coding: utf-8 -*-\n\n\nBOT_NAME = 'MeiTuanArea'  # 爬虫项目名\n\nSPIDER_MODULES = ['MeiTuanArea.spiders']  # 爬虫目录设定\nNEWSPIDER_MODULE = 'MeiTuanArea.spiders'  # 爬虫生成目录\n\nROBOTSTXT_OBEY = False  # 否认协议\n\nRANDOMIZE_DOWNLOAD_DELAY = True  # 开启随机增加毫秒级延迟，增加访问成功率\n\nDOWNLOAD_FAIL_ON_DATALOSS = False  # 重试处理\n\nDOWNLOAD_TIMEOUT = 5  # 设置超时时间，避免ip失效等待时间过长\n\n# HTTPERROR_ALLOWED_CODES = [301]  # 禁止301\n\n# 指定终端输出日志、日志位置\n# LOG_LEVEL = 'WARNING'\n# LOG_FILE = 'error_log.txt'\n\nHTTPERROR_ALLOWED_CODES = [403]\n\n# UA\nUSER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'\n\n# mysql\nMYSQL_HOST = '127.0.0.1'\nMYSQL_PORT = 3306\nMYSQL_USER = 'root'\nMYSQL_PASSWORD = 'mysql 密码'\nMYSQL_DB_NAME = 'mysql库'\n\n# API 百度地图坐标获取API，申请后填写即可\nAPI_AK = '百度地图 api ak'\n\n\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/spiders/__init__.py",
    "content": "# This package will contain the spiders of your Scrapy project\n#\n# Please refer to the documentation for information on how to create and manage\n# your spiders.\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/spiders/area_coord.py",
    "content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport pymysql\nimport json\n\nfrom MeiTuanArea.settings import API_AK\nfrom MeiTuanArea.settings import MYSQL_DB_NAME, MYSQL_HOST, MYSQL_PASSWORD, MYSQL_PORT, MYSQL_USER\nfrom MeiTuanArea.items import CoordItem\n\n\nclass GetLngSpider(scrapy.Spider):\n    name = 'area_coord'\n\n    # 独立配置\n    custom_settings = {\n        'ITEM_PIPELINES': {\n            'MeiTuanArea.pipelines.CoordPipeline': 300,\n        },\n    }\n\n    # mysql 配置\n    conn = pymysql.Connect(\n        host=MYSQL_HOST,\n        port=MYSQL_PORT,\n        user=MYSQL_USER,\n        password=MYSQL_PASSWORD,\n        db=MYSQL_DB_NAME,\n    )\n\n    url = 'http://api.map.baidu.com/geocoder/v2/?address={address}&output=json&ak={ak}'\n\n    def start_requests(self):\n\n        # 一级区域 省市\n        provinces = self.get_db(\"\"\"SELECT id,`name` from province\"\"\")\n        for _id, name in provinces:\n            target_url = self.url.format(address=name, ak=API_AK)\n            yield scrapy.Request(target_url, meta={'type': 'province', '_id': _id})\n\n        # 二级区域 城市\n        city = self.get_db(\"\"\"SELECT id,`name` from city\"\"\")\n        for _id, name in city:\n            target_url = self.url.format(address=name, ak=API_AK)\n            yield scrapy.Request(target_url, meta={'type': 'city', '_id': _id})\n\n        # 三级区域 区域\n        area = self.get_db(\"\"\"select area.id, city.name, area.name from city LEFT JOIN area on city.id=area.pid\"\"\")\n        for _id, name, address_name in area:\n            address = str(name)+str(address_name)\n            target_url = self.url.format(address=address, ak=API_AK)\n            yield scrapy.Request(target_url, meta={'type': 'area', '_id': i[0]})\n\n        # 四级区域 街道\n        address = self.get_db(\"\"\"select address.id,area.name, address.name from area LEFT JOIN address on address.pid=area.id\"\"\")\n        for _id, name, address_name in address:\n            target_url = self.url.format(address=str(name)+str(address_name), ak=API_AK)\n            yield scrapy.Request(target_url, meta={'type': 'address', '_id': _id})\n\n    def get_db(self, sql):\n        \"\"\"数据库查询\"\"\"\n        # 创建游标对象\n        cursor = self.conn.cursor()\n        # 提交事务\n        try:\n            cursor.execute(sql)\n            data = cursor.fetchall()\n            cursor.close()\n            self.conn.close()\n            return data\n        except Exception as e:\n            print('异常回滚')\n            self.conn.rollback()\n            cursor.close()\n            self.conn.close()\n            return None\n\n    def parse(self, response):\n        \"\"\"清洗数据\"\"\"\n        item = CoordItem()\n        data = json.loads(response.text)\n        # 处理字符串 把闲杂符号去掉\n        if data.get('status') == 0:\n            # 坐标\n            item['lng'] = data.get('result').get('location').get('lng')\n            item['lat'] = data.get('result').get('location').get('lat')\n            item['id'] = response.meta.get('_id')\n            item['type'] = response.meta.get('type')\n            yield item\n\n"
  },
  {
    "path": "项目/MeiTuanArea/MeiTuanArea/spiders/areas.py",
    "content": "# -*- coding: utf-8 -*-\nimport scrapy\nimport json\nimport re\n\nfrom pypinyin import pinyin, lazy_pinyin\nfrom MeiTuanArea.items import AreaItem\n\n\nclass GetAreaSpider(scrapy.Spider):\n    name = 'areas'\n\n    # 独立配置\n    custom_settings = {\n        'ITEM_PIPELINES': {\n            'MeiTuanArea.pipelines.AreaPipeline': 300,\n        },\n        'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',\n        'DOWNLOAD_DELAY': 0.5,  # 限流  下载同一个网站下一个页面前需要等待的时间\n    }\n\n    def start_requests(self):\n        start_url = 'https://www.meituan.com/ptapi/getprovincecityinfo/'\n        yield scrapy.Request(start_url, callback=self.parse_province)\n\n    def parse_province(self, response):\n        \"\"\"省市+市 1、2 级区域采集\"\"\"\n        target_url = 'http://{acronym}.meituan.com/meishi/'\n\n        item = AreaItem()\n        data = json.loads(response.text)\n        for node in data:\n            name = node.get('provinceName')\n            item['type'] = 'province'\n            item['haschild'] = 1\n            item['id'] = node.get('provinceCode')\n            item['pid'] = 0\n            item['name'] = name\n            item['pinyin'] = ''.join(lazy_pinyin(name))\n            item['first'] = self.get_acronym(name)\n            yield item  # 一级省市\n\n            for i in node.get('cityInfoList'):\n                item['type'] = 'city'\n                item['id'] = i.get('id')\n                item['pid'] = node.get('provinceCode')\n                item['name'] = i.get('name')\n                item['pinyin'] = i.get('pinyin')\n                item['first'] = i.get('acronym')\n                yield item  # 二级市\n\n                url = target_url.format(acronym=i.get('acronym'))\n                yield scrapy.Request(url, callback=self.parse_area, meta={'pid': i.get('id')})\n\n    def parse_area(self, response):\n        \"\"\"区域+街道 2、3 级区域采集\"\"\"\n        info, areas = re.search(r',\"areas\":(.*?),\"dinnerCountsAttr', response.text), None\n        if info:\n            areas = json.loads(info.group(1))\n        if areas:\n            city_id = response.meta.get('pid')\n            item = AreaItem()\n\n            # 解析区域 3 级\n            for area in areas:\n                item['type'] = 'area'\n                item['id'] = area.get('id')\n                item['pid'] = city_id\n                item['name'] = area.get('name')\n                item['pinyin'] = ''.join(lazy_pinyin(area.get('name')))\n                item['first'] = self.get_acronym(area.get('name'))\n\n                subs = area.get('subAreas')\n                # 判断是否有下级，有的区域么有下级了\n                if len(subs) > 1:\n                    item['haschild'] = 1\n                else:\n                    item['haschild'] = 0\n\n                yield item\n\n                # 解析 4 级\n                if len(subs) > 1:\n                    for sub in subs:\n                        if not sub.get('name') == '全部':\n                            item['haschild'] = 0\n                            item['type'] = 'address'\n                            item['id'] = sub.get('id')\n                            item['pid'] = area.get('id')\n                            item['name'] = sub.get('name')\n                            item['pinyin'] = ''.join(lazy_pinyin(sub.get('name')))\n                            item['first'] = self.get_acronym(sub.get('name'))\n                            yield item\n\n        else:\n            print('区域读取失败')\n\n    @staticmethod\n    def get_acronym(str_data):\n        \"\"\"\n        获取字符串的首字母\n        :param str_data: 字符串\n        :return: 字符串\n        \"\"\"\n        return \"\".join([i[0][0] for i in pinyin(str_data)])\n\n"
  },
  {
    "path": "项目/MeiTuanArea/README.md",
    "content": "# 美团城市采集\n> 因为全站爬取需要用到，区域基础数据。这里单独抽离出来。\n\n## 配置\n在 settings 内配置 mysql 与 百度api_ak 即可\n\n## 数据库设计\n> 因为最终数据将会用到Mysql上，区域一共有4个层级，分别是省市、市、区域、街道，这里按照业务需求拆分到4张表中。\n\n![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/区域表.png)\n\n## 坐标拾取\n> 通过百度API调用地址，获取坐标并存入库中\n\n## 效果\n![](https://zok-blog.oss-cn-hangzhou.aliyuncs.com/images/区域坐标.png)"
  },
  {
    "path": "项目/MeiTuanArea/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n# __author__ = \"zok\"  362416272@qq.com\n# Date: 2019-06-18  Python: 3.7\n\n"
  },
  {
    "path": "项目/MeiTuanArea/scrapy.cfg",
    "content": "# Automatically created by: scrapy startproject\n#\n# For more information about the [deploy] section see:\n# https://scrapyd.readthedocs.io/en/latest/deploy.html\n\n[settings]\ndefault = MeiTuanArea.settings\n\n[deploy]\n#url = http://localhost:6800/\nproject = MeiTuanArea\n"
  },
  {
    "path": "项目/MeiTuanArea/初始化.sql",
    "content": "/*\n Navicat Premium Data Transfer\n\n Source Server         : LocalhostMysql\n Source Server Type    : MySQL\n Source Server Version : 50725\n Source Host           : localhost:3306\n Source Schema         : nujiang\n\n Target Server Type    : MySQL\n Target Server Version : 50725\n File Encoding         : 65001\n\n Date: 23/05/2019 16:32:56\n*/\n\nSET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;\n\n-- ----------------------------\n-- Table structure for address\n-- ----------------------------\nDROP TABLE IF EXISTS `address`;\nCREATE TABLE `address` (\n  `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `pid` bigint(10) DEFAULT NULL COMMENT '父id',\n  `name` varchar(100) DEFAULT NULL COMMENT '名称',\n  `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',\n  `code` varchar(100) DEFAULT NULL COMMENT '长途区号',\n  `zip` varchar(100) DEFAULT NULL COMMENT '邮编',\n  `first` varchar(50) DEFAULT NULL COMMENT '首字母',\n  `lng` varchar(100) DEFAULT NULL COMMENT '经度',\n  `lat` varchar(100) DEFAULT NULL COMMENT '纬度',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `pid` (`pid`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=3749 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='四级区域 地址';\n\n-- ----------------------------\n-- Table structure for area\n-- ----------------------------\nDROP TABLE IF EXISTS `area`;\nCREATE TABLE `area` (\n  `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `pid` bigint(10) DEFAULT NULL COMMENT '父id',\n  `name` varchar(100) DEFAULT NULL COMMENT '名称',\n  `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',\n  `code` varchar(100) DEFAULT NULL COMMENT '长途区号',\n  `zip` varchar(100) DEFAULT NULL COMMENT '邮编',\n  `first` varchar(50) DEFAULT NULL COMMENT '首字母',\n  `lng` varchar(100) DEFAULT NULL COMMENT '经度',\n  `lat` varchar(100) DEFAULT NULL COMMENT '纬度',\n  `haschild` int(1) DEFAULT NULL COMMENT '是否有下级',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `pid` (`pid`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=39793 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='三级区域 区域';\n\n-- ----------------------------\n-- Table structure for city\n-- ----------------------------\nDROP TABLE IF EXISTS `city`;\nCREATE TABLE `city` (\n  `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `pid` bigint(10) DEFAULT NULL COMMENT '父id',\n  `name` varchar(100) DEFAULT NULL COMMENT '名称',\n  `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',\n  `code` varchar(100) DEFAULT NULL COMMENT '长途区号',\n  `zip` varchar(100) DEFAULT NULL COMMENT '邮编',\n  `first` varchar(50) DEFAULT NULL COMMENT '首字母',\n  `lng` varchar(100) DEFAULT NULL COMMENT '经度',\n  `lat` varchar(100) DEFAULT NULL COMMENT '纬度',\n  PRIMARY KEY (`id`) USING BTREE,\n  KEY `pid` (`pid`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=8002 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='二级区域 城市';\n\n-- ----------------------------\n-- Table structure for province\n-- ----------------------------\nDROP TABLE IF EXISTS `province`;\nCREATE TABLE `province` (\n  `id` bigint(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `name` varchar(100) DEFAULT NULL COMMENT '名称',\n  `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',\n  `code` varchar(100) DEFAULT NULL COMMENT '长途区号',\n  `zip` varchar(100) DEFAULT NULL COMMENT '邮编',\n  `first` varchar(50) DEFAULT NULL COMMENT '首字母',\n  `lng` varchar(100) DEFAULT NULL COMMENT '经度',\n  `lat` varchar(100) DEFAULT NULL COMMENT '纬度',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE=InnoDB AUTO_INCREMENT=820001 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='一级区域 省市';\n\nSET FOREIGN_KEY_CHECKS = 1;\n"
  },
  {
    "path": "项目/README.md",
    "content": "# 该板块不定期更新\n> 因为工作中会经常开发重型的爬虫，并且也属于公司的资源，所以并不会将代码放到网上。尽量以一些实战demo形式发布一些个人小项目。\n\n## MeiTuanArea\n美团区域 Scrapy 爬虫\n\n## HoseSpider\n房地产爬虫 aiohttp 爬虫"
  }
]