[
  {
    "path": "README.md",
    "content": "<a class=\"wiz_toc h1\" href=\"#懒得看的点这里, 直接到示例\">懒得看的点这里, 直接到示例</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#任务管理\">任务管理</a>\n<br>\n<a class=\"wiz_toc h2\" href=\"#界面说明\">界面说明</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#新增任务\">新增任务</a>\n<br>\n<a class=\"wiz_toc h2\" href=\"#1.请求参数配置\">1.请求参数配置</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#配置名称\">配置名称</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#请求方式\">请求方式</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#入口url\">入口url</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#请求参数\">请求参数</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#代理ip\">代理ip</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#动态解析\">动态解析</a>\n<br>\n<a class=\"wiz_toc h2\" href=\"#2.选择器配置\">2.选择器配置</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#选择器界面\">选择器界面</a>\n<br>\n<a class=\"wiz_toc h4\" href=\"#主界面\">主界面</a>\n<br>\n<a class=\"wiz_toc h4\" href=\"#增、改\">增、改</a>\n<br>\n<a class=\"wiz_toc h4\" href=\"#查\">查</a>\n<br>\n<a class=\"wiz_toc h4\" href=\"#预览\">预览</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#字段选择器属性\">字段选择器属性</a>\n<br>\n<a class=\"wiz_toc h4\" href=\"#字段使用条件\">字段使用条件</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#元素集选择器的存在意义\">元素集选择器的存在意义</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#选择器树形图\">选择器树形图</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#下一步/保存选择器\">下一步/保存选择器</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#查看/下载数据\">查看/下载数据</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#读取配置\">读取配置</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#采集示例\">采集示例</a>\n<br>\n<a class=\"wiz_toc h2\" href=\"#\" 多元素 \"选择器=\" \" +=\" \" 翻页(1)\"=\"\">\"多元素\"选择器 + 翻页(1)</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#请求配置\">请求配置</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#参数配置\">参数配置</a>\n<br>\n<a class=\"wiz_toc h2\" href=\"#元素集选择器+翻页(2)+详情\">元素集选择器+翻页(2)+详情</a>\n<br>\n<a class=\"wiz_toc h3\" href=\"#参数配置\">参数配置</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#可能存在的问题\">可能存在的问题</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#动态解析\">动态解析</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#网页页模板不同\">网页页模板不同</a>\n<br>\n<a class=\"wiz_toc h1\" href=\"#选择器无法选中\">选择器无法选中</a>\n\n# 懒得看的点这里, 直接到示例\n<a href=\"#采集示例\">采集示例</a>\n\n# 任务管理\n## 界面说明\n**主界面:**\n![](/server/static/images/90eb120e-33b8-48fb-a665-4048a77839b9.png)\n\n该模块管理爬虫的运行状态, 可以暂停、停止和恢复爬虫的运行.\n\n**详情界面:**\n![](/server/static/images/7028c459-888e-40ae-b412-e268540d4150.png)\n\n如图, 点击任务, 进入详情页, \"爬虫统计\"为scrapy爬虫框架的日志信息; \"请求队列\"为将要爬取的url; 上方有\"暂停\"、\"恢复\"和\"停止\"爬虫任务按钮.\n\n主界面为管理爬虫任务状态的模块, 前后端实时同步, 前端实时接收爬虫任务日志, 后端实时响应爬虫任务状态的改变.\n# 新增任务\n![](/server/static/images/0815f886-5de3-412b-8d21-b20a642af05a.png)\n\n配置request请求参数和入口url, 同为后续爬虫的请求参数.\n\n## 1.请求参数配置\n### 配置名称\n任务ID的标识, 在数据查询时用来查找数据集合, 保存配置时用来选择请求参数和字段选择器, 唯一值, 不可重复, 不能为`config`字符串.\n\n### 请求方式\n本平台选常用的两种请求, post和get.\n\n### 入口url\n爬取页面的入口页面, 选择采集参数和后续页面会在该页面进行扩展\n\n### 请求参数\n请求参数分为三种:\n**1.请求头header参数**\n爬虫常用的header参数有\n\n| Header | 解释 | 示例 |\n| ---- | ---- | ---- |\n| Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html |\n| Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 |\n| Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |\n| Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |\n| Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |\n| Content-Length | 请求的内容长度 | Content-Length: 348 |\n| Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |\n| Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |\n| Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |\n| Referer | 先前网页的地址，当前请求网页紧随其后,即来路 | Referer: https://www.baidu.com/ |\n| User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |\n\n**2.cookie参数**\n有些网站需要验证cookie参数\n\n**3.form-data参数**\n选择post请求时, 提交的参数信息\n\n![](/server/static/images/acfce330-9ea4-4ce6-92fc-569707e8076c.png)\n如图为header参数\n\n### 代理ip\n针对防爬虫网站设计, 动态代理ip, 有效时间`2018-05-10 14:44:00`前\n\n### 动态解析\n越来越多的网站选用js渲染页面, 针对非模板页面加载网站\n\n示例url: `http://shop.99114.com/47907188/ch6`\n\n静态爬虫获取页面内容：\n![](/server/static/images/15155175263081.png)\n\n动态爬虫获取页面内容：\n![](/server/static/images/2.png)\n\n动态爬虫实际获取页面内容：\n![](/server/static/images/3.png)\n\n在动态爬虫获取页面的前端展现上, 已竭力实现实际获取内容, 但仍不可避免造成爬取内容和展现内容不符.\n\n## 2.选择器配置\n![](/server/static/images/3da3e10c-80de-4597-9823-88a07ddb78b3.png)\n\n选择器配置界面分为两部分, 上方的**采集页面**和下方的**选择器页面**.\n上方的采集页面为请求配置完成后点击\"下一步\"所呈现出的页面内容.\n下方的选择器界面为选择将要采集的数据.\n\n### 选择器界面\n#### 主界面\n![](/server/static/images/28e81b8d-a8bb-4fc1-85c9-f3839f14da4a.png)\n提供字段选择器的层级显示、增、删、改、查、预览功能\n#### 增、改\n![](/server/static/images/1d258dd7-3462-465e-a6ee-eff449a794ee.png)\n添加/修改字段选择器, 共有7中类型的字段选择器<a href=\"#字段选择器属性\">字段选择器属性</a>\n#### 查\n![](/server/static/images/28546708-1d60-416a-a874-a9cea4f7dce3.jpg)\n显示选择器选择在页面中选择的位置\n#### 预览\n![](/server/static/images/709f40e1-b083-4d60-98e9-877fdf53c7b2.png)\n显示选择器匹配的数据\n\n\n选择器用来选定采集数据的位置和内容, 该界面可以用鼠标点击配置将要采集的数据, 查看采集数据的位置, 预览采集数据的内容, 根据采集数据不同, 将字段选择器分为以下7类.\n### 字段选择器属性\n\n| 字段选择器 | 名称 | 多元素属性(multiple) | 可选子元素 | 该类型页面唯一 | 可查看选择器 | 可预览数据 | 是否采集 |\n| ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |\n| SelectorDetail | 详情页选择器 | 否 | 是 | 是 | 是 | 是 | 否 |\n| SelectorElement | 元素集选择器 | 是 | 是 | 否 | 否 | 否 | 否 |\n| SelectorElementAttribute | 元素属性选择器 | 是 | 否 | 否 | 是 | 是 | 是 |\n| SelectorHTML | html选择器 | 是 | 否 | 否 | 是 | 是 | 是 |\n| SelectorImage | 图片选择器 | 是 | 否 | 否 | 是 | 是 | 是 |\n| SelectorLink | 翻页选择器 | 否 | 否 | 是 | 是 | 是 | 否 |\n| SelectorText | 文本选择器 | 是 | 否 | 否 | 是 | 是 | 是 |\n\n#### 字段使用条件\n\n> 1.避免同级别multiple、非multiple属性的选择器并存\n\n所有采集的字段(SelectorElementAttribute、SelectorHTML、SelectorImage、SelectorText)有字段选中\"多元素属性\"时, 不可选择其他采集的字段, 会造成两个字段集合维度混乱(\"多元素属性\"的字段多对一非列表属性字段), 后端维度无法对应的字段值统一处理为空字符串.\n\n如果有\"多元素属性\", 该父类下所有采集的字段选择器尽量全都是\"多元素属性\"；\n如果没有\"多元素属性\", 该父类下所有采集的字段选择器尽量都没有\"多元素属性\".\n![](/server/static/images/47b3f912-b840-4062-bd6b-f0bfc14b43ab.png)\n![](/server/static/images/1ae43476-59d4-40bd-a1ef-9705df3030a3.png)\n如图：标题、内容为可采集字段, 他们的多元素属性必须一致.\n![](/server/static/images/600acd3f-432d-4784-9f41-654aabe628df.png)\n不一致时示例\n\n> 2.翻页选择器只能在入口页面设置且唯一\n\nSelectorLink(翻页选择器)在入口页面下只能存在一个.\nSelectorLink是递归采集函数.\n存在多个时导致系统效率降低, 稳健性下降.\n\n> 3.元素集选择器下可采集的字段多元素属性以元素集选择器为准\n\nSelectorElement(元素集选择器)的子类采集选择器(SelectorElementAttribute、SelectorHTML、SelectorImage、SelectorText)选择multiple(多元素属性)时, 会将子类数据集升维, 数据解析错误.\n\n[详细解释见<a href=\"#元素集选择器的存在意义\">元素集选择器的存在意义</a>]\n![](/server/static/images/85d6f868-f03b-4c9e-b8c9-cd7ffc832029.png)\n如图：元素集下所有的可采集字段(红圈中)的multiple(多元素属性)以元素集是否选择multiple(多元素属性)为准.\n\n前端表单按照字段选择器名称生成模板, 暂时未判断父类属性; 后端元素SelectorElement(元素集选择器)的子类采集选择器采集时将不会判断multiple(多元素属性).统一按照父类SelectorElement(元素集选择器)是否选择multiple(多元素属性)判断.\n\n> 4.详情页选择只能有一条链式选择器\n\n前端采集页面在iframe标签内, 详情页选择后无法返回, 同级别选择器只能存在一个, 不同层次的选择器存在详情页选择器则他们必在同一条链式选择器上.\n后端采集框架scrapy为异步回调, 选择器解析为链式回调, 同级别存在多个详情页选择器会导致数据混淆、丢失.\n![](/server/static/images/c5173f94-9895-4709-81db-0df46599fdf5.png)\n如图：\"详情\", \"联系\"为两个详情选择器, 在同一条链式选择器上\n\n### 元素集选择器的存在意义\n\n采集到所需的数据由两个因素决定：html文本和选择器， 其中html文本为页面中内容所在的html块, 选择器为指定采集的字段内容.\n\n在使用到元素集选择器的大多数情况下html块多为列表形式存在, 选择器有多个.\n\n**不使用元素集选择器时**\n多个选择器按照\"多元素\"属性选择采集的数据, 页面本身可能存在内容块数据缺失, 造成多个选择器选择的数据列无法一一对应, 造成数据混淆、错位\n\n示例：\n![](/server/static/images/6cfe84f9-a938-49e7-ae1a-e16e67d25bbf.png)![](/server/static/images/545c2037-3d39-4e72-bddf-a84b180cc693.png)\n![](/server/static/images/7fbf683b-98d8-4c09-9315-acc601a07387.png)![](/server/static/images/d0ca6d60-b3db-4514-bfb2-0c88fc862ea6.png)\n\n\"多元素属性\"选择器优先遍历css选择器\n\n新建两个\"多元素属性\"选择器, 第一个采集\"name\"字段, 第二个采集\"href\"字段, 当页面本身存在数据缺失时, 会使\"name\"和\"href\"数据无法一一对应.\"name_2\" => \"href_3\" 导致数据错位.\n\n**使用元素集选择器时**\n![](/server/static/images/a7aff1d4-ad56-430f-a6de-aace92b2f56d.png)![](/server/static/images/73d3b897-1656-4f2c-8e63-f75ec30e1d08.png)\n\n元素集选择器优先遍历内容块, 然后遍历css选择器, 使得数据维度得到统一, 缺失值也不会影响结果值\n\n元素集选择器优先遍历内容块, \"多元素属性\"的选择器会优先遍历选择器, 两个开始采集维度的不同, 会导致不同的结果.当采集字段中存在多个\"多元素属性\"的选择器且他们具有同一个父元素, 优先考虑将这些选择器置于元素集选择器中.\n\n### 选择器树形图\n![](/server/static/images/85d6f868-f03b-4c9e-b8c9-cd7ffc832029.png)\n显示各个层级的选择器关系\n\n### 下一步/保存选择器\n![](/server/static/images/48ab3a69-30c6-4707-b302-de21c4584294.png)\n开始或者保存任务\n\n# 查看/下载数据\n![](/server/static/images/85ff994f-659a-42e3-a253-40bb730c2a64.png)\n\n查看数据和下载已采集数据的页面\n\n# 读取配置\n![](/server/static/images/4b396b3a-c14e-4412-b0ac-566c08ac6946.png)\n\n开始或删除任务\n\n# 采集示例\n## \"多元素\"选择器 + 翻页(1)\n`http://www.51sole.com/s.aspx?q=PVC通风管`\n### 请求配置\n![](/server/static/images/c5c446a4-e1a5-403b-a5fc-3395af38237d.png)\n### 参数配置\n1.填写字段名称`商品名称`(唯一), 如果重复, 选择器保存失败\n2.选择 选择器类型\n3.\"点击选择\"按钮开启选择器\n4-5.分别点击同一列表中同一采集内容(自动匹配通用选择器, 无法匹配时会提示; 如采集单个选择, 只用点击选择器一次即可)\n6.点击确定按钮获取\"css选择器\"内容, 确定左侧\"键盘事件\"共绑定了一个按键, S键: 当前选择器, P键: 当前选择元素的父元素, C键: 当前选择元素的子元素\n7.选择\"多元素属性\"\n8.保存选择器\n![](/server/static/images/00a1e6e7-b30c-4754-8c57-6c89b2963296.png)\n\n同上, 采集`公司url`字段\n![](/server/static/images/2da8e8e6-d454-4713-9631-975644a15c81.png)\n\n点击下一页, 选择`翻页选择器`\n![](/server/static/images/3d7d1bfc-b673-40c2-9943-b4e537fc22a1.png)\n\n整体如下：\n主页面选择器：\n![](/server/static/images/5f5724f9-48dc-478b-93d2-b1fed42889d6.png)\n选择器层级：\n![](/server/static/images/c1284037-d84f-42c5-861f-d63c017fc7de.png)\n点击`下一步` `开始任务` 启动任务, 然后再主界面进行任务管理或者`查看数据`里下载数据\n![](/server/static/images/2137d59b-71b9-4f71-a5f8-8fb114eadfa6.png)\n\n## 元素集选择器+翻页(2)+详情\n`https://zhongshan.china.cn/search/fisnfv.shtml`\n### 参数配置\n1.选择`元素集选择器`\n![](/server/static/images/e9ba8329-9af2-46d3-82fe-904585d95132.png)\n\n2.配置`翻页选择器`(翻页选择器分两种, 点击选择和手动配置, 优先使用手动配置, 选择器有全局表单验证, 改起来太麻烦, 使用手动配置时, 随便填个值), 手动配置时, 翻页url中变动的参数 使用`%s`代替.\n![](/server/static/images/795c3e35-7b8c-4e2d-9bd9-4fbf87f619e7.png)\n\n3.进入`元素集选择器`内, 新建`产品名称`, `所在地`和`公司名称`选择器(在元素集选择器中, 默认以第一个元素集为模板, 其他范围内`点击选择`按钮无法生效)\n**注意**：在元素集选择器中不要选择\"多元素\"属性, 元素集选择器中的子选择器, 维度以`元素集选择器`为准.\n![](/server/static/images/e0d90b15-0d89-41a3-92bd-3b6b3d703f2a.jpg)\n\n4.配置`详情选择器`, 选择将要进入的标签, 保存\n![](/server/static/images/993f90b4-ee2c-4e02-9b1f-76549a343599.png)\n\n5.进入`详情选择器`, 在页面中点击详情链接\n\n6.进入详情页之后, 再配置一个`详情选择器`进入联系页\n![](/server/static/images/45afe047-fb6d-47b7-83b8-43216c5f396e.png)\n\n7.在联系页中, 选择`联系人` `电话` `地址`字段采集器\n![](/server/static/images/2e7f279e-0f2f-4b7c-bc2d-172f7ba8f75c.png)\n\n8.打开`选择器树形图`查看选择器层级\n![](/server/static/images/2f1eb188-2045-4864-9d2d-94303f8f8092.png)\n\n8.`下一步`开始任务, 注意请求间隔, 太快容易被封\n![](/server/static/images/e0b5824e-fa27-4b11-ba8c-2c9195e213fa.png)\n\n被封\n![](/server/static/images/4.png)\n\n9.查看/下载数据\n![](/server/static/images/294b2416-6e38-41d4-8989-5cb80904ed49.png)\n\n\n# 可能存在的问题\n# 动态解析\n动态解析网页太慢, 资源占用过高, 显示内容和爬取内容不同, 造成显示内容和爬取内容不同主要因为网站自带js的运行导致的, 如果取消爬取网站自带js, 可能会造成依赖css无法加载, 前端展示效果极差和网页布局和渲染效果缺失, 留待以后解决.\n\n# 网页页模板不同\n`http://kungeina0315.51sole.com/companycontact.htm`\n`http://jing18028106510.51sole.com/companycontact.htm`\n\n![](/server/static/images/72c2b627-6338-41a7-8670-661cc7bf5dda.png)![](/server/static/images/699f21fd-0cae-4078-8c43-1f0823038d87.png)\n\n场景：两个详情页模板, 由于字段个数不同, 使用css选择器时, 对不同的模板选择字段, 会造成字段缺失或者错位的情况。 这两个页面中, 由于第二个页面多了\"传真\"和\"微信\"这两个字段, 导致相同的css选择器在匹配第一个页面的同时, 匹配第二个页面时\"传真\"字段之后的css选择器选择的字段值错位.\n\n处理：使用css选择器选择整个内容块, 然后使用正则表达式提取采集的内容\n\n![](/server/static/images/396e4817-df36-4f9d-81f0-90d63b2a41a3.png)\n\n如图所示: 采集\"手机\"字段, 选择整个内容块, 然后使用正则表达式提取.\n\n# 选择器无法选中\n![](/server/static/images/1c0aeff2-0045-48f9-80d5-3b070b42e490.png)![](/server/static/images/bb25525b-648f-4a10-a271-e8ca7751e24c.png)\n`点击选择`按钮很难选中元素时, 可以先选择他的父元素或子元素, 然后使用键盘按钮C或P调整.\n`点击选择`没有反应, 本平台将采集网页放在本域名内, 跨域导致有些资源加载异常, 使得采集脚本无法加载, 此时只能手动填写css选择器."
  },
  {
    "path": "client/build/common.js",
    "content": "webpackJsonp([0],[function(e,t,n){\"use strict\";var s=n(1),i=(s.FancyWebSocket,n(3)),o=n(454);$(window).ready(function(){i.install(\"monitor\"),o.installHeader(\"process-stats\")})},,,function(e,t,n){\"use strict\";function s(e){i.render(i.createElement(u,null),document.getElementById(e))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.install=s;var i=n(4),o=n(160),r=n(180),c=r.Label,a=n(260),l=i.createClass({displayName:\"ConnectionMonitorWidget\",STATE_CLASSES:{offline:\"danger\",online:\"info\",crawling:\"success\"},render:function(){var e=this.STATE_CLASSES[this.props.status]||\"default\";return i.createElement(c,{bsStyle:e,title:\"reconnect\",style:{cursor:\"pointer\"},onClick:this.onClick},this.props.status)},onClick:function(){a.Actions.reconnect()}}),u=i.createClass({displayName:\"ConnectionMonitor\",mixins:[o.connect(a.store,\"status\")],render:function(){return i.createElement(l,{status:this.state.status})}})}]);"
  },
  {
    "path": "client/build/main.js",
    "content": "webpackJsonp([1],{0:function(e,t,r){\"use strict\";var n=r(4),a=r(463),o=a.Route,s=a.RouteHandler,l=(a.Link,a.DefaultRoute),c=a.NotFoundRoute,i=r(505),u=i.IndexPage,d=r(509),m=d.JobPage,p=n.createClass({displayName:\"NotFound\",render:function(){return n.createElement(\"div\",null,n.createElement(\"h2\",null,\"404 找不到网页\"),n.createElement(\"p\",null,\"您试图访问的页面不存在.\"))}}),h=n.createClass({displayName:\"App\",render:function(){return n.createElement(s,null)}}),E=n.createElement(o,{path:\"/\",handler:h},n.createElement(l,{handler:u,name:\"index\"}),n.createElement(o,{path:\"job/:id\",handler:m,name:\"job\"}),n.createElement(c,{handler:p}));a.run(E,a.HashLocation,function(e){n.render(n.createElement(e,null),document.getElementById(\"root\"))})},505:function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(4),a=r(180),o=a.Panel,s=r(506),l=s.JobList,c=r(508),i=c.AggregateJobStats,u=r(454),d=u.ProcessStatsTable,m=n.createClass({displayName:\"IndexPage\",render:function(){return n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"col-lg-7 col-md-7\"},n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"任务\",bsStyle:\"primary\"},n.createElement(l,null)),n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"系统状态\",className:\"hidden-lg\"},n.createElement(d,null))),n.createElement(\"div\",{className:\"col-lg-5 col-md-5\"},n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"系统状态\",className:\"visible-lg-block\"},n.createElement(d,null)),n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"爬虫状态\"},n.createElement(i,null))))}});t.IndexPage=m},506:function(e,t,r){\"use strict\";function n(e){for(var t=0;t<w.length;t++){var r=c(w[t],2),n=r[0],a=r[1];if(n.test(e))return a}return e}function a(e){var e=n(e);return\"crawling\"==e?{pause:!0,stop:!0}:\"suspended\"==e?{resume:!0,stop:!0}:{}}function o(e){var t=e.stats.item_scraped_count||0,r=Math.round(60*e.itemsSpeed);return t+\" @ \"+r+\"/min\"}function s(e,t){var r=e.stats||{},a=n(e.status),o=r[\"downloader/response_bytes\"]||0,s=e.id;e.job_id&&(s=s+\": \"+e.job_id.slice(-5));var l=0;if(r.start_time){var c=P(r.start_time);if(r.finish_time)var i=P(r.finish_time);else var i=t||new Date;l=i.getTime()-c.getTime()}var u=l/1e3,d=l?o/u:0,m=l?(r.item_scraped_count||0)/u:0;return{id:e.job_id||e.id,status:a,rowClass:N[a]||\"\",stats:r,downloaded:o,downloadSpeed:d,itemsSpeed:m,todo:(r[\"scheduler/enqueued\"]||0)-(r[\"scheduler/dequeued\"]||0),shortId:s,duration:l}}Object.defineProperty(t,\"__esModule\",{value:!0});var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},c=function(){function e(e,t){var r=[],n=!0,a=!1,o=void 0;try{for(var s,l=e[Symbol.iterator]();!(n=(s=l.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){a=!0,o=e}finally{try{!n&&l.return&&l.return()}finally{if(a)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}();t.buttonsForStatus=a;var i=r(4),u=r(160),d=r(455),m=r(456),p=r(463),h=(p.Link,p.Navigation),E=r(180),b=E.Table,f=E.Glyphicon,y=(E.Button,r(451)),v=r(507),_=v.JobsMixin,g=r(461);r(261);var N={crawling:\"success\",stopping:\"info\",suspended:\"warning\",done:\"\"},w=[[/closespider/,\"closed\"]],k=i.createClass({displayName:\"NoJobs\",render:function(){return i.createElement(\"div\",null,i.createElement(\"p\",null,\"没有任务运行.\"),i.createElement(\"p\",null,'请通过\"新增任务\"或\"读取配置\"开始采集.'))}}),j=i.createClass({displayName:\"GlyphA\",render:function(){var e=this.props.button?\" \"+this.props.title:\"\";return i.createElement(\"a\",l({href:\"#\"},this.props),i.createElement(f,{glyph:this.props.glyph}),e)}}),C=i.createClass({displayName:\"JobStopButton\",render:function(){return i.createElement(j,{title:\"Stop\",glyph:\"stop\",onClick:this.onClick,button:this.props.button,className:this.props.className})},onClick:function(e){e.preventDefault();var t=this.props.job.id;confirm(\"Stop job #\"+t+\"?\")&&y.Actions.stopCrawl(t)}});t.JobStopButton=C;var J=i.createClass({displayName:\"JobPauseButton\",render:function(){return i.createElement(j,{title:\"Pause\",glyph:\"pause\",onClick:this.onClick,button:this.props.button,className:this.props.className})},onClick:function(e){e.preventDefault(),y.Actions.pauseCrawl(this.props.job.id)}});t.JobPauseButton=J;var S=i.createClass({displayName:\"JobResumeButton\",render:function(){return i.createElement(j,{title:\"Resume\",glyph:\"play\",onClick:this.onClick,button:this.props.button,className:this.props.className})},onClick:function(e){e.preventDefault(),y.Actions.resumeCrawl(this.props.job.id)}});t.JobResumeButton=S;var T=i.createClass({displayName:\"JobControlIcons\",render:function(){var e=this.props.job,t=a(e.status),r={job:e},n=[];return t.pause&&n.push(i.createElement(\"span\",{key:\"pause\"},i.createElement(J,r),\"  \")),t.resume&&n.push(i.createElement(\"span\",{key:\"resume\"},i.createElement(S,r),\"  \")),t.stop&&n.push(i.createElement(C,l({key:\"stop\"},r))),i.createElement(\"span\",null,n)}});t.JobControlIcons=T;var x=i.createClass({displayName:\"JobControlButtons\",render:function(){var e=this.props.job,t=a(e.status),r={button:!0,job:e},n=[];return t.pause&&n.push(i.createElement(\"span\",{key:\"pause\"},i.createElement(J,l({className:\"btn\"},r)),\"  \")),t.resume&&n.push(i.createElement(\"span\",{key:\"resume\"},i.createElement(S,l({className:\"btn\"},r)),\"  \")),t.stop&&n.push(i.createElement(C,l({key:\"stop\",className:\"btn\"},r))),i.createElement(\"span\",null,n)}});t.JobControlButtons=x;var P=function(e){var e=e.replace(\" \",\"T\");return new Date(e+\"Z\")},A=i.createClass({displayName:\"JobRow\",mixins:[h],render:function(){var e=this,t=this.props.job,r=s(t,this.props.serverTime),n={cursor:\"pointer\"},a=function(){e.transitionTo(\"job\",{id:t.id})},l=[i.createElement(\"td\",{key:\"col-buttons\"},i.createElement(T,{job:t})),i.createElement(\"th\",{key:\"col-id\",scope:\"row\",style:n,onClick:a},r.shortId)],c=[t.seed,r.status,o(r),d(r.downloaded),m(r.duration)];return l=l.concat(c.map(function(e,t){return i.createElement(\"td\",{style:n,onClick:a,key:t},e)})),i.createElement(\"tr\",{className:r.rowClass},l)}}),R=i.createClass({displayName:\"JobRowVerbose\",mixins:[h],render:function(){var e=this.props.job,t=s(e,this.props.serverTime),r=[i.createElement(\"th\",{key:\"col-id\",scope:\"row\"},t.id)],n=[e.seed,t.stats.start_time,t.status,o(t),t.todo,d(t.downloaded),d(t.downloadSpeed,{round:1})+\"/s\",m(t.duration)];return r=r.concat(n.map(function(e,t){return i.createElement(\"td\",{key:t},e)})),i.createElement(\"tr\",{className:t.rowClass},r)}}),q=i.createClass({displayName:\"JobListWidget\",mixins:[u.connect(g.store,\"stats\")],render:function(){var e=this.state.stats,t=this.props.jobs.map(function(t){return i.createElement(A,{job:t,key:t.id,serverTime:e.serverTime})});return i.createElement(b,{fill:!0,hover:this.props.link},i.createElement(\"thead\",null,i.createElement(\"tr\",null,i.createElement(\"th\",{key:\"col-buttons\"}),i.createElement(\"th\",{key:\"col-id\"},\"ID\"),i.createElement(\"th\",{key:\"col-seed\"},\"主域名\"),i.createElement(\"th\",{key:\"col-status\"},\"状态\"),i.createElement(\"th\",{key:\"col-items\"},\"速率\"),i.createElement(\"th\",{key:\"col-data\",className:\"col-md-2\"},\"数据量\"),i.createElement(\"th\",{key:\"col-runtime\",className:\"col-md-2\"},\"用时\"))),i.createElement(\"tbody\",null,t))}});t.JobListWidget=q;var I=i.createClass({displayName:\"JobListWidgetVerbose\",mixins:[u.connect(g.store,\"stats\")],render:function(){var e=this.state.stats,t=this.props.jobs.map(function(t){return i.createElement(R,{job:t,key:t.id,serverTime:e.serverTime})});return i.createElement(b,{fill:!0},i.createElement(\"thead\",null,i.createElement(\"tr\",null,i.createElement(\"th\",{key:\"col-id\"},\"ID\"),i.createElement(\"th\",{key:\"col-seed\"},\"主域名\"),i.createElement(\"th\",{key:\"col-started\"},\"开始时间\"),i.createElement(\"th\",{key:\"col-status\"},\"状态\"),i.createElement(\"th\",{key:\"col-items\"},\"速率\"),i.createElement(\"th\",{key:\"col-queue\"},\"待请求\"),i.createElement(\"th\",{key:\"col-data\",className:\"col-md-1\"},\"数据量\"),i.createElement(\"th\",{key:\"col-speed\",className:\"col-md-1\"},\"↓ 网速\"),i.createElement(\"th\",{key:\"col-runtime\"},\"用时\"))),i.createElement(\"tbody\",null,t))}});t.JobListWidgetVerbose=I;var O=i.createClass({displayName:\"JobList\",mixins:[_],render:function(){var e=this.state.jobs;return e.length?i.createElement(q,{jobs:e}):i.createElement(k,null)}});t.JobList=O},507:function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=(r(4),r(160)),a=r(451),o=n.connect(a.store,\"jobs\");t.JobsMixin=o},508:function(e,t,r){\"use strict\";function n(e){return Object.keys(e).map(function(t){var r=e[t];if(0==r)return\"\";/_bytes$|memusage/.test(t)&&(r=o(r));var n=E[t]||t;return a.createElement(\"tr\",{key:t},a.createElement(\"td\",null,n),a.createElement(\"td\",null,r))}).filter(function(e){return\"\"!=e})}Object.defineProperty(t,\"__esModule\",{value:!0});var a=r(4),o=(r(160),r(455)),s=r(180),l=(s.Table,r(462)),c=l.KeyValueTable,i=(r(451),r(507)),u=i.JobsMixin,d=function(e){return Array.from(new Array(e),function(e,t){return t})},m=[200,201,202,203,204,205,206,207,226,300,301,302,303,304,305,306,307,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,422,423,424,425,426,428,429,431,434,449,451,456,499,500,501,502,503,504,505,506,507,508,509,510,511].map(function(e){return\"downloader/response_status_count/\"+e}),p=d(20).map(function(e){return\"request_depth_count/\"+e}),h=[\"downloader/request_bytes\",\"downloader/request_count\",\"downloader/request_method_count/GET\",\"downloader/request_method_count/POST\",\"downloader/request_method_count/PUT\",\"downloader/request_method_count/HEAD\",\"downloader/request_method_count/DELETE\",\"downloader/request_method_count/TRACE\",\"downloader/request_method_count/CONNECT\",\"downloader/request_method_count/OPTIONS\",\"downloader/response_bytes\",\"downloader/response_count\"].concat(m).concat([\"downloader/exception_count\",\"downloader/exception_type_count/twisted.internet.error.DNSLookupError\",\"downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError\",\"dupefilter/filtered\",\"item_scraped_count\",\"log_count/DEBUG\",\"log_count/INFO\",\"log_count/WARNING\",\"log_count/ERROR\",\"response_received_count\",\"scheduler/dequeued\",\"scheduler/dequeued/memory\",\"scheduler/enqueued\",\"scheduler/enqueued/memory\"]).concat(p).concat([\"spider_exceptions/AttributeError\",\"spider_exceptions/ValueError\",\"spider_exceptions/TypeError\"]).concat([\"motor/items_stored_count\",\"motor/store_error_count\",\"motor/store_error_count/AutoReconnect\"]),E={\"downloader/exception_type_count/twisted.internet.error.DNSLookupError\":\"downloader/DNS errors\",\"downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError\":\"downloader/Connection Refused\"},b=a.createClass({displayName:\"AggregateJobStats\",mixins:[u],render:function(){var e=this.getAggregateStats(this.state.jobs),t=n(e);return 0==t.length?a.createElement(\"p\",null,\"This panel displays various crawl stats. Nothing to show yet.\"):a.createElement(c,{noheader:this.props.fill},t)},getAggregateStats:function(e){var t={};return h.forEach(function(e){t[e]=0}),e.forEach(function(e){h.forEach(function(r){t[r]+=e.stats[r]||0})}),t}});t.AggregateJobStats=b;var f=a.createClass({displayName:\"JobStats\",render:function(){var e=this.props.job.stats,t={};Object.keys(e).sort().forEach(function(r){t[r]=e[r]});var r=n(t);return 0==r.length?a.createElement(\"p\",null,\"Nothing to show yet.\"):a.createElement(c,{noheader:this.props.fill},r)}});t.JobStats=f},509:function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(4),a=r(160),o=r(463),s=o.Link,l=r(180),c=l.Panel,i=l.Table,u=(l.Button,l.Glyphicon),d=(l.ButtonToolbar,r(451)),m=r(454),p=(m.ProcessStatsTable,r(508)),h=p.JobStats,E=r(506),b=E.JobListWidgetVerbose,f=E.JobControlButtons,y=r(510),v=y.ShortTermQueueWidget,_=n.createClass({displayName:\"ShortJobInfo\",render:function(){var e=this.props.job,t=[e];return n.createElement(b,{jobs:t})}}),g=(n.createClass({displayName:\"JobInfo\",render:function(){var e=this.props.job,t=[[\"Target\",e.seed],[\"Status\",e.status],[\"Job ID\",e.id],[\"Started at\",e.stats.start_time]];e.stats.finish_time&&t.push([\"Finished at\",e.stats.finish_time]);var r=t.map(function(e){return n.createElement(\"tr\",{key:e[0]},n.createElement(\"td\",null,e[0]),n.createElement(\"td\",null,e[1]))});return n.createElement(\"div\",null,n.createElement(i,null,n.createElement(\"caption\",null,\"General Job Information\"),n.createElement(\"tbody\",null,r)))}}),n.createClass({displayName:\"NoJobPage\",render:function(){return n.createElement(\"div\",null,n.createElement(\"h2\",null,\"Job is not found\"),n.createElement(\"p\",null,\"This job is either not available or never existed.\"),n.createElement(s,{to:\"index\"},n.createElement(u,{glyph:\"menu-left\"}),\"  Back to Full Job List\"))}})),N=n.createClass({displayName:\"JobPage\",mixins:[a.connectFilter(d.store,\"job\",function(e){var t=this;return e.filter(function(e){return e.id==t.props.params.id})[0]})],render:function(){var e=this.state.job;return e?n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"col-lg-12\"},n.createElement(s,{to:\"index\",className:\"btn\"},n.createElement(u,{glyph:\"menu-left\"}),\" 全部任务\"),\"  \",n.createElement(f,{job:e}),n.createElement(\"br\",null),n.createElement(\"br\",null),n.createElement(_,{job:e}))),n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"col-lg-5\"},n.createElement(c,{collapsible:!0,defaultExpanded:!0,header:\"爬虫统计\"},n.createElement(h,{job:e}))),n.createElement(\"div\",{className:\"col-lg-7\"},n.createElement(c,{collapsible:!0,defaultExpanded:!0,header:\"请求队列\"},n.createElement(v,{job:e}))))):n.createElement(g,null)}});t.JobPage=N},510:function(e,t,r){\"use strict\";function n(e,t){var r=new Date,n={};return e.forEach(function(e){n[e]=r}),Object.keys(t).filter(function(e){return n[e]}).forEach(function(e){n[e]=t[e]}),n}function a(e,t){var r=e.slice();return r.sort(function(e,r){return t[e.url]-t[r.url]}),r}Object.defineProperty(t,\"__esModule\",{value:!0});var o=r(511),s=(r(160),r(455),r(456)),l=r(180),c=l.Table,i=(r(451),r(507)),u=(i.JobsMixin,o.createClass({displayName:\"ShortTermQueueWidget\",propTypes:{job:o.PropTypes.object.isRequired},getInitialState:function(){return{seenAt:{}}},componentWillReceiveProps:function(e){var t=e.job.downloads.active.map(function(e){return e.url});this.setState({seenAt:n(t,this.state.seenAt)})},render:function(){var e=this,t=this.props.job.downloads,r=a(t.active,this.state.seenAt);if(!r.length)return!1;var n=function(t){var r=a(t.active,e.state.seenAt),n={};t.transferring.forEach(function(e){return n[e.url]=!0});var l=r.map(function(e){var t=n[e.url]?\"success\":\"default\";return o.createElement(\"tr\",{key:e.url,className:t},o.createElement(\"td\",null,e.url))}),i=s(1e3*(t.delay||0));return o.createElement(c,{key:t.key},o.createElement(\"caption\",null,t.key,\"  \",o.createElement(\"span\",{className:\"pull-right\"},\"download delay: \",i)),o.createElement(\"tbody\",null,l))},l=t.slots.map(function(e){return n(e)});return o.createElement(\"div\",null,l)}}));t.ShortTermQueueWidget=u}});"
  },
  {
    "path": "client/build/vendor.js",
    "content": "!function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(i,a){for(var s,u,l=0,c=[];l<i.length;l++)u=i[l],o[u]&&c.push.apply(c,o[u]),o[u]=0;for(s in a)Object.prototype.hasOwnProperty.call(a,s)&&(e[s]=a[s]);for(n&&n(i,a);c.length;)c.shift().call(null,t);if(a[0])return r[0]=0,t(0)};var r={},o={2:0};return t.e=function(e,n){if(0===o[e])return n.call(null,t);if(void 0!==o[e])o[e].push(n);else{o[e]=[n];var r=document.getElementsByTagName(\"head\")[0],i=document.createElement(\"script\");i.type=\"text/javascript\",i.charset=\"utf-8\",i.async=!0,i.src=t.p+\"\"+e+\".\"+({0:\"common\",1:\"main\"}[e]||e)+\".js\",r.appendChild(i)}},t.m=e,t.c=r,t.p=\"\",t(0)}([function(e,t,n){n(4),n(511),n(180),n(463),n(160),e.exports=n(2)},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(2),a={},s=function(){function e(t){r(this,e),this._ee=new i,this._connect(t)}return o(e,[{key:\"_connect\",value:function(e){var t=this;this._conn=new WebSocket(e),this._conn.onmessage=function(e){var n=JSON.parse(e.data);t._ee.emit(n.event,n.data)},this._conn.onopen=function(){t._ee.emit(\"open\",null)},this._conn.onclose=function(e){t._ee.emit(\"close\",e)},this._conn.onerror=function(e){t._ee.emit(\"error\",e)},this._url=e}},{key:\"reconnect\",value:function(){this._conn.close(),this._connect(this._url)}},{key:\"on\",value:function(e,t){this._ee.on(e,t)}},{key:\"off\",value:function(e,t){this._ee.off(e,t)}},{key:\"once\",value:function(e,t){this._ee.once(e,t)}},{key:\"send\",value:function(e,t){var n=JSON.stringify({event:e,data:t});this._conn.send(n)}}],[{key:\"forEndpoint\",value:function(t){if(a[t])return a[t];var n=document.location,r=\"ws://\"+n.hostname+\":\"+n.port+t,o=new e(r);return a[t]=o,o}},{key:\"instance\",value:function(){return e.forEndpoint(window.WS_SERVER_ADDRESS)}}]),e}();t.FancyWebSocket=s},function(e,t,n){\"use strict\";function r(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(){}var i=Object.prototype.hasOwnProperty,a=\"function\"!=typeof Object.create&&\"~\";o.prototype._events=void 0,o.prototype.eventNames=function(){var e,t=this._events,n=[];if(!t)return n;for(e in t)i.call(t,e)&&n.push(a?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(e,t){var n=a?a+e:e,r=this._events&&this._events[n];if(t)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,s=new Array(i);o<i;o++)s[o]=r[o].fn;return s},o.prototype.emit=function(e,t,n,r,o,i){var s=a?a+e:e;if(!this._events||!this._events[s])return!1;var u,l,c=this._events[s],p=arguments.length;if(\"function\"==typeof c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),p){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,r),!0;case 5:return c.fn.call(c.context,t,n,r,o),!0;case 6:return c.fn.call(c.context,t,n,r,o,i),!0}for(l=1,u=new Array(p-1);l<p;l++)u[l-1]=arguments[l];c.fn.apply(c.context,u)}else{var f,d=c.length;for(l=0;l<d;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),p){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;default:if(!u)for(f=1,u=new Array(p-1);f<p;f++)u[f-1]=arguments[f];c[l].fn.apply(c[l].context,u)}}return!0},o.prototype.on=function(e,t,n){var o=new r(t,n||this),i=a?a+e:e;return this._events||(this._events=a?{}:Object.create(null)),this._events[i]?this._events[i].fn?this._events[i]=[this._events[i],o]:this._events[i].push(o):this._events[i]=o,this},o.prototype.once=function(e,t,n){var o=new r(t,n||this,!0),i=a?a+e:e;return this._events||(this._events=a?{}:Object.create(null)),this._events[i]?this._events[i].fn?this._events[i]=[this._events[i],o]:this._events[i].push(o):this._events[i]=o,this},o.prototype.removeListener=function(e,t,n,r){var o=a?a+e:e;if(!this._events||!this._events[o])return this;var i=this._events[o],s=[];if(t)if(i.fn)(i.fn!==t||r&&!i.once||n&&i.context!==n)&&s.push(i);else for(var u=0,l=i.length;u<l;u++)(i[u].fn!==t||r&&!i[u].once||n&&i[u].context!==n)&&s.push(i[u]);return s.length?this._events[o]=1===s.length?s[0]:s:delete this._events[o],this},o.prototype.removeAllListeners=function(e){return this._events?(e?delete this._events[a?a+e:e]:this._events=a?{}:Object.create(null),this):this},o.prototype.off=o.prototype.removeListener,o.prototype.addListener=o.prototype.on,o.prototype.setMaxListeners=function(){return this},o.prefixed=a,e.exports=o},,function(e,t,n){e.exports=n(5)},function(e,t,n){(function(t){\"use strict\";var r=n(7),o=n(11),i=n(25),a=n(40),s=n(15),u=n(20),l=n(14),c=n(35),p=n(43),f=n(45),d=n(94),h=n(22),v=n(70),m=n(31),y=n(125),g=n(32),b=n(157),E=n(16),_=n(114),O=n(159);d.inject();var N=l.createElement,w=l.createFactory,C=l.cloneElement;\"production\"!==t.env.NODE_ENV&&(N=c.createElement,w=c.createFactory,C=c.cloneElement);var P=m.measure(\"React\",\"render\",v.render),x={Children:{map:o.map,forEach:o.forEach,count:o.count,only:O},Component:i,DOM:p,PropTypes:y,initializeTouchEvents:function(e){r.useTouchEvents=e},createClass:a.createClass,createElement:N,cloneElement:C,createFactory:w,createMixin:function(e){return e},constructAndRenderComponent:v.constructAndRenderComponent,constructAndRenderComponentByID:v.constructAndRenderComponentByID,findDOMNode:_,render:P,renderToString:b.renderToString,renderToStaticMarkup:b.renderToStaticMarkup,unmountComponentAtNode:v.unmountComponentAtNode,isValidElement:l.isValidElement,withContext:s.withContext,__spread:E};if(\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({CurrentOwner:u,InstanceHandles:h,Mount:v,Reconciler:g,TextComponent:f}),\"production\"!==t.env.NODE_ENV){var T=n(54);if(T.canUseDOM&&window.top===window.self){navigator.userAgent.indexOf(\"Chrome\")>-1&&\"undefined\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&console.debug(\"Download the React DevTools for a better development experience: https://fb.me/react-devtools\");for(var D=[Array.isArray,Array.prototype.every,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.map,Date.now,Function.prototype.bind,Object.keys,String.prototype.split,String.prototype.trim,Object.create,Object.freeze],M=0;M<D.length;M++)if(!D[M]){console.error(\"One or more ES5 shim/shams expected by React are not available: https://fb.me/react-warning-polyfills\");break}}}x.version=\"0.13.3\",e.exports=x}).call(t,n(6))},function(e,t){function n(){throw new Error(\"setTimeout has not been defined\")}function r(){throw new Error(\"clearTimeout has not been defined\")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){v&&d&&(v=!1,d.length?h=d.concat(h):m=-1,h.length&&s())}function s(){if(!v){var e=o(a);v=!0;for(var t=h.length;t;){for(d=h,h=[];++m<t;)d&&d[m].run();m=-1,t=h.length}d=null,v=!1,i(e)}}function u(e,t){this.fun=e,this.array=t}function l(){}var c,p,f=e.exports={};!function(){try{c=\"function\"==typeof setTimeout?setTimeout:n}catch(e){c=n}try{p=\"function\"==typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var d,h=[],v=!1,m=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];h.push(new u(e,t)),1!==h.length||v||o(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\"browser\",f.browser=!0,f.env={},f.argv=[],f.version=\"\",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(e){return[]},f.binding=function(e){throw new Error(\"process.binding is not supported\")},f.cwd=function(){return\"/\"},f.chdir=function(e){throw new Error(\"process.chdir is not supported\")},f.umask=function(){return 0}},function(e,t,n){(function(t){\"use strict\";function r(e){return e===y.topMouseUp||e===y.topTouchEnd||e===y.topTouchCancel}function o(e){return e===y.topMouseMove||e===y.topTouchMove}function i(e){return e===y.topMouseDown||e===y.topTouchStart}function a(e,n){var r=e._dispatchListeners,o=e._dispatchIDs;if(\"production\"!==t.env.NODE_ENV&&d(e),Array.isArray(r))for(var i=0;i<r.length&&!e.isPropagationStopped();i++)n(e,r[i],o[i]);else r&&n(e,r,o)}function s(e,t,n){e.currentTarget=m.Mount.getNode(n);var r=t(e,n);return e.currentTarget=null,r}function u(e,t){a(e,t),e._dispatchListeners=null,e._dispatchIDs=null}function l(e){var n=e._dispatchListeners,r=e._dispatchIDs;if(\"production\"!==t.env.NODE_ENV&&d(e),Array.isArray(n)){for(var o=0;o<n.length&&!e.isPropagationStopped();o++)if(n[o](e,r[o]))return r[o]}else if(n&&n(e,r))return r;return null}function c(e){var t=l(e);return e._dispatchIDs=null,e._dispatchListeners=null,t}function p(e){\"production\"!==t.env.NODE_ENV&&d(e);var n=e._dispatchListeners,r=e._dispatchIDs;\"production\"!==t.env.NODE_ENV?v(!Array.isArray(n),\"executeDirectDispatch(...): Invalid `event`.\"):v(!Array.isArray(n));var o=n?n(e,r):null;return e._dispatchListeners=null,e._dispatchIDs=null,o}function f(e){return!!e._dispatchListeners}var d,h=n(8),v=n(10),m={Mount:null,injectMount:function(e){m.Mount=e,\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?v(e&&e.getNode,\"EventPluginUtils.injection.injectMount(...): Injected Mount module is missing getNode.\"):v(e&&e.getNode))}},y=h.topLevelTypes;\"production\"!==t.env.NODE_ENV&&(d=function(e){var n=e._dispatchListeners,r=e._dispatchIDs,o=Array.isArray(n),i=Array.isArray(r),a=i?r.length:r?1:0,s=o?n.length:n?1:0;\"production\"!==t.env.NODE_ENV?v(i===o&&a===s,\"EventPluginUtils: Invalid `event`.\"):v(i===o&&a===s)});var g={isEndish:r,isMoveish:o,isStartish:i,executeDirectDispatch:p,executeDispatch:s,executeDispatchesInOrder:u,executeDispatchesInOrderStopAtTrue:c,hasDispatches:f,injection:m,useTouchEvents:!1};e.exports=g}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(9),o=r({bubbled:null,captured:null}),i=r({topBlur:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topError:null,topFocus:null,topInput:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topReset:null,topScroll:null,topSelectionChange:null,topSubmit:null,topTextInput:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topWheel:null}),a={topLevelTypes:i,PropagationPhases:o};e.exports=a},function(e,t,n){(function(t){\"use strict\";var r=n(10),o=function(e){var n,o={};\"production\"!==t.env.NODE_ENV?r(e instanceof Object&&!Array.isArray(e),\"keyMirror(...): Argument must be an object.\"):r(e instanceof Object&&!Array.isArray(e));for(n in e)e.hasOwnProperty(n)&&(o[n]=n);return o};e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var n=function(e,n,r,o,i,a,s,u){if(\"production\"!==t.env.NODE_ENV&&void 0===n)throw new Error(\"invariant requires an error message argument\");if(!e){var l;if(void 0===n)l=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[r,o,i,a,s,u],p=0;l=new Error(\"Invariant Violation: \"+n.replace(/%s/g,function(){return c[p++]}))}throw l.framesToPop=1,l}};e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,t){this.forEachFunction=e,this.forEachContext=t}function o(e,t,n,r){var o=e;o.forEachFunction.call(o.forEachContext,t,r)}function i(e,t,n){if(null==e)return e;var i=r.getPooled(t,n);d(e,o,i),r.release(i)}function a(e,t,n){this.mapResult=e,this.mapFunction=t,this.mapContext=n}function s(e,n,r,o){var i=e,a=i.mapResult,s=!a.hasOwnProperty(r);if(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?h(s,\"ReactChildren.map(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.\",r):null),s){var u=i.mapFunction.call(i.mapContext,n,o);a[r]=u}}function u(e,t,n){if(null==e)return e;var r={},o=a.getPooled(r,t,n);return d(e,s,o),a.release(o),f.create(r)}function l(e,t,n,r){return null}function c(e,t){return d(e,l,null)}var p=n(12),f=n(13),d=n(21),h=n(18),v=p.twoArgumentPooler,m=p.threeArgumentPooler;p.addPoolingTo(r,v),p.addPoolingTo(a,m);var y={forEach:i,map:u,count:c};e.exports=y}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(10),o=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},i=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},a=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},s=function(e,t,n,r,o){var i=this;if(i.instancePool.length){var a=i.instancePool.pop();return i.call(a,e,t,n,r,o),a}return new i(e,t,n,r,o)},u=function(e){var n=this;\"production\"!==t.env.NODE_ENV?r(e instanceof n,\"Trying to release an instance into a pool of a different type.\"):r(e instanceof n),e.destructor&&e.destructor(),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},l=10,c=o,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||c,n.poolSize||(n.poolSize=l),n.release=u,n},f={addPoolingTo:p,oneArgumentPooler:o,twoArgumentPooler:i,threeArgumentPooler:a,fiveArgumentPooler:s};e.exports=f}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(14),o=n(18);if(\"production\"!==t.env.NODE_ENV){var i=\"_reactFragment\",a=\"_reactDidWarn\",s=!1;try{var u=function(){return 1};Object.defineProperty({},i,{enumerable:!1,value:!0}),Object.defineProperty({},\"key\",{enumerable:!0,get:u}),s=!0}catch(e){}var l=function(e,n){Object.defineProperty(e,n,{enumerable:!0,get:function(){return\"production\"!==t.env.NODE_ENV?o(this[a],\"A ReactFragment is an opaque type. Accessing any of its properties is deprecated. Pass it to one of the React.Children helpers.\"):null,this[a]=!0,this[i][n]},set:function(e){\"production\"!==t.env.NODE_ENV?o(this[a],\"A ReactFragment is an immutable opaque type. Mutating its properties is deprecated.\"):null,this[a]=!0,this[i][n]=e}})},c={},p=function(e){var t=\"\";for(var n in e)t+=n+\":\"+typeof e[n]+\",\";var r=!!c[t];return c[t]=!0,r}}var f={create:function(e){if(\"production\"!==t.env.NODE_ENV){if(\"object\"!=typeof e||!e||Array.isArray(e))return\"production\"!==t.env.NODE_ENV?o(!1,\"React.addons.createFragment only accepts a single object.\",e):null,e;if(r.isValidElement(e))return\"production\"!==t.env.NODE_ENV?o(!1,\"React.addons.createFragment does not accept a ReactElement without a wrapper object.\"):null,e;if(s){var n={};Object.defineProperty(n,i,{enumerable:!1,value:e}),Object.defineProperty(n,a,{writable:!0,enumerable:!1,value:!1});for(var u in e)l(n,u);return Object.preventExtensions(n),n}}return e},extract:function(e){return\"production\"!==t.env.NODE_ENV&&s?e[i]?e[i]:(\"production\"!==t.env.NODE_ENV?o(p(e),\"Any use of a keyed object should be wrapped in React.addons.createFragment(object) before being passed as a child.\"):null,e):e},extractIfFragment:function(e){if(\"production\"!==t.env.NODE_ENV&&s){if(e[i])return e[i];for(var n in e)if(e.hasOwnProperty(n)&&r.isValidElement(e[n]))return f.extract(e)}return e}};e.exports=f}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n){Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:function(){return this._store?this._store[n]:null},set:function(e){\"production\"!==t.env.NODE_ENV?u(!1,\"Don't set the %s property of the React element. Instead, specify the correct value when initially creating the element.\",n):null,this._store[n]=e}})}function o(e){try{var t={props:!0};for(var n in t)r(e,n);c=!0}catch(e){}}var i=n(15),a=n(20),s=n(16),u=n(18),l={key:!0,ref:!0},c=!1,p=function(e,n,r,o,i,a){if(this.type=e,this.key=n,this.ref=r,this._owner=o,this._context=i,\"production\"!==t.env.NODE_ENV){this._store={props:a,originalProps:s({},a)};try{Object.defineProperty(this._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0})}catch(e){}if(this._store.validated=!1,c)return void Object.freeze(this)}this.props=a};p.prototype={_isReactElement:!0},\"production\"!==t.env.NODE_ENV&&o(p.prototype),p.createElement=function(e,t,n){var r,o={},s=null,u=null;if(null!=t){u=void 0===t.ref?null:t.ref,s=void 0===t.key?null:\"\"+t.key;for(r in t)t.hasOwnProperty(r)&&!l.hasOwnProperty(r)&&(o[r]=t[r])}var c=arguments.length-2;if(1===c)o.children=n;else if(c>1){for(var f=Array(c),d=0;d<c;d++)f[d]=arguments[d+2];o.children=f}if(e&&e.defaultProps){var h=e.defaultProps;for(r in h)\"undefined\"==typeof o[r]&&(o[r]=h[r])}return new p(e,s,u,a.current,i.current,o)},p.createFactory=function(e){var t=p.createElement.bind(null,e);return t.type=e,t},p.cloneAndReplaceProps=function(e,n){var r=new p(e.type,e.key,e.ref,e._owner,e._context,n);return\"production\"!==t.env.NODE_ENV&&(r._store.validated=e._store.validated),r},p.cloneElement=function(e,t,n){var r,o=s({},e.props),i=e.key,u=e.ref,c=e._owner;if(null!=t){void 0!==t.ref&&(u=t.ref,c=a.current),void 0!==t.key&&(i=\"\"+t.key);for(r in t)t.hasOwnProperty(r)&&!l.hasOwnProperty(r)&&(o[r]=t[r])}var f=arguments.length-2;if(1===f)o.children=n;else if(f>1){for(var d=Array(f),h=0;h<f;h++)d[h]=arguments[h+2];o.children=d}return new p(e.type,i,u,c,e._context,o)},p.isValidElement=function(e){var t=!(!e||!e._isReactElement);return t},e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(16),o=n(17),i=n(18),a=!1,s={current:o,withContext:function(e,n){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?i(a,\"withContext is deprecated and will be removed in a future version. Use a wrapper component with getChildContext instead.\"):null,a=!0);var o,u=s.current;s.current=r({},u,e);try{o=n()}finally{s.current=u}return o}};e.exports=s}).call(t,n(6))},function(e,t){\"use strict\";function n(e,t){if(null==e)throw new TypeError(\"Object.assign target cannot be null or undefined\");for(var n=Object(e),r=Object.prototype.hasOwnProperty,o=1;o<arguments.length;o++){var i=arguments[o];if(null!=i){var a=Object(i);for(var s in a)r.call(a,s)&&(n[s]=a[s])}}return n}e.exports=n},function(e,t,n){(function(t){\"use strict\";var n={};\"production\"!==t.env.NODE_ENV&&Object.freeze(n),e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(19),o=r;\"production\"!==t.env.NODE_ENV&&(o=function(e,t){for(var n=[],r=2,o=arguments.length;r<o;r++)n.push(arguments[r]);if(void 0===t)throw new Error(\"`warning(condition, format, ...args)` requires a warning message argument\");if(t.length<10||/^[s\\W]*$/.test(t))throw new Error(\"The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: \"+t);if(0!==t.indexOf(\"Failed Composite propType: \")&&!e){var i=0,a=\"Warning: \"+t.replace(/%s/g,function(){return n[i++]});console.warn(a);try{throw new Error(a)}catch(e){}}}),e.exports=o}).call(t,n(6))},function(e,t){function n(e){return function(){return e}}function r(){}r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t){\"use strict\";var n={current:null};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e){return y[e]}function o(e,t){return e&&null!=e.key?a(e.key):t.toString(36)}function i(e){return(\"\"+e).replace(g,r)}function a(e){return\"$\"+i(e)}function s(e,n,r,i,u){var p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||l.isValidElement(e))return i(u,e,\"\"===n?v+o(e,0):n,r),1;var y,g,E,_=0;if(Array.isArray(e))for(var O=0;O<e.length;O++)y=e[O],g=(\"\"!==n?n+m:v)+o(y,O),E=r+_,_+=s(y,g,E,i,u);else{var N=f(e);if(N){var w,C=N.call(e);if(N!==e.entries)for(var P=0;!(w=C.next()).done;)y=w.value,g=(\"\"!==n?n+m:v)+o(y,P++),E=r+_,_+=s(y,g,E,i,u);else for(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?h(b,\"Using Maps as children is not yet fully supported. It is an experimental feature that might be removed. Convert it to a sequence / iterable of keyed ReactElements instead.\"):null,b=!0);!(w=C.next()).done;){var x=w.value;x&&(y=x[1],g=(\"\"!==n?n+m:v)+a(x[0])+m+o(y,0),E=r+_,_+=s(y,g,E,i,u))}}else if(\"object\"===p){\"production\"!==t.env.NODE_ENV?d(1!==e.nodeType,\"traverseAllChildren(...): Encountered an invalid child; DOM elements are not valid children of React components.\"):d(1!==e.nodeType);var T=c.extract(e);for(var D in T)T.hasOwnProperty(D)&&(y=T[D],g=(\"\"!==n?n+m:v)+a(D)+m+o(y,0),E=r+_,_+=s(y,g,E,i,u))}}return _}function u(e,t,n){return null==e?0:s(e,\"\",0,t,n)}var l=n(14),c=n(13),p=n(22),f=n(24),d=n(10),h=n(18),v=p.SEPARATOR,m=\":\",y={\"=\":\"=0\",\".\":\"=1\",\":\":\"=2\"},g=/[=.:]/g,b=!1;e.exports=u}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return d+e.toString(36)}function o(e,t){return e.charAt(t)===d||t===e.length}function i(e){return\"\"===e||e.charAt(0)===d&&e.charAt(e.length-1)!==d}function a(e,t){return 0===t.indexOf(e)&&o(t,e.length)}function s(e){return e?e.substr(0,e.lastIndexOf(d)):\"\"}function u(e,n){if(\"production\"!==t.env.NODE_ENV?f(i(e)&&i(n),\"getNextDescendantID(%s, %s): Received an invalid React DOM ID.\",e,n):f(i(e)&&i(n)),\"production\"!==t.env.NODE_ENV?f(a(e,n),\"getNextDescendantID(...): React has made an invalid assumption about the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.\",e,n):f(a(e,n)),e===n)return e;var r,s=e.length+h;for(r=s;r<n.length&&!o(n,r);r++);return n.substr(0,r)}function l(e,n){var r=Math.min(e.length,n.length);if(0===r)return\"\";for(var a=0,s=0;s<=r;s++)if(o(e,s)&&o(n,s))a=s;else if(e.charAt(s)!==n.charAt(s))break;var u=e.substr(0,a);return\"production\"!==t.env.NODE_ENV?f(i(u),\"getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s\",e,n,u):f(i(u)),u}function c(e,n,r,o,i,l){e=e||\"\",n=n||\"\",\"production\"!==t.env.NODE_ENV?f(e!==n,\"traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.\",e):f(e!==n);var c=a(n,e);\"production\"!==t.env.NODE_ENV?f(c||a(e,n),\"traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do not have a parent path.\",e,n):f(c||a(e,n));for(var p=0,d=c?s:u,h=e;;h=d(h,n)){var m;if(i&&h===e||l&&h===n||(m=r(h,c,o)),m===!1||h===n)break;\"production\"!==t.env.NODE_ENV?f(p++<v,\"traverseParentPath(%s, %s, ...): Detected an infinite loop while traversing the React DOM ID tree. This may be due to malformed IDs: %s\",e,n):f(p++<v)}}var p=n(23),f=n(10),d=\".\",h=d.length,v=100,m={createReactRootID:function(){return r(p.createReactRootIndex())},createReactID:function(e,t){return e+t},getReactRootIDFromNodeID:function(e){if(e&&e.charAt(0)===d&&e.length>1){var t=e.indexOf(d,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var i=l(e,t);i!==e&&c(e,i,n,r,!1,!0),i!==t&&c(i,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c(\"\",e,t,n,!0,!1),c(e,\"\",t,n,!1,!0))},traverseAncestors:function(e,t,n){c(\"\",e,t,n,!0,!1)},_getFirstCommonAncestorID:l,_getNextDescendantID:u,isAncestorIDOf:a,SEPARATOR:d};e.exports=m}).call(t,n(6))},function(e,t){\"use strict\";var n={injectCreateReactRootIndex:function(e){r.createReactRootIndex=e}},r={createReactRootIndex:null,injection:n};e.exports=r},function(e,t){\"use strict\";function n(e){var t=e&&(r&&e[r]||e[o]);if(\"function\"==typeof t)return t}var r=\"function\"==typeof Symbol&&Symbol.iterator,o=\"@@iterator\";e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e,t){this.props=e,this.context=t}var o=n(26),i=n(10),a=n(18);if(r.prototype.setState=function(e,n){\"production\"!==t.env.NODE_ENV?i(\"object\"==typeof e||\"function\"==typeof e||null==e,\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\"):i(\"object\"==typeof e||\"function\"==typeof e||null==e),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?a(null!=e,\"setState(...): You passed an undefined or null state object; instead, use forceUpdate().\"):null),o.enqueueSetState(this,e),n&&o.enqueueCallback(this,n)},r.prototype.forceUpdate=function(e){o.enqueueForceUpdate(this),e&&o.enqueueCallback(this,e)},\"production\"!==t.env.NODE_ENV){var s={getDOMNode:[\"getDOMNode\",\"Use React.findDOMNode(component) instead.\"],isMounted:[\"isMounted\",\"Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks.\"],replaceProps:[\"replaceProps\",\"Instead, call React.render again at the top level.\"],replaceState:[\"replaceState\",\"Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236).\"],setProps:[\"setProps\",\"Instead, call React.render again at the top level.\"]},u=function(e,n){try{Object.defineProperty(r.prototype,e,{get:function(){\"production\"!==t.env.NODE_ENV?a(!1,\"%s(...) is deprecated in plain JavaScript React classes. %s\",n[0],n[1]):null}})}catch(e){}};for(var l in s)s.hasOwnProperty(l)&&u(l,s[l])}e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){e!==i.currentlyMountingInstance&&l.enqueueUpdate(e)}function o(e,n){\"production\"!==t.env.NODE_ENV?p(null==a.current,\"%s(...): Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state.\",n):p(null==a.current);var r=u.get(e);return r?r===i.currentlyUnmountingInstance?null:r:(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?f(!n,\"%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op.\",n,n):null),null)}var i=n(27),a=n(20),s=n(14),u=n(28),l=n(29),c=n(16),p=n(10),f=n(18),d={enqueueCallback:function(e,n){\"production\"!==t.env.NODE_ENV?p(\"function\"==typeof n,\"enqueueCallback(...): You called `setProps`, `replaceProps`, `setState`, `replaceState`, or `forceUpdate` with a callback that isn't callable.\"):p(\"function\"==typeof n);var a=o(e);return a&&a!==i.currentlyMountingInstance?(a._pendingCallbacks?a._pendingCallbacks.push(n):a._pendingCallbacks=[n],void r(a)):null},enqueueCallbackInternal:function(e,n){\"production\"!==t.env.NODE_ENV?p(\"function\"==typeof n,\"enqueueCallback(...): You called `setProps`, `replaceProps`, `setState`, `replaceState`, or `forceUpdate` with a callback that isn't callable.\"):p(\"function\"==typeof n),e._pendingCallbacks?e._pendingCallbacks.push(n):e._pendingCallbacks=[n],r(e)},enqueueForceUpdate:function(e){var t=o(e,\"forceUpdate\");t&&(t._pendingForceUpdate=!0,r(t))},enqueueReplaceState:function(e,t){var n=o(e,\"replaceState\");n&&(n._pendingStateQueue=[t],n._pendingReplaceState=!0,r(n))},enqueueSetState:function(e,t){var n=o(e,\"setState\");if(n){var i=n._pendingStateQueue||(n._pendingStateQueue=[]);i.push(t),r(n)}},enqueueSetProps:function(e,n){var i=o(e,\"setProps\");if(i){\"production\"!==t.env.NODE_ENV?p(i._isTopLevel,\"setProps(...): You called `setProps` on a component with a parent. This is an anti-pattern since props will get reactively updated when rendered. Instead, change the owner's `render` method to pass the correct value as props to the component where it is created.\"):p(i._isTopLevel);var a=i._pendingElement||i._currentElement,u=c({},a.props,n);i._pendingElement=s.cloneAndReplaceProps(a,u),r(i)}},enqueueReplaceProps:function(e,n){var i=o(e,\"replaceProps\");if(i){\"production\"!==t.env.NODE_ENV?p(i._isTopLevel,\"replaceProps(...): You called `replaceProps` on a component with a parent. This is an anti-pattern since props will get reactively updated when rendered. Instead, change the owner's `render` method to pass the correct value as props to the component where it is created.\"):p(i._isTopLevel);var a=i._pendingElement||i._currentElement;i._pendingElement=s.cloneAndReplaceProps(a,n),r(i)}},enqueueElementInternal:function(e,t){e._pendingElement=t,r(e)}};e.exports=d}).call(t,n(6))},function(e,t){\"use strict\";var n={currentlyMountingInstance:null,currentlyUnmountingInstance:null};e.exports=n},function(e,t){\"use strict\";var n={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(){\"production\"!==t.env.NODE_ENV?y(T.ReactReconcileTransaction&&O,\"ReactUpdates: must inject a reconcile transaction class and batching strategy\"):y(T.ReactReconcileTransaction&&O)}function o(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=c.getPooled(),this.reconcileTransaction=T.ReactReconcileTransaction.getPooled()}function i(e,t,n,o,i){r(),O.batchedUpdates(e,t,n,o,i)}function a(e,t){return e._mountOrder-t._mountOrder}function s(e){var n=e.dirtyComponentsLength;\"production\"!==t.env.NODE_ENV?y(n===b.length,\"Expected flush transaction's stored dirty-components length (%s) to match dirty-components array length (%s).\",n,b.length):y(n===b.length),b.sort(a);for(var r=0;r<n;r++){var o=b[r],i=o._pendingCallbacks;if(o._pendingCallbacks=null,h.performUpdateIfNecessary(o,e.reconcileTransaction),i)for(var s=0;s<i.length;s++)e.callbackQueue.enqueue(i[s],o.getPublicInstance())}}function u(e){return r(),\"production\"!==t.env.NODE_ENV?g(null==f.current,\"enqueueUpdate(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\"):null,O.isBatchingUpdates?void b.push(e):void O.batchedUpdates(u,e)}function l(e,n){\"production\"!==t.env.NODE_ENV?y(O.isBatchingUpdates,\"ReactUpdates.asap: Can't enqueue an asap callback in a context whereupdates are not being batched.\"):y(O.isBatchingUpdates),E.enqueue(e,n),_=!0}var c=n(30),p=n(12),f=n(20),d=n(31),h=n(32),v=n(39),m=n(16),y=n(10),g=n(18),b=[],E=c.getPooled(),_=!1,O=null,N={initialize:function(){this.dirtyComponentsLength=b.length},close:function(){this.dirtyComponentsLength!==b.length?(b.splice(0,this.dirtyComponentsLength),P()):b.length=0}},w={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},C=[N,w];m(o.prototype,v.Mixin,{getTransactionWrappers:function(){return C},destructor:function(){this.dirtyComponentsLength=null,c.release(this.callbackQueue),this.callbackQueue=null,T.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return v.Mixin.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),p.addPoolingTo(o);var P=function(){for(;b.length||_;){if(b.length){var e=o.getPooled();e.perform(s,null,e),o.release(e)}if(_){_=!1;var t=E;E=c.getPooled(),t.notifyAll(),c.release(t)}}};P=d.measure(\"ReactUpdates\",\"flushBatchedUpdates\",P);var x={injectReconcileTransaction:function(e){\"production\"!==t.env.NODE_ENV?y(e,\"ReactUpdates: must provide a reconcile transaction class\"):y(e),T.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){\"production\"!==t.env.NODE_ENV?y(e,\"ReactUpdates: must provide a batching strategy\"):y(e),\n\"production\"!==t.env.NODE_ENV?y(\"function\"==typeof e.batchedUpdates,\"ReactUpdates: must provide a batchedUpdates() function\"):y(\"function\"==typeof e.batchedUpdates),\"production\"!==t.env.NODE_ENV?y(\"boolean\"==typeof e.isBatchingUpdates,\"ReactUpdates: must provide an isBatchingUpdates boolean attribute\"):y(\"boolean\"==typeof e.isBatchingUpdates),O=e}},T={ReactReconcileTransaction:null,batchedUpdates:i,enqueueUpdate:u,flushBatchedUpdates:P,injection:x,asap:l};e.exports=T}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){this._callbacks=null,this._contexts=null}var o=n(12),i=n(16),a=n(10);i(r.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,n=this._contexts;if(e){\"production\"!==t.env.NODE_ENV?a(e.length===n.length,\"Mismatched list of contexts in callback queue\"):a(e.length===n.length),this._callbacks=null,this._contexts=null;for(var r=0,o=e.length;r<o;r++)e[r].call(n[r]);e.length=0,n.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),o.addPoolingTo(r),e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function n(e,t,n){return n}var r={enableMeasure:!1,storedMeasure:n,measureMethods:function(e,n,o){if(\"production\"!==t.env.NODE_ENV)for(var i in o)o.hasOwnProperty(i)&&(e[i]=r.measure(n,o[i],e[i]))},measure:function(e,n,o){if(\"production\"!==t.env.NODE_ENV){var i=null,a=function(){return r.enableMeasure?(i||(i=r.storedMeasure(e,n,o)),i.apply(this,arguments)):o.apply(this,arguments)};return a.displayName=e+\"_\"+n,a}return o},injection:{injectMeasure:function(e){r.storedMeasure=e}}};e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){o.attachRefs(this,this._currentElement)}var o=n(33),i=n(35),a={mountComponent:function(e,n,o,a){var s=e.mountComponent(n,o,a);return\"production\"!==t.env.NODE_ENV&&i.checkAndWarnForMutatedProps(e._currentElement),o.getReactMountReady().enqueue(r,e),s},unmountComponent:function(e){o.detachRefs(e,e._currentElement),e.unmountComponent()},receiveComponent:function(e,n,a,s){var u=e._currentElement;if(n!==u||null==n._owner){\"production\"!==t.env.NODE_ENV&&i.checkAndWarnForMutatedProps(n);var l=o.shouldUpdateRefs(u,n);l&&o.detachRefs(e,u),e.receiveComponent(n,a,s),l&&a.getReactMountReady().enqueue(r,e)}},performUpdateIfNecessary:function(e,t){e.performUpdateIfNecessary(t)}};e.exports=a}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t,n){\"function\"==typeof e?e(t.getPublicInstance()):i.addComponentAsRefTo(t,e,n)}function o(e,t,n){\"function\"==typeof e?e(null):i.removeComponentAsRefFrom(t,e,n)}var i=n(34),a={};a.attachRefs=function(e,t){var n=t.ref;null!=n&&r(n,e,t._owner)},a.shouldUpdateRefs=function(e,t){return t._owner!==e._owner||t.ref!==e.ref},a.detachRefs=function(e,t){var n=t.ref;null!=n&&o(n,e,t._owner)},e.exports=a},function(e,t,n){(function(t){\"use strict\";var r=n(10),o={isValidOwner:function(e){return!(!e||\"function\"!=typeof e.attachRef||\"function\"!=typeof e.detachRef)},addComponentAsRefTo:function(e,n,i){\"production\"!==t.env.NODE_ENV?r(o.isValidOwner(i),\"addComponentAsRefTo(...): Only a ReactOwner can have refs. This usually means that you're trying to add a ref to a component that doesn't have an owner (that is, was not created inside of another component's `render` method). Try rendering this component inside of a new top-level component which will hold the ref.\"):r(o.isValidOwner(i)),i.attachRef(n,e)},removeComponentAsRefFrom:function(e,n,i){\"production\"!==t.env.NODE_ENV?r(o.isValidOwner(i),\"removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This usually means that you're trying to remove a ref to a component that doesn't have an owner (that is, was not created inside of another component's `render` method). Try rendering this component inside of a new top-level component which will hold the ref.\"):r(o.isValidOwner(i)),i.getPublicInstance().refs[n]===e.getPublicInstance()&&i.detachRef(n)}};e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){if(b.current){var e=b.current.getName();if(e)return\" Check the render method of `\"+e+\"`.\"}return\"\"}function o(e){var t=e&&e.getPublicInstance();if(t){var n=t.constructor;if(n)return n.displayName||n.name||void 0}}function i(){var e=b.current;return e&&o(e)||void 0}function a(e,t){e._store.validated||null!=e.key||(e._store.validated=!0,u('Each child in an array or iterator should have a unique \"key\" prop.',e,t))}function s(e,t,n){P.test(e)&&u(\"Child objects should have non-numeric keys so ordering is preserved.\",t,n)}function u(e,n,r){var a=i(),s=\"string\"==typeof r?r:r.displayName||r.name,u=a||s,l=w[e]||(w[e]={});if(!l.hasOwnProperty(u)){l[u]=!0;var c=a?\" Check the render method of \"+a+\".\":s?\" Check the React.render call using <\"+s+\">.\":\"\",p=\"\";if(n&&n._owner&&n._owner!==b.current){var f=o(n._owner);p=\" It was passed a child from \"+f+\".\"}\"production\"!==t.env.NODE_ENV?N(!1,e+\"%s%s See https://fb.me/react-warning-keys for more information.\",c,p):null}}function l(e,t){if(Array.isArray(e))for(var n=0;n<e.length;n++){var r=e[n];v.isValidElement(r)&&a(r,t)}else if(v.isValidElement(e))e._store.validated=!0;else if(e){var o=_(e);if(o){if(o!==e.entries)for(var i,u=o.call(e);!(i=u.next()).done;)v.isValidElement(i.value)&&a(i.value,t)}else if(\"object\"==typeof e){var l=m.extractIfFragment(e);for(var c in l)l.hasOwnProperty(c)&&s(c,l[c],t)}}}function c(e,n,o,i){for(var a in n)if(n.hasOwnProperty(a)){var s;try{\"production\"!==t.env.NODE_ENV?O(\"function\"==typeof n[a],\"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.\",e||\"React class\",g[i],a):O(\"function\"==typeof n[a]),s=n[a](o,a,e,i)}catch(e){s=e}if(s instanceof Error&&!(s.message in C)){C[s.message]=!0;var u=r(this);\"production\"!==t.env.NODE_ENV?N(!1,\"Failed propType: %s%s\",s.message,u):null}}}function p(e,n){var r=n.type,o=\"string\"==typeof r?r:r.displayName,i=n._owner?n._owner.getPublicInstance().constructor.displayName:null,a=e+\"|\"+o+\"|\"+i;if(!x.hasOwnProperty(a)){x[a]=!0;var s=\"\";o&&(s=\" <\"+o+\" />\");var u=\"\";i&&(u=\" The element was created by \"+i+\".\"),\"production\"!==t.env.NODE_ENV?N(!1,\"Don't set .props.%s of the React component%s. Instead, specify the correct value when initially creating the element or use React.cloneElement to make a new element with updated props.%s\",e,s,u):null}}function f(e,t){return e!==e?t!==t:0===e&&0===t?1/e===1/t:e===t}function d(e){if(e._store){var t=e._store.originalProps,n=e.props;for(var r in n)n.hasOwnProperty(r)&&(t.hasOwnProperty(r)&&f(t[r],n[r])||(p(r,e),t[r]=n[r]))}}function h(e){if(null!=e.type){var n=E.getComponentClassForElement(e),r=n.displayName||n.name;n.propTypes&&c(r,n.propTypes,e.props,y.prop),\"function\"==typeof n.getDefaultProps&&(\"production\"!==t.env.NODE_ENV?N(n.getDefaultProps.isReactClassApproved,\"getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.\"):null)}}var v=n(14),m=n(13),y=n(36),g=n(37),b=n(20),E=n(38),_=n(24),O=n(10),N=n(18),w={},C={},P=/^\\d+$/,x={},T={checkAndWarnForMutatedProps:d,createElement:function(e,n,r){\"production\"!==t.env.NODE_ENV?N(null!=e,\"React.createElement: type should not be null or undefined. It should be a string (for DOM elements) or a ReactClass (for composite components).\"):null;var o=v.createElement.apply(this,arguments);if(null==o)return o;for(var i=2;i<arguments.length;i++)l(arguments[i],e);return h(o),o},createFactory:function(e){var n=T.createElement.bind(null,e);if(n.type=e,\"production\"!==t.env.NODE_ENV)try{Object.defineProperty(n,\"type\",{enumerable:!1,get:function(){return\"production\"!==t.env.NODE_ENV?N(!1,\"Factory.type is deprecated. Access the class directly before passing it to createFactory.\"):null,Object.defineProperty(this,\"type\",{value:e}),e}})}catch(e){}return n},cloneElement:function(e,t,n){for(var r=v.cloneElement.apply(this,arguments),o=2;o<arguments.length;o++)l(arguments[o],r.type);return h(r),r}};e.exports=T}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(9),o=r({prop:null,context:null,childContext:null});e.exports=o},function(e,t,n){(function(t){\"use strict\";var n={};\"production\"!==t.env.NODE_ENV&&(n={prop:\"prop\",context:\"context\",childContext:\"child context\"}),e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){if(\"function\"==typeof e.type)return e.type;var t=e.type,n=p[t];return null==n&&(p[t]=n=l(t)),n}function o(e){return\"production\"!==t.env.NODE_ENV?u(c,\"There is no registered component for the tag %s\",e.type):u(c),new c(e.type,e.props)}function i(e){return new f(e)}function a(e){return e instanceof f}var s=n(16),u=n(10),l=null,c=null,p={},f=null,d={injectGenericComponentClass:function(e){c=e},injectTextComponentClass:function(e){f=e},injectComponentClasses:function(e){s(p,e)},injectAutoWrapper:function(e){l=e}},h={getComponentClassForElement:r,createInternalComponent:o,createInstanceForText:i,isTextComponent:a,injection:d};e.exports=h}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(10),o={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,n,o,i,a,s,u,l){\"production\"!==t.env.NODE_ENV?r(!this.isInTransaction(),\"Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction.\"):r(!this.isInTransaction());var c,p;try{this._isInTransaction=!0,c=!0,this.initializeAll(0),p=e.call(n,o,i,a,s,u,l),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return p},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=i.OBSERVED_ERROR,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===i.OBSERVED_ERROR)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){\"production\"!==t.env.NODE_ENV?r(this.isInTransaction(),\"Transaction.closeAll(): Cannot close transaction when none are open.\"):r(this.isInTransaction());for(var n=this.transactionWrappers,o=e;o<n.length;o++){var a,s=n[o],u=this.wrapperInitData[o];try{a=!0,u!==i.OBSERVED_ERROR&&s.close&&s.close.call(this,u),a=!1}finally{if(a)try{this.closeAll(o+1)}catch(e){}}}this.wrapperInitData.length=0}},i={Mixin:o,OBSERVED_ERROR:{}};e.exports=i}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n,r){for(var o in n)n.hasOwnProperty(o)&&(\"production\"!==t.env.NODE_ENV?C(\"function\"==typeof n[o],\"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.\",e.displayName||\"ReactClass\",b[r],o):null)}function o(e,n){var r=D.hasOwnProperty(n)?D[n]:null;k.hasOwnProperty(n)&&(\"production\"!==t.env.NODE_ENV?O(r===x.OVERRIDE_BASE,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",n):O(r===x.OVERRIDE_BASE)),e.hasOwnProperty(n)&&(\"production\"!==t.env.NODE_ENV?O(r===x.DEFINE_MANY||r===x.DEFINE_MANY_MERGED,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n):O(r===x.DEFINE_MANY||r===x.DEFINE_MANY_MERGED))}function i(e,n){if(n){\"production\"!==t.env.NODE_ENV?O(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class as a mixin. Instead, just use a regular object.\"):O(\"function\"!=typeof n),\"production\"!==t.env.NODE_ENV?O(!h.isValidElement(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\"):O(!h.isValidElement(n));var r=e.prototype;n.hasOwnProperty(P)&&M.mixins(e,n.mixins);for(var i in n)if(n.hasOwnProperty(i)&&i!==P){var a=n[i];if(o(r,i),M.hasOwnProperty(i))M[i](e,a);else{var s=D.hasOwnProperty(i),c=r.hasOwnProperty(i),p=a&&a.__reactDontBind,f=\"function\"==typeof a,d=f&&!s&&!c&&!p;if(d)r.__reactAutoBindMap||(r.__reactAutoBindMap={}),r.__reactAutoBindMap[i]=a,r[i]=a;else if(c){var v=D[i];\"production\"!==t.env.NODE_ENV?O(s&&(v===x.DEFINE_MANY_MERGED||v===x.DEFINE_MANY),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,i):O(s&&(v===x.DEFINE_MANY_MERGED||v===x.DEFINE_MANY)),v===x.DEFINE_MANY_MERGED?r[i]=u(r[i],a):v===x.DEFINE_MANY&&(r[i]=l(r[i],a))}else r[i]=a,\"production\"!==t.env.NODE_ENV&&\"function\"==typeof a&&n.displayName&&(r[i].displayName=n.displayName+\"_\"+i)}}}}function a(e,n){if(n)for(var r in n){var o=n[r];if(n.hasOwnProperty(r)){var i=r in M;\"production\"!==t.env.NODE_ENV?O(!i,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',r):O(!i);var a=r in e;\"production\"!==t.env.NODE_ENV?O(!a,\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",r):O(!a),e[r]=o}}}function s(e,n){\"production\"!==t.env.NODE_ENV?O(e&&n&&\"object\"==typeof e&&\"object\"==typeof n,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\"):O(e&&n&&\"object\"==typeof e&&\"object\"==typeof n);for(var r in n)n.hasOwnProperty(r)&&(\"production\"!==t.env.NODE_ENV?O(void 0===e[r],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",r):O(void 0===e[r]),e[r]=n[r]);return e}function u(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return s(o,n),s(o,r),o}}function l(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function c(e,n){var r=n.bind(e);if(\"production\"!==t.env.NODE_ENV){r.__reactBoundContext=e,r.__reactBoundMethod=n,r.__reactBoundArguments=null;var o=e.constructor.displayName,i=r.bind;r.bind=function(a){for(var s=[],u=1,l=arguments.length;u<l;u++)s.push(arguments[u]);if(a!==e&&null!==a)\"production\"!==t.env.NODE_ENV?C(!1,\"bind(): React component methods may only be bound to the component instance. See %s\",o):null;else if(!s.length)return\"production\"!==t.env.NODE_ENV?C(!1,\"bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s\",o):null,r;var c=i.apply(r,arguments);return c.__reactBoundContext=e,c.__reactBoundMethod=n,c.__reactBoundArguments=s,c}}return r}function p(e){for(var t in e.__reactAutoBindMap)if(e.__reactAutoBindMap.hasOwnProperty(t)){var n=e.__reactAutoBindMap[t];e[t]=c(e,v.guard(n,e.constructor.displayName+\".\"+t))}}var f=n(25),d=n(20),h=n(14),v=n(41),m=n(28),y=n(27),g=n(36),b=n(37),E=n(26),_=n(16),O=n(10),N=n(9),w=n(42),C=n(18),P=w({mixins:null}),x=N({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),T=[],D={mixins:x.DEFINE_MANY,statics:x.DEFINE_MANY,propTypes:x.DEFINE_MANY,contextTypes:x.DEFINE_MANY,childContextTypes:x.DEFINE_MANY,getDefaultProps:x.DEFINE_MANY_MERGED,getInitialState:x.DEFINE_MANY_MERGED,getChildContext:x.DEFINE_MANY_MERGED,render:x.DEFINE_ONCE,componentWillMount:x.DEFINE_MANY,componentDidMount:x.DEFINE_MANY,componentWillReceiveProps:x.DEFINE_MANY,shouldComponentUpdate:x.DEFINE_ONCE,componentWillUpdate:x.DEFINE_MANY,componentDidUpdate:x.DEFINE_MANY,componentWillUnmount:x.DEFINE_MANY,updateComponent:x.OVERRIDE_BASE},M={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)i(e,t[n])},childContextTypes:function(e,n){\"production\"!==t.env.NODE_ENV&&r(e,n,g.childContext),e.childContextTypes=_({},e.childContextTypes,n)},contextTypes:function(e,n){\"production\"!==t.env.NODE_ENV&&r(e,n,g.context),e.contextTypes=_({},e.contextTypes,n)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=u(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,n){\"production\"!==t.env.NODE_ENV&&r(e,n,g.prop),e.propTypes=_({},e.propTypes,n)},statics:function(e,t){a(e,t)}},S={enumerable:!1,get:function(){var e=this.displayName||this.name||\"Component\";return\"production\"!==t.env.NODE_ENV?C(!1,\"%s.type is deprecated. Use %s directly to access the class.\",e,e):null,Object.defineProperty(this,\"type\",{value:this}),this}},k={replaceState:function(e,t){E.enqueueReplaceState(this,e),t&&E.enqueueCallback(this,t)},isMounted:function(){if(\"production\"!==t.env.NODE_ENV){var e=d.current;null!==e&&(\"production\"!==t.env.NODE_ENV?C(e._warnedAboutRefsInRender,\"%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.\",e.getName()||\"A component\"):null,e._warnedAboutRefsInRender=!0)}var n=m.get(this);return n&&n!==y.currentlyMountingInstance},setProps:function(e,t){E.enqueueSetProps(this,e),t&&E.enqueueCallback(this,t)},replaceProps:function(e,t){E.enqueueReplaceProps(this,e),t&&E.enqueueCallback(this,t)}},I=function(){};_(I.prototype,f.prototype,k);var R={createClass:function(e){var n=function(e,r){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?C(this instanceof n,\"Something is calling a React component directly. Use a factory or JSX instead. See: https://fb.me/react-legacyfactory\"):null),this.__reactAutoBindMap&&p(this),this.props=e,this.context=r,this.state=null;var o=this.getInitialState?this.getInitialState():null;\"production\"!==t.env.NODE_ENV&&\"undefined\"==typeof o&&this.getInitialState._isMockFunction&&(o=null),\"production\"!==t.env.NODE_ENV?O(\"object\"==typeof o&&!Array.isArray(o),\"%s.getInitialState(): must return an object or null\",n.displayName||\"ReactCompositeComponent\"):O(\"object\"==typeof o&&!Array.isArray(o)),this.state=o};n.prototype=new I,n.prototype.constructor=n,T.forEach(i.bind(null,n)),i(n,e),n.getDefaultProps&&(n.defaultProps=n.getDefaultProps()),\"production\"!==t.env.NODE_ENV&&(n.getDefaultProps&&(n.getDefaultProps.isReactClassApproved={}),n.prototype.getInitialState&&(n.prototype.getInitialState.isReactClassApproved={})),\"production\"!==t.env.NODE_ENV?O(n.prototype.render,\"createClass(...): Class specification must implement a `render` method.\"):O(n.prototype.render),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?C(!n.prototype.componentShouldUpdate,\"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.\",e.displayName||\"A component\"):null);for(var r in D)n.prototype[r]||(n.prototype[r]=null);if(n.type=n,\"production\"!==t.env.NODE_ENV)try{Object.defineProperty(n,\"type\",S)}catch(e){}return n},injection:{injectMixin:function(e){T.push(e)}}};e.exports=R}).call(t,n(6))},function(e,t){\"use strict\";var n={guard:function(e,t){return e}};e.exports=n},function(e,t){var n=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e){return\"production\"!==t.env.NODE_ENV?i.createFactory(e):o.createFactory(e)}var o=n(14),i=n(35),a=n(44),s=a({a:\"a\",abbr:\"abbr\",address:\"address\",area:\"area\",article:\"article\",aside:\"aside\",audio:\"audio\",b:\"b\",base:\"base\",bdi:\"bdi\",bdo:\"bdo\",big:\"big\",blockquote:\"blockquote\",body:\"body\",br:\"br\",button:\"button\",canvas:\"canvas\",caption:\"caption\",cite:\"cite\",code:\"code\",col:\"col\",colgroup:\"colgroup\",data:\"data\",datalist:\"datalist\",dd:\"dd\",del:\"del\",details:\"details\",dfn:\"dfn\",dialog:\"dialog\",div:\"div\",dl:\"dl\",dt:\"dt\",em:\"em\",embed:\"embed\",fieldset:\"fieldset\",figcaption:\"figcaption\",figure:\"figure\",footer:\"footer\",form:\"form\",h1:\"h1\",h2:\"h2\",h3:\"h3\",h4:\"h4\",h5:\"h5\",h6:\"h6\",head:\"head\",header:\"header\",hr:\"hr\",html:\"html\",i:\"i\",iframe:\"iframe\",img:\"img\",input:\"input\",ins:\"ins\",kbd:\"kbd\",keygen:\"keygen\",label:\"label\",legend:\"legend\",li:\"li\",link:\"link\",main:\"main\",map:\"map\",mark:\"mark\",menu:\"menu\",menuitem:\"menuitem\",meta:\"meta\",meter:\"meter\",nav:\"nav\",noscript:\"noscript\",object:\"object\",ol:\"ol\",optgroup:\"optgroup\",option:\"option\",output:\"output\",p:\"p\",param:\"param\",picture:\"picture\",pre:\"pre\",progress:\"progress\",q:\"q\",rp:\"rp\",rt:\"rt\",ruby:\"ruby\",s:\"s\",samp:\"samp\",script:\"script\",section:\"section\",select:\"select\",small:\"small\",source:\"source\",span:\"span\",strong:\"strong\",style:\"style\",sub:\"sub\",summary:\"summary\",sup:\"sup\",table:\"table\",tbody:\"tbody\",td:\"td\",textarea:\"textarea\",tfoot:\"tfoot\",th:\"th\",thead:\"thead\",time:\"time\",title:\"title\",tr:\"tr\",track:\"track\",u:\"u\",ul:\"ul\",var:\"var\",video:\"video\",wbr:\"wbr\",circle:\"circle\",clipPath:\"clipPath\",defs:\"defs\",ellipse:\"ellipse\",g:\"g\",line:\"line\",linearGradient:\"linearGradient\",mask:\"mask\",path:\"path\",pattern:\"pattern\",polygon:\"polygon\",polyline:\"polyline\",radialGradient:\"radialGradient\",rect:\"rect\",stop:\"stop\",svg:\"svg\",text:\"text\",tspan:\"tspan\"},r);e.exports=s}).call(t,n(6))},function(e,t){\"use strict\";function n(e,t,n){if(!e)return null;var o={};for(var i in e)r.call(e,i)&&(o[i]=t.call(n,e[i],i,e));return o}var r=Object.prototype.hasOwnProperty;e.exports=n},function(e,t,n){\"use strict\";var r=n(46),o=n(50),i=n(90),a=n(16),s=n(49),u=function(e){};a(u.prototype,{construct:function(e){this._currentElement=e,this._stringText=\"\"+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t,n){this._rootNodeID=e;var o=s(this._stringText);return t.renderToStaticMarkup?o:\"<span \"+r.createMarkupForID(e)+\">\"+o+\"</span>\"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=\"\"+e;n!==this._stringText&&(this._stringText=n,i.BackendIDOperations.updateTextContentByID(this._rootNodeID,n))}},unmountComponent:function(){o.unmountIDFromEnvironment(this._rootNodeID)}}),e.exports=u},function(e,t,n){(function(t){\"use strict\";function r(e,t){return null==t||o.hasBooleanValue[e]&&!t||o.hasNumericValue[e]&&isNaN(t)||o.hasPositiveNumericValue[e]&&t<1||o.hasOverloadedBooleanValue[e]&&t===!1}var o=n(47),i=n(48),a=n(18);if(\"production\"!==t.env.NODE_ENV)var s={children:!0,dangerouslySetInnerHTML:!0,key:!0,ref:!0},u={},l=function(e){if(!(s.hasOwnProperty(e)&&s[e]||u.hasOwnProperty(e)&&u[e])){u[e]=!0;var n=e.toLowerCase(),r=o.isCustomAttribute(n)?n:o.getPossibleStandardName.hasOwnProperty(n)?o.getPossibleStandardName[n]:null;\"production\"!==t.env.NODE_ENV?a(null==r,\"Unknown DOM property %s. Did you mean %s?\",e,r):null}};var c={createMarkupForID:function(e){return o.ID_ATTRIBUTE_NAME+\"=\"+i(e)},createMarkupForProperty:function(e,n){if(o.isStandardName.hasOwnProperty(e)&&o.isStandardName[e]){if(r(e,n))return\"\";var a=o.getAttributeName[e];return o.hasBooleanValue[e]||o.hasOverloadedBooleanValue[e]&&n===!0?a:a+\"=\"+i(n)}return o.isCustomAttribute(e)?null==n?\"\":e+\"=\"+i(n):(\"production\"!==t.env.NODE_ENV&&l(e),null)},setValueForProperty:function(e,n,i){if(o.isStandardName.hasOwnProperty(n)&&o.isStandardName[n]){var a=o.getMutationMethod[n];if(a)a(e,i);else if(r(n,i))this.deleteValueForProperty(e,n);else if(o.mustUseAttribute[n])e.setAttribute(o.getAttributeName[n],\"\"+i);else{var s=o.getPropertyName[n];o.hasSideEffects[n]&&\"\"+e[s]==\"\"+i||(e[s]=i)}}else o.isCustomAttribute(n)?null==i?e.removeAttribute(n):e.setAttribute(n,\"\"+i):\"production\"!==t.env.NODE_ENV&&l(n)},deleteValueForProperty:function(e,n){if(o.isStandardName.hasOwnProperty(n)&&o.isStandardName[n]){var r=o.getMutationMethod[n];if(r)r(e,void 0);else if(o.mustUseAttribute[n])e.removeAttribute(o.getAttributeName[n]);else{var i=o.getPropertyName[n],a=o.getDefaultValueForProperty(e.nodeName,i);o.hasSideEffects[n]&&\"\"+e[i]===a||(e[i]=a)}}else o.isCustomAttribute(n)?e.removeAttribute(n):\"production\"!==t.env.NODE_ENV&&l(n)}};e.exports=c}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,t){return(e&t)===t}var o=n(10),i={MUST_USE_ATTRIBUTE:1,MUST_USE_PROPERTY:2,HAS_SIDE_EFFECTS:4,HAS_BOOLEAN_VALUE:8,HAS_NUMERIC_VALUE:16,HAS_POSITIVE_NUMERIC_VALUE:48,HAS_OVERLOADED_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var n=e.Properties||{},a=e.DOMAttributeNames||{},u=e.DOMPropertyNames||{},l=e.DOMMutationMethods||{};e.isCustomAttribute&&s._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var c in n){\"production\"!==t.env.NODE_ENV?o(!s.isStandardName.hasOwnProperty(c),\"injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.\",c):o(!s.isStandardName.hasOwnProperty(c)),s.isStandardName[c]=!0;var p=c.toLowerCase();if(s.getPossibleStandardName[p]=c,a.hasOwnProperty(c)){var f=a[c];s.getPossibleStandardName[f]=c,s.getAttributeName[c]=f}else s.getAttributeName[c]=p;s.getPropertyName[c]=u.hasOwnProperty(c)?u[c]:c,l.hasOwnProperty(c)?s.getMutationMethod[c]=l[c]:s.getMutationMethod[c]=null;var d=n[c];s.mustUseAttribute[c]=r(d,i.MUST_USE_ATTRIBUTE),s.mustUseProperty[c]=r(d,i.MUST_USE_PROPERTY),s.hasSideEffects[c]=r(d,i.HAS_SIDE_EFFECTS),s.hasBooleanValue[c]=r(d,i.HAS_BOOLEAN_VALUE),s.hasNumericValue[c]=r(d,i.HAS_NUMERIC_VALUE),s.hasPositiveNumericValue[c]=r(d,i.HAS_POSITIVE_NUMERIC_VALUE),s.hasOverloadedBooleanValue[c]=r(d,i.HAS_OVERLOADED_BOOLEAN_VALUE),\"production\"!==t.env.NODE_ENV?o(!s.mustUseAttribute[c]||!s.mustUseProperty[c],\"DOMProperty: Cannot require using both attribute and property: %s\",c):o(!s.mustUseAttribute[c]||!s.mustUseProperty[c]),\"production\"!==t.env.NODE_ENV?o(s.mustUseProperty[c]||!s.hasSideEffects[c],\"DOMProperty: Properties that have side effects must use property: %s\",c):o(s.mustUseProperty[c]||!s.hasSideEffects[c]),\"production\"!==t.env.NODE_ENV?o(!!s.hasBooleanValue[c]+!!s.hasNumericValue[c]+!!s.hasOverloadedBooleanValue[c]<=1,\"DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s\",c):o(!!s.hasBooleanValue[c]+!!s.hasNumericValue[c]+!!s.hasOverloadedBooleanValue[c]<=1)}}},a={},s={ID_ATTRIBUTE_NAME:\"data-reactid\",isStandardName:{},getPossibleStandardName:{},getAttributeName:{},getPropertyName:{},getMutationMethod:{},mustUseAttribute:{},mustUseProperty:{},hasSideEffects:{},hasBooleanValue:{},hasNumericValue:{},hasPositiveNumericValue:{},hasOverloadedBooleanValue:{},_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<s._isCustomAttributeFunctions.length;t++){var n=s._isCustomAttributeFunctions[t];if(n(e))return!0}return!1},getDefaultValueForProperty:function(e,t){var n,r=a[e];return r||(a[e]=r={}),t in r||(n=document.createElement(e),r[t]=n[t]),r[t]},injection:i};e.exports=s}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return'\"'+o(e)+'\"'}var o=n(49);e.exports=r},function(e,t){\"use strict\";function n(e){return o[e]}function r(e){return(\"\"+e).replace(i,n)}var o={\"&\":\"&amp;\",\">\":\"&gt;\",\"<\":\"&lt;\",'\"':\"&quot;\",\"'\":\"&#x27;\"},i=/[&><\"']/g;e.exports=r},function(e,t,n){\"use strict\";var r=n(51),o=n(70),i={processChildrenUpdates:r.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkupByID:r.dangerouslyReplaceNodeWithMarkupByID,unmountIDFromEnvironment:function(e){o.purgeID(e)}};e.exports=i},function(e,t,n){(function(t){\"use strict\";var r=n(52),o=n(61),i=n(46),a=n(70),s=n(31),u=n(10),l=n(69),c={dangerouslySetInnerHTML:\"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",style:\"`style` must be set using `updateStylesByID()`.\"},p={updatePropertyByID:function(e,n,r){var o=a.getNode(e);\"production\"!==t.env.NODE_ENV?u(!c.hasOwnProperty(n),\"updatePropertyByID(...): %s\",c[n]):u(!c.hasOwnProperty(n)),null!=r?i.setValueForProperty(o,n,r):i.deleteValueForProperty(o,n)},deletePropertyByID:function(e,n,r){var o=a.getNode(e);\"production\"!==t.env.NODE_ENV?u(!c.hasOwnProperty(n),\"updatePropertyByID(...): %s\",c[n]):u(!c.hasOwnProperty(n)),i.deleteValueForProperty(o,n,r)},updateStylesByID:function(e,t){var n=a.getNode(e);r.setValueForStyles(n,t)},updateInnerHTMLByID:function(e,t){var n=a.getNode(e);l(n,t)},updateTextContentByID:function(e,t){var n=a.getNode(e);o.updateTextContent(n,t)},dangerouslyReplaceNodeWithMarkupByID:function(e,t){var n=a.getNode(e);o.dangerouslyReplaceNodeWithMarkup(n,t)},dangerouslyProcessChildrenUpdates:function(e,t){for(var n=0;n<e.length;n++)e[n].parentNode=a.getNode(e[n].parentID);o.processUpdates(e,t)}};s.measureMethods(p,\"ReactDOMIDOperations\",{updatePropertyByID:\"updatePropertyByID\",deletePropertyByID:\"deletePropertyByID\",updateStylesByID:\"updateStylesByID\",updateInnerHTMLByID:\"updateInnerHTMLByID\",updateTextContentByID:\"updateTextContentByID\",dangerouslyReplaceNodeWithMarkupByID:\"dangerouslyReplaceNodeWithMarkupByID\",dangerouslyProcessChildrenUpdates:\"dangerouslyProcessChildrenUpdates\"}),e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(53),o=n(54),i=n(55),a=n(57),s=n(58),u=n(60),l=n(18),c=u(function(e){return s(e)}),p=\"cssFloat\";if(o.canUseDOM&&void 0===document.documentElement.style.cssFloat&&(p=\"styleFloat\"),\"production\"!==t.env.NODE_ENV)var f=/^(?:webkit|moz|o)[A-Z]/,d=/;\\s*$/,h={},v={},m=function(e){h.hasOwnProperty(e)&&h[e]||(h[e]=!0,\"production\"!==t.env.NODE_ENV?l(!1,\"Unsupported style property %s. Did you mean %s?\",e,i(e)):null)},y=function(e){h.hasOwnProperty(e)&&h[e]||(h[e]=!0,\"production\"!==t.env.NODE_ENV?l(!1,\"Unsupported vendor-prefixed style property %s. Did you mean %s?\",e,e.charAt(0).toUpperCase()+e.slice(1)):null)},g=function(e,n){v.hasOwnProperty(n)&&v[n]||(v[n]=!0,\"production\"!==t.env.NODE_ENV?l(!1,'Style property values shouldn\\'t contain a semicolon. Try \"%s: %s\" instead.',e,n.replace(d,\"\")):null)},b=function(e,t){e.indexOf(\"-\")>-1?m(e):f.test(e)?y(e):d.test(t)&&g(e,t)};var E={createMarkupForStyles:function(e){var n=\"\";for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];\"production\"!==t.env.NODE_ENV&&b(r,o),null!=o&&(n+=c(r)+\":\",n+=a(r,o)+\";\")}return n||null},setValueForStyles:function(e,n){var o=e.style;for(var i in n)if(n.hasOwnProperty(i)){\"production\"!==t.env.NODE_ENV&&b(i,n[i]);var s=a(i,n[i]);if(\"float\"===i&&(i=p),s)o[i]=s;else{var u=r.shorthandPropertyExpansions[i];if(u)for(var l in u)o[l]=\"\";else o[i]=\"\"}}}};e.exports=E}).call(t,n(6))},function(e,t){\"use strict\";function n(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={boxFlex:!0,boxFlexGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0},o=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(r).forEach(function(e){o.forEach(function(t){r[n(t,e)]=r[e]})});var i={background:{backgroundImage:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundColor:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0}},a={isUnitlessNumber:r,shorthandPropertyExpansions:i};e.exports=a},function(e,t){\"use strict\";var n=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:n,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:n&&!!window.screen,isInWorker:!n};e.exports=r},function(e,t,n){\"use strict\";function r(e){return o(e.replace(i,\"ms-\"))}var o=n(56),i=/^-ms-/;e.exports=r},function(e,t){function n(e){return e.replace(r,function(e,t){return t.toUpperCase()})}var r=/-(.)/g;e.exports=n},function(e,t,n){\n\"use strict\";function r(e,t){var n=null==t||\"boolean\"==typeof t||\"\"===t;if(n)return\"\";var r=isNaN(t);return r||0===t||i.hasOwnProperty(e)&&i[e]?\"\"+t:(\"string\"==typeof t&&(t=t.trim()),t+\"px\")}var o=n(53),i=o.isUnitlessNumber;e.exports=r},function(e,t,n){\"use strict\";function r(e){return o(e).replace(i,\"-ms-\")}var o=n(59),i=/^ms-/;e.exports=r},function(e,t){function n(e){return e.replace(r,\"-$1\").toLowerCase()}var r=/([A-Z])/g;e.exports=n},function(e,t){\"use strict\";function n(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e,t,n){e.insertBefore(t,e.childNodes[n]||null)}var o=n(62),i=n(67),a=n(68),s=n(10),u={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:a,processUpdates:function(e,n){for(var u,l=null,c=null,p=0;p<e.length;p++)if(u=e[p],u.type===i.MOVE_EXISTING||u.type===i.REMOVE_NODE){var f=u.fromIndex,d=u.parentNode.childNodes[f],h=u.parentID;\"production\"!==t.env.NODE_ENV?s(d,\"processUpdates(): Unable to find child %s of element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID `%s`.\",f,h):s(d),l=l||{},l[h]=l[h]||[],l[h][f]=d,c=c||[],c.push(d)}var v=o.dangerouslyRenderMarkup(n);if(c)for(var m=0;m<c.length;m++)c[m].parentNode.removeChild(c[m]);for(var y=0;y<e.length;y++)switch(u=e[y],u.type){case i.INSERT_MARKUP:r(u.parentNode,v[u.markupIndex],u.toIndex);break;case i.MOVE_EXISTING:r(u.parentNode,l[u.parentID][u.fromIndex],u.toIndex);break;case i.TEXT_CONTENT:a(u.parentNode,u.textContent);break;case i.REMOVE_NODE:}}};e.exports=u}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return e.substring(1,e.indexOf(\" \"))}var o=n(54),i=n(63),a=n(19),s=n(66),u=n(10),l=/^(<[^ \\/>]+)/,c=\"data-danger-index\",p={dangerouslyRenderMarkup:function(e){\"production\"!==t.env.NODE_ENV?u(o.canUseDOM,\"dangerouslyRenderMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.\"):u(o.canUseDOM);for(var n,p={},f=0;f<e.length;f++)\"production\"!==t.env.NODE_ENV?u(e[f],\"dangerouslyRenderMarkup(...): Missing markup.\"):u(e[f]),n=r(e[f]),n=s(n)?n:\"*\",p[n]=p[n]||[],p[n][f]=e[f];var d=[],h=0;for(n in p)if(p.hasOwnProperty(n)){var v,m=p[n];for(v in m)if(m.hasOwnProperty(v)){var y=m[v];m[v]=y.replace(l,\"$1 \"+c+'=\"'+v+'\" ')}for(var g=i(m.join(\"\"),a),b=0;b<g.length;++b){var E=g[b];E.hasAttribute&&E.hasAttribute(c)?(v=+E.getAttribute(c),E.removeAttribute(c),\"production\"!==t.env.NODE_ENV?u(!d.hasOwnProperty(v),\"Danger: Assigning to an already-occupied result index.\"):u(!d.hasOwnProperty(v)),d[v]=E,h+=1):\"production\"!==t.env.NODE_ENV&&console.error(\"Danger: Discarding unexpected node:\",E)}}return\"production\"!==t.env.NODE_ENV?u(h===d.length,\"Danger: Did not assign to every index of resultList.\"):u(h===d.length),\"production\"!==t.env.NODE_ENV?u(d.length===e.length,\"Danger: Expected markup to render %s nodes, but rendered %s.\",e.length,d.length):u(d.length===e.length),d},dangerouslyReplaceNodeWithMarkup:function(e,n){\"production\"!==t.env.NODE_ENV?u(o.canUseDOM,\"dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.\"):u(o.canUseDOM),\"production\"!==t.env.NODE_ENV?u(n,\"dangerouslyReplaceNodeWithMarkup(...): Missing markup.\"):u(n),\"production\"!==t.env.NODE_ENV?u(\"html\"!==e.tagName.toLowerCase(),\"dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See React.renderToString().\"):u(\"html\"!==e.tagName.toLowerCase());var r=i(n,a)[0];e.parentNode.replaceChild(r,e)}};e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){function r(e){var t=e.match(c);return t&&t[1].toLowerCase()}function o(e,n){var o=l;\"production\"!==t.env.NODE_ENV?u(!!l,\"createNodesFromMarkup dummy not initialized\"):u(!!l);var i=r(e),c=i&&s(i);if(c){o.innerHTML=c[1]+e+c[2];for(var p=c[0];p--;)o=o.lastChild}else o.innerHTML=e;var f=o.getElementsByTagName(\"script\");f.length&&(\"production\"!==t.env.NODE_ENV?u(n,\"createNodesFromMarkup(...): Unexpected <script> element rendered.\"):u(n),a(f).forEach(n));for(var d=a(o.childNodes);o.lastChild;)o.removeChild(o.lastChild);return d}var i=n(54),a=n(64),s=n(66),u=n(10),l=i.canUseDOM?document.createElement(\"div\"):null,c=/^\\s*<(\\w+)/;e.exports=o}).call(t,n(6))},function(e,t,n){function r(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"length\"in e&&!(\"setInterval\"in e)&&\"number\"!=typeof e.nodeType&&(Array.isArray(e)||\"callee\"in e||\"item\"in e)}function o(e){return r(e)?Array.isArray(e)?e.slice():i(e):[e]}var i=n(65);e.exports=o},function(e,t,n){(function(t){function r(e){var n=e.length;if(\"production\"!==t.env.NODE_ENV?o(!Array.isArray(e)&&(\"object\"==typeof e||\"function\"==typeof e),\"toArray: Array-like object expected\"):o(!Array.isArray(e)&&(\"object\"==typeof e||\"function\"==typeof e)),\"production\"!==t.env.NODE_ENV?o(\"number\"==typeof n,\"toArray: Object needs a length property\"):o(\"number\"==typeof n),\"production\"!==t.env.NODE_ENV?o(0===n||n-1 in e,\"toArray: Object should have keys for indices\"):o(0===n||n-1 in e),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var r=Array(n),i=0;i<n;i++)r[i]=e[i];return r}var o=n(10);e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){function r(e){return\"production\"!==t.env.NODE_ENV?i(!!a,\"Markup wrapping node not initialized\"):i(!!a),f.hasOwnProperty(e)||(e=\"*\"),s.hasOwnProperty(e)||(\"*\"===e?a.innerHTML=\"<link />\":a.innerHTML=\"<\"+e+\"></\"+e+\">\",s[e]=!a.firstChild),s[e]?f[e]:null}var o=n(54),i=n(10),a=o.canUseDOM?document.createElement(\"div\"):null,s={circle:!0,clipPath:!0,defs:!0,ellipse:!0,g:!0,line:!0,linearGradient:!0,path:!0,polygon:!0,polyline:!0,radialGradient:!0,rect:!0,stop:!0,text:!0},u=[1,'<select multiple=\"true\">',\"</select>\"],l=[1,\"<table>\",\"</table>\"],c=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],p=[1,\"<svg>\",\"</svg>\"],f={\"*\":[1,\"?<div>\",\"</div>\"],area:[1,\"<map>\",\"</map>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],param:[1,\"<object>\",\"</object>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],optgroup:u,option:u,caption:l,colgroup:l,tbody:l,tfoot:l,thead:l,td:c,th:c,circle:p,clipPath:p,defs:p,ellipse:p,g:p,line:p,linearGradient:p,path:p,polygon:p,polyline:p,radialGradient:p,rect:p,stop:p,text:p};e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(9),o=r({INSERT_MARKUP:null,MOVE_EXISTING:null,REMOVE_NODE:null,TEXT_CONTENT:null});e.exports=o},function(e,t,n){\"use strict\";var r=n(54),o=n(49),i=n(69),a=function(e,t){e.textContent=t};r.canUseDOM&&(\"textContent\"in document.documentElement||(a=function(e,t){i(e,o(t))})),e.exports=a},function(e,t,n){\"use strict\";var r=n(54),o=/^[ \\r\\n\\t\\f]/,i=/<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/,a=function(e,t){e.innerHTML=t};if(\"undefined\"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(a=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),r.canUseDOM){var s=document.createElement(\"div\");s.innerHTML=\" \",\"\"===s.innerHTML&&(a=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),o.test(t)||\"<\"===t[0]&&i.test(t)){e.innerHTML=\"\\ufeff\"+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}e.exports=a},function(e,t,n){(function(t){\"use strict\";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){var t=S(e);return t&&Y.getID(t)}function i(e){var n=a(e);if(n)if(F.hasOwnProperty(n)){var r=F[n];r!==e&&(\"production\"!==t.env.NODE_ENV?I(!c(r,n),\"ReactMount: Two valid but unequal nodes with the same `%s`: %s\",V,n):I(!c(r,n)),F[n]=e)}else F[n]=e;return n}function a(e){return e&&e.getAttribute&&e.getAttribute(V)||\"\"}function s(e,t){var n=a(e);n!==t&&delete F[n],e.setAttribute(V,t),F[t]=e}function u(e){return F.hasOwnProperty(e)&&c(F[e],e)||(F[e]=Y.findReactNodeByID(e)),F[e]}function l(e){var t=N.get(e)._rootNodeID;return _.isNullComponentID(t)?null:(F.hasOwnProperty(t)&&c(F[t],t)||(F[t]=Y.findReactNodeByID(t)),F[t])}function c(e,n){if(e){\"production\"!==t.env.NODE_ENV?I(a(e)===n,\"ReactMount: Unexpected modification of `%s`\",V):I(a(e)===n);var r=Y.findReactContainerForID(n);if(r&&M(r,e))return!0}return!1}function p(e){delete F[e]}function f(e){var t=F[e];return!(!t||!c(t,e))&&void(z=t)}function d(e){z=null,O.traverseAncestors(e,f);var t=z;return z=null,t}function h(e,t,n,r,o){var i=P.mountComponent(e,t,r,D);e._isTopLevel=!0,Y._mountImageIntoNode(i,n,o)}function v(e,t,n,r){var o=T.ReactReconcileTransaction.getPooled();o.perform(h,null,e,t,n,o,r),T.ReactReconcileTransaction.release(o)}var m=n(47),y=n(71),g=n(20),b=n(14),E=n(35),_=n(79),O=n(22),N=n(28),w=n(80),C=n(31),P=n(32),x=n(26),T=n(29),D=n(17),M=n(82),S=n(85),k=n(86),I=n(10),R=n(69),A=n(89),j=n(18),L=O.SEPARATOR,V=m.ID_ATTRIBUTE_NAME,F={},U=1,B=9,K={},W={};if(\"production\"!==t.env.NODE_ENV)var H={};var q=[],z=null,Y={_instancesByReactRootID:K,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,n,r,i){return\"production\"!==t.env.NODE_ENV&&E.checkAndWarnForMutatedProps(n),Y.scrollMonitor(r,function(){x.enqueueElementInternal(e,n),i&&x.enqueueCallbackInternal(e,i)}),\"production\"!==t.env.NODE_ENV&&(H[o(r)]=S(r)),e},_registerComponent:function(e,n){\"production\"!==t.env.NODE_ENV?I(n&&(n.nodeType===U||n.nodeType===B),\"_registerComponent(...): Target container is not a DOM element.\"):I(n&&(n.nodeType===U||n.nodeType===B)),y.ensureScrollValueMonitoring();var r=Y.registerContainer(n);return K[r]=e,r},_renderNewRootComponent:function(e,n,r){\"production\"!==t.env.NODE_ENV?j(null==g.current,\"_renderNewRootComponent(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\"):null;var o=k(e,null),i=Y._registerComponent(o,n);return T.batchedUpdates(v,o,i,n,r),\"production\"!==t.env.NODE_ENV&&(H[i]=S(n)),o},render:function(e,n,r){\"production\"!==t.env.NODE_ENV?I(b.isValidElement(e),\"React.render(): Invalid component element.%s\",\"string\"==typeof e?\" Instead of passing an element string, make sure to instantiate it by passing it to React.createElement.\":\"function\"==typeof e?\" Instead of passing a component class, make sure to instantiate it by passing it to React.createElement.\":null!=e&&void 0!==e.props?\" This may be caused by unintentionally loading two independent copies of React.\":\"\"):I(b.isValidElement(e));var i=K[o(n)];if(i){var a=i._currentElement;if(A(a,e))return Y._updateRootComponent(i,e,n,r).getPublicInstance();Y.unmountComponentAtNode(n)}var s=S(n),u=s&&Y.isRenderedByReact(s);if(\"production\"!==t.env.NODE_ENV&&(!u||s.nextSibling))for(var l=s;l;){if(Y.isRenderedByReact(l)){\"production\"!==t.env.NODE_ENV?j(!1,\"render(): Target node has markup rendered by React, but there are unrelated nodes as well. This is most commonly caused by white-space inserted around server-rendered markup.\"):null;break}l=l.nextSibling}var c=u&&!i,p=Y._renderNewRootComponent(e,n,c).getPublicInstance();return r&&r.call(p),p},constructAndRenderComponent:function(e,t,n){var r=b.createElement(e,t);return Y.render(r,n)},constructAndRenderComponentByID:function(e,n,r){var o=document.getElementById(r);return\"production\"!==t.env.NODE_ENV?I(o,'Tried to get element with id of \"%s\" but it is not present on the page.',r):I(o),Y.constructAndRenderComponent(e,n,o)},registerContainer:function(e){var t=o(e);return t&&(t=O.getReactRootIDFromNodeID(t)),t||(t=O.createReactRootID()),W[t]=e,t},unmountComponentAtNode:function(e){\"production\"!==t.env.NODE_ENV?j(null==g.current,\"unmountComponentAtNode(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\"):null,\"production\"!==t.env.NODE_ENV?I(e&&(e.nodeType===U||e.nodeType===B),\"unmountComponentAtNode(...): Target container is not a DOM element.\"):I(e&&(e.nodeType===U||e.nodeType===B));var n=o(e),r=K[n];return!!r&&(Y.unmountComponentFromNode(r,e),delete K[n],delete W[n],\"production\"!==t.env.NODE_ENV&&delete H[n],!0)},unmountComponentFromNode:function(e,t){for(P.unmountComponent(e),t.nodeType===B&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)},findReactContainerForID:function(e){var n=O.getReactRootIDFromNodeID(e),r=W[n];if(\"production\"!==t.env.NODE_ENV){var o=H[n];if(o&&o.parentNode!==r){\"production\"!==t.env.NODE_ENV?I(a(o)===n,\"ReactMount: Root element ID differed from reactRootID.\"):I(a(o)===n);var i=r.firstChild;i&&n===a(i)?H[n]=i:\"production\"!==t.env.NODE_ENV?j(!1,\"ReactMount: Root element has been removed from its original container. New container:\",o.parentNode):null}}return r},findReactNodeByID:function(e){var t=Y.findReactContainerForID(e);return Y.findComponentRoot(t,e)},isRenderedByReact:function(e){if(1!==e.nodeType)return!1;var t=Y.getID(e);return!!t&&t.charAt(0)===L},getFirstReactDOM:function(e){for(var t=e;t&&t.parentNode!==t;){if(Y.isRenderedByReact(t))return t;t=t.parentNode}return null},findComponentRoot:function(e,n){var r=q,o=0,i=d(n)||e;for(r[0]=i.firstChild,r.length=1;o<r.length;){for(var a,s=r[o++];s;){var u=Y.getID(s);u?n===u?a=s:O.isAncestorIDOf(u,n)&&(r.length=o=0,r.push(s.firstChild)):r.push(s.firstChild),s=s.nextSibling}if(a)return r.length=0,a}r.length=0,\"production\"!==t.env.NODE_ENV?I(!1,\"findComponentRoot(..., %s): Unable to find element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID `%s`.\",n,Y.getID(e)):I(!1)},_mountImageIntoNode:function(e,n,o){if(\"production\"!==t.env.NODE_ENV?I(n&&(n.nodeType===U||n.nodeType===B),\"mountComponentIntoNode(...): Target container is not valid.\"):I(n&&(n.nodeType===U||n.nodeType===B)),o){var i=S(n);if(w.canReuseMarkup(e,i))return;var a=i.getAttribute(w.CHECKSUM_ATTR_NAME);i.removeAttribute(w.CHECKSUM_ATTR_NAME);var s=i.outerHTML;i.setAttribute(w.CHECKSUM_ATTR_NAME,a);var u=r(e,s),l=\" (client) \"+e.substring(u-20,u+20)+\"\\n (server) \"+s.substring(u-20,u+20);\"production\"!==t.env.NODE_ENV?I(n.nodeType!==B,\"You're trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\\n%s\",l):I(n.nodeType!==B),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?j(!1,\"React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:\\n%s\",l):null)}\"production\"!==t.env.NODE_ENV?I(n.nodeType!==B,\"You're trying to render a component to the document but you didn't use server rendering. We can't do this without using server rendering due to cross-browser quirks. See React.renderToString() for server rendering.\"):I(n.nodeType!==B),R(n,e)},getReactRootID:o,getID:i,setID:s,getNode:u,getNodeFromInstance:l,purgeID:p};C.measureMethods(Y,\"ReactMount\",{_renderNewRootComponent:\"_renderNewRootComponent\",_mountImageIntoNode:\"_mountImageIntoNode\"}),e.exports=Y}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return Object.prototype.hasOwnProperty.call(e,v)||(e[v]=d++,p[e[v]]={}),p[e[v]]}var o=n(8),i=n(72),a=n(73),s=n(76),u=n(77),l=n(16),c=n(78),p={},f=!1,d=0,h={topBlur:\"blur\",topChange:\"change\",topClick:\"click\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",topDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topScroll:\"scroll\",topSelectionChange:\"selectionchange\",topTextInput:\"textInput\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",topTouchStart:\"touchstart\",topWheel:\"wheel\"},v=\"_reactListenersID\"+String(Math.random()).slice(2),m=l({},s,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(m.handleTopLevel),m.ReactEventListener=e}},setEnabled:function(e){m.ReactEventListener&&m.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!m.ReactEventListener||!m.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,i=r(n),s=a.registrationNameDependencies[e],u=o.topLevelTypes,l=0,p=s.length;l<p;l++){var f=s[l];i.hasOwnProperty(f)&&i[f]||(f===u.topWheel?c(\"wheel\")?m.ReactEventListener.trapBubbledEvent(u.topWheel,\"wheel\",n):c(\"mousewheel\")?m.ReactEventListener.trapBubbledEvent(u.topWheel,\"mousewheel\",n):m.ReactEventListener.trapBubbledEvent(u.topWheel,\"DOMMouseScroll\",n):f===u.topScroll?c(\"scroll\",!0)?m.ReactEventListener.trapCapturedEvent(u.topScroll,\"scroll\",n):m.ReactEventListener.trapBubbledEvent(u.topScroll,\"scroll\",m.ReactEventListener.WINDOW_HANDLE):f===u.topFocus||f===u.topBlur?(c(\"focus\",!0)?(m.ReactEventListener.trapCapturedEvent(u.topFocus,\"focus\",n),m.ReactEventListener.trapCapturedEvent(u.topBlur,\"blur\",n)):c(\"focusin\")&&(m.ReactEventListener.trapBubbledEvent(u.topFocus,\"focusin\",n),m.ReactEventListener.trapBubbledEvent(u.topBlur,\"focusout\",n)),i[u.topBlur]=!0,i[u.topFocus]=!0):h.hasOwnProperty(f)&&m.ReactEventListener.trapBubbledEvent(f,h[f],n),i[f]=!0)}},trapBubbledEvent:function(e,t,n){return m.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return m.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!f){var e=u.refreshScrollValues;m.ReactEventListener.monitorScrollValue(e),f=!0}},eventNameDispatchConfigs:i.eventNameDispatchConfigs,registrationNameModules:i.registrationNameModules,putListener:i.putListener,getListener:i.getListener,deleteListener:i.deleteListener,deleteAllListeners:i.deleteAllListeners});e.exports=m},function(e,t,n){(function(t){\"use strict\";function r(){var e=f&&f.traverseTwoPhase&&f.traverseEnterLeave;\"production\"!==t.env.NODE_ENV?u(e,\"InstanceHandle not injected before use!\"):u(e)}var o=n(73),i=n(7),a=n(74),s=n(75),u=n(10),l={},c=null,p=function(e){if(e){var t=i.executeDispatch,n=o.getPluginModuleForEvent(e);n&&n.executeDispatch&&(t=n.executeDispatch),i.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e)}},f=null,d={injection:{injectMount:i.injection.injectMount,injectInstanceHandle:function(e){f=e,\"production\"!==t.env.NODE_ENV&&r()},getInstanceHandle:function(){return\"production\"!==t.env.NODE_ENV&&r(),f},injectEventPluginOrder:o.injectEventPluginOrder,injectEventPluginsByName:o.injectEventPluginsByName},eventNameDispatchConfigs:o.eventNameDispatchConfigs,registrationNameModules:o.registrationNameModules,putListener:function(e,n,r){\"production\"!==t.env.NODE_ENV?u(!r||\"function\"==typeof r,\"Expected %s listener to be a function, instead got type %s\",n,typeof r):u(!r||\"function\"==typeof r);var o=l[n]||(l[n]={});o[e]=r},getListener:function(e,t){var n=l[t];return n&&n[e]},deleteListener:function(e,t){var n=l[t];n&&delete n[e]},deleteAllListeners:function(e){for(var t in l)delete l[t][e]},extractEvents:function(e,t,n,r){for(var i,s=o.plugins,u=0,l=s.length;u<l;u++){var c=s[u];if(c){var p=c.extractEvents(e,t,n,r);p&&(i=a(i,p))}}return i},enqueueEvents:function(e){e&&(c=a(c,e))},processEventQueue:function(){var e=c;c=null,s(e,p),\"production\"!==t.env.NODE_ENV?u(!c,\"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\"):u(!c)},__purge:function(){l={}},__getListenerBank:function(){return l}};e.exports=d}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){if(s)for(var e in u){var n=u[e],r=s.indexOf(e);if(\"production\"!==t.env.NODE_ENV?a(r>-1,\"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.\",e):a(r>-1),!l.plugins[r]){\"production\"!==t.env.NODE_ENV?a(n.extractEvents,\"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.\",e):a(n.extractEvents),l.plugins[r]=n;var i=n.eventTypes;for(var c in i)\"production\"!==t.env.NODE_ENV?a(o(i[c],n,c),\"EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.\",c,e):a(o(i[c],n,c))}}}function o(e,n,r){\"production\"!==t.env.NODE_ENV?a(!l.eventNameDispatchConfigs.hasOwnProperty(r),\"EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.\",r):a(!l.eventNameDispatchConfigs.hasOwnProperty(r)),l.eventNameDispatchConfigs[r]=e;var o=e.phasedRegistrationNames;if(o){for(var s in o)if(o.hasOwnProperty(s)){var u=o[s];i(u,n,r)}return!0}return!!e.registrationName&&(i(e.registrationName,n,r),!0)}function i(e,n,r){\"production\"!==t.env.NODE_ENV?a(!l.registrationNameModules[e],\"EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.\",e):a(!l.registrationNameModules[e]),l.registrationNameModules[e]=n,l.registrationNameDependencies[e]=n.eventTypes[r].dependencies}var a=n(10),s=null,u={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){\"production\"!==t.env.NODE_ENV?a(!s,\"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\"):a(!s),s=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var n=!1;for(var o in e)if(e.hasOwnProperty(o)){var i=e[o];u.hasOwnProperty(o)&&u[o]===i||(\"production\"!==t.env.NODE_ENV?a(!u[o],\"EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.\",o):a(!u[o]),u[o]=i,n=!0)}n&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){s=null;for(var e in u)u.hasOwnProperty(e)&&delete u[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};e.exports=l}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n){if(\"production\"!==t.env.NODE_ENV?o(null!=n,\"accumulateInto(...): Accumulated items must not be null or undefined.\"):o(null!=n),null==e)return n;var r=Array.isArray(e),i=Array.isArray(n);return r&&i?(e.push.apply(e,n),e):r?(e.push(n),e):i?[e].concat(n):[e,n]}var o=n(10);e.exports=r}).call(t,n(6))},function(e,t){\"use strict\";var n=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};e.exports=n},function(e,t,n){\"use strict\";function r(e){o.enqueueEvents(e),o.processEventQueue()}var o=n(72),i={handleTopLevel:function(e,t,n,i){var a=o.extractEvents(e,t,n,i);r(a)}};e.exports=i},function(e,t){\"use strict\";var n={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){n.currentScrollLeft=e.x,n.currentScrollTop=e.y}};e.exports=n},function(e,t,n){\"use strict\";/**\n\t * Checks if an event is supported in the current execution environment.\n\t *\n\t * NOTE: This will not work correctly for non-generic events such as `change`,\n\t * `reset`, `load`, `error`, and `select`.\n\t *\n\t * Borrows from Modernizr.\n\t *\n\t * @param {string} eventNameSuffix Event name, e.g. \"click\".\n\t * @param {?boolean} capture Check if the capture phase is supported.\n\t * @return {boolean} True if the event is supported.\n\t * @internal\n\t * @license Modernizr 3.0.0pre (Custom Build) | MIT\n\t */\nfunction r(e,t){if(!i.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var n=\"on\"+e,r=n in document;if(!r){var a=document.createElement(\"div\");a.setAttribute(n,\"return;\"),r=\"function\"==typeof a[n]}return!r&&o&&\"wheel\"===e&&(r=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),r}var o,i=n(54);i.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature(\"\",\"\")!==!0),e.exports=r},function(e,t,n){(function(t){\"use strict\";function r(e){c[e]=!0}function o(e){delete c[e]}function i(e){return!!c[e]}var a,s=n(14),u=n(28),l=n(10),c={},p={injectEmptyComponent:function(e){a=s.createFactory(e)}},f=function(){};f.prototype.componentDidMount=function(){var e=u.get(this);e&&r(e._rootNodeID)},f.prototype.componentWillUnmount=function(){var e=u.get(this);e&&o(e._rootNodeID)},f.prototype.render=function(){return\"production\"!==t.env.NODE_ENV?l(a,\"Trying to return null from a render, but no null placeholder component was injected.\"):l(a),a()};var d=s.createElement(f),h={emptyElement:d,injection:p,isNullComponentID:i};e.exports=h}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(81),o={CHECKSUM_ATTR_NAME:\"data-react-checksum\",addChecksumToMarkup:function(e){var t=r(e);return e.replace(\">\",\" \"+o.CHECKSUM_ATTR_NAME+'=\"'+t+'\">')},canReuseMarkup:function(e,t){var n=t.getAttribute(o.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var i=r(e);return i===n}};e.exports=o},function(e,t){\"use strict\";function n(e){for(var t=1,n=0,o=0;o<e.length;o++)t=(t+e.charCodeAt(o))%r,n=(n+t)%r;return t|n<<16}var r=65521;e.exports=n},function(e,t,n){function r(e,t){return!(!e||!t)&&(e===t||!o(e)&&(o(t)?r(e,t.parentNode):e.contains?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var o=n(83);e.exports=r},function(e,t,n){function r(e){return o(e)&&3==e.nodeType}var o=n(84);e.exports=r},function(e,t){function n(e){return!(!e||!(\"function\"==typeof Node?e instanceof Node:\"object\"==typeof e&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName))}e.exports=n},function(e,t){\"use strict\";function n(e){return e?e.nodeType===r?e.documentElement:e.firstChild:null}var r=9;e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e){return\"function\"==typeof e&&\"undefined\"!=typeof e.prototype&&\"function\"==typeof e.prototype.mountComponent&&\"function\"==typeof e.prototype.receiveComponent}function o(e,n){var o;if(null!==e&&e!==!1||(e=a.emptyElement),\"object\"==typeof e){var i=e;\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?c(i&&(\"function\"==typeof i.type||\"string\"==typeof i.type),\"Only functions or strings can be mounted as React components.\"):null),o=n===i.type&&\"string\"==typeof i.type?s.createInternalComponent(i):r(i.type)?new i.type(i):new p}else\"string\"==typeof e||\"number\"==typeof e?o=s.createInstanceForText(e):\"production\"!==t.env.NODE_ENV?l(!1,\"Encountered invalid React node of type %s\",typeof e):l(!1);return\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?c(\"function\"==typeof o.construct&&\"function\"==typeof o.mountComponent&&\"function\"==typeof o.receiveComponent&&\"function\"==typeof o.unmountComponent,\"Only React Components can be mounted.\"):null),o.construct(e),o._mountIndex=0,o._mountImage=null,\"production\"!==t.env.NODE_ENV&&(o._isOwnerNecessary=!1,o._warnedAboutRefsInRender=!1),\"production\"!==t.env.NODE_ENV&&Object.preventExtensions&&Object.preventExtensions(o),o}var i=n(87),a=n(79),s=n(38),u=n(16),l=n(10),c=n(18),p=function(){};u(p.prototype,i.Mixin,{_instantiateReactComponent:o}),e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return\" Check the render method of `\"+n+\"`.\"}return\"\"}var o=n(88),i=n(15),a=n(20),s=n(14),u=n(35),l=n(28),c=n(27),p=n(38),f=n(31),d=n(36),h=n(37),v=n(32),m=n(29),y=n(16),g=n(17),b=n(10),E=n(89),_=n(18),O=1,N={construct:function(e){this._currentElement=e,this._rootNodeID=null,this._instance=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._isTopLevel=!1,this._pendingCallbacks=null},mountComponent:function(e,n,r){this._context=r,this._mountOrder=O++,this._rootNodeID=e;var o=this._processProps(this._currentElement.props),i=this._processContext(this._currentElement._context),a=p.getComponentClassForElement(this._currentElement),s=new a(o,i);\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?_(null!=s.render,\"%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render` in your component or you may have accidentally tried to render an element whose type is a function that isn't a React component.\",a.displayName||a.name||\"Component\"):null),s.props=o,s.context=i,s.refs=g,this._instance=s,l.set(s,this),\"production\"!==t.env.NODE_ENV&&this._warnIfContextsDiffer(this._currentElement._context,r),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?_(!s.getInitialState||s.getInitialState.isReactClassApproved,\"getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(!s.getDefaultProps||s.getDefaultProps.isReactClassApproved,\"getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(!s.propTypes,\"propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(!s.contextTypes,\"contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(\"function\"!=typeof s.componentShouldUpdate,\"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.\",this.getName()||\"A component\"):null);var u=s.state;void 0===u&&(s.state=u=null),\"production\"!==t.env.NODE_ENV?b(\"object\"==typeof u&&!Array.isArray(u),\"%s.state: must be set to an object or null\",this.getName()||\"ReactCompositeComponent\"):b(\"object\"==typeof u&&!Array.isArray(u)),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var f,d,h=c.currentlyMountingInstance;c.currentlyMountingInstance=this;try{s.componentWillMount&&(s.componentWillMount(),this._pendingStateQueue&&(s.state=this._processPendingState(s.props,s.context))),f=this._getValidatedChildContext(r),d=this._renderValidatedComponent(f)}finally{c.currentlyMountingInstance=h}this._renderedComponent=this._instantiateReactComponent(d,this._currentElement.type);var m=v.mountComponent(this._renderedComponent,e,n,this._mergeChildContext(r,f));return s.componentDidMount&&n.getReactMountReady().enqueue(s.componentDidMount,s),m},unmountComponent:function(){var e=this._instance;if(e.componentWillUnmount){var t=c.currentlyUnmountingInstance;c.currentlyUnmountingInstance=this;try{e.componentWillUnmount()}finally{c.currentlyUnmountingInstance=t}}v.unmountComponent(this._renderedComponent),this._renderedComponent=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=null,l.remove(e)},_setPropsInternal:function(e,t){var n=this._pendingElement||this._currentElement;this._pendingElement=s.cloneAndReplaceProps(n,y({},n.props,e)),m.enqueueUpdate(this,t)},_maskContext:function(e){var t=null;if(\"string\"==typeof this._currentElement.type)return g;var n=this._currentElement.type.contextTypes;if(!n)return g;t={};for(var r in n)t[r]=e[r];return t},_processContext:function(e){var n=this._maskContext(e);if(\"production\"!==t.env.NODE_ENV){var r=p.getComponentClassForElement(this._currentElement);r.contextTypes&&this._checkPropTypes(r.contextTypes,n,d.context)}return n},_getValidatedChildContext:function(e){var n=this._instance,r=n.getChildContext&&n.getChildContext();if(r){\"production\"!==t.env.NODE_ENV?b(\"object\"==typeof n.constructor.childContextTypes,\"%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().\",this.getName()||\"ReactCompositeComponent\"):b(\"object\"==typeof n.constructor.childContextTypes),\"production\"!==t.env.NODE_ENV&&this._checkPropTypes(n.constructor.childContextTypes,r,d.childContext);for(var o in r)\"production\"!==t.env.NODE_ENV?b(o in n.constructor.childContextTypes,'%s.getChildContext(): key \"%s\" is not defined in childContextTypes.',this.getName()||\"ReactCompositeComponent\",o):b(o in n.constructor.childContextTypes);return r}return null},_mergeChildContext:function(e,t){return t?y({},e,t):e},_processProps:function(e){if(\"production\"!==t.env.NODE_ENV){var n=p.getComponentClassForElement(this._currentElement);n.propTypes&&this._checkPropTypes(n.propTypes,e,d.prop)}return e},_checkPropTypes:function(e,n,o){var i=this.getName();for(var a in e)if(e.hasOwnProperty(a)){var s;try{\"production\"!==t.env.NODE_ENV?b(\"function\"==typeof e[a],\"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.\",i||\"React class\",h[o],a):b(\"function\"==typeof e[a]),s=e[a](n,a,i,o)}catch(e){s=e}if(s instanceof Error){var u=r(this);o===d.prop?\"production\"!==t.env.NODE_ENV?_(!1,\"Failed Composite propType: %s%s\",s.message,u):null:\"production\"!==t.env.NODE_ENV?_(!1,\"Failed Context Types: %s%s\",s.message,u):null}}},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement&&v.receiveComponent(this,this._pendingElement||this._currentElement,e,this._context),(null!==this._pendingStateQueue||this._pendingForceUpdate)&&(\"production\"!==t.env.NODE_ENV&&u.checkAndWarnForMutatedProps(this._currentElement),this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context))},_warnIfContextsDiffer:function(e,n){e=this._maskContext(e),n=this._maskContext(n);for(var r=Object.keys(n).sort(),o=this.getName()||\"ReactCompositeComponent\",i=0;i<r.length;i++){var a=r[i];\"production\"!==t.env.NODE_ENV?_(e[a]===n[a],\"owner-based and parent-based contexts differ (values: `%s` vs `%s`) for key (%s) while mounting %s (see: http://fb.me/react-context-by-parent)\",e[a],n[a],a,o):null}},updateComponent:function(e,n,r,o,i){var a=this._instance,s=a.context,u=a.props;n!==r&&(s=this._processContext(r._context),u=this._processProps(r.props),\"production\"!==t.env.NODE_ENV&&null!=i&&this._warnIfContextsDiffer(r._context,i),a.componentWillReceiveProps&&a.componentWillReceiveProps(u,s));var l=this._processPendingState(u,s),c=this._pendingForceUpdate||!a.shouldComponentUpdate||a.shouldComponentUpdate(u,l,s);\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?_(\"undefined\"!=typeof c,\"%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.\",this.getName()||\"ReactCompositeComponent\"):null),c?(this._pendingForceUpdate=!1,this._performComponentUpdate(r,u,l,s,e,i)):(this._currentElement=r,this._context=i,a.props=u,a.state=l,a.context=s)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,o=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(o&&1===r.length)return r[0];for(var i=y({},o?r[0]:n.state),a=o?1:0;a<r.length;a++){var s=r[a];y(i,\"function\"==typeof s?s.call(n,i,e,t):s)}return i},_performComponentUpdate:function(e,t,n,r,o,i){var a=this._instance,s=a.props,u=a.state,l=a.context;a.componentWillUpdate&&a.componentWillUpdate(t,n,r),this._currentElement=e,this._context=i,a.props=t,a.state=n,a.context=r,this._updateRenderedComponent(o,i),a.componentDidUpdate&&o.getReactMountReady().enqueue(a.componentDidUpdate.bind(a,s,u,l),a)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._getValidatedChildContext(),i=this._renderValidatedComponent(o);if(E(r,i))v.receiveComponent(n,i,e,this._mergeChildContext(t,o));else{var a=this._rootNodeID,s=n._rootNodeID;v.unmountComponent(n),this._renderedComponent=this._instantiateReactComponent(i,this._currentElement.type);var u=v.mountComponent(this._renderedComponent,a,e,this._mergeChildContext(t,o));this._replaceNodeWithMarkupByID(s,u)}},_replaceNodeWithMarkupByID:function(e,t){o.replaceNodeWithMarkupByID(e,t)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance,n=e.render();return\"production\"!==t.env.NODE_ENV&&\"undefined\"==typeof n&&e.render._isMockFunction&&(n=null),n},_renderValidatedComponent:function(e){var n,r=i.current;i.current=this._mergeChildContext(this._currentElement._context,e),a.current=this;try{n=this._renderValidatedComponentWithoutOwnerOrContext()}finally{i.current=r,a.current=null}return\"production\"!==t.env.NODE_ENV?b(null===n||n===!1||s.isValidElement(n),\"%s.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.\",this.getName()||\"ReactCompositeComponent\"):b(null===n||n===!1||s.isValidElement(n)),n},attachRef:function(e,t){var n=this.getPublicInstance(),r=n.refs===g?n.refs={}:n.refs;r[e]=t.getPublicInstance()},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){return this._instance},_instantiateReactComponent:null};f.measureMethods(N,\"ReactCompositeComponent\",{mountComponent:\"mountComponent\",updateComponent:\"updateComponent\",_renderValidatedComponent:\"_renderValidatedComponent\"});var w={Mixin:N};e.exports=w}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(10),o=!1,i={unmountIDFromEnvironment:null,replaceNodeWithMarkupByID:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){\"production\"!==t.env.NODE_ENV?r(!o,\"ReactCompositeComponent: injectEnvironment() can only be called once.\"):r(!o),i.unmountIDFromEnvironment=e.unmountIDFromEnvironment,i.replaceNodeWithMarkupByID=e.replaceNodeWithMarkupByID,i.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};e.exports=i}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n){if(null!=e&&null!=n){var r=typeof e,i=typeof n;if(\"string\"===r||\"number\"===r)return\"string\"===i||\"number\"===i;if(\"object\"===i&&e.type===n.type&&e.key===n.key){var a=e._owner===n._owner,s=null,u=null,l=null;return\"production\"!==t.env.NODE_ENV&&(a||(null!=e._owner&&null!=e._owner.getPublicInstance()&&null!=e._owner.getPublicInstance().constructor&&(s=e._owner.getPublicInstance().constructor.displayName),null!=n._owner&&null!=n._owner.getPublicInstance()&&null!=n._owner.getPublicInstance().constructor&&(u=n._owner.getPublicInstance().constructor.displayName),null!=n.type&&null!=n.type.displayName&&(l=n.type.displayName),null!=n.type&&\"string\"==typeof n.type&&(l=n.type),\"string\"==typeof n.type&&\"input\"!==n.type&&\"textarea\"!==n.type||(null!=e._owner&&e._owner._isOwnerNecessary===!1||null!=n._owner&&n._owner._isOwnerNecessary===!1)&&(null!=e._owner&&(e._owner._isOwnerNecessary=!0),null!=n._owner&&(n._owner._isOwnerNecessary=!0),\"production\"!==t.env.NODE_ENV?o(!1,\"<%s /> is being rendered by both %s and %s using the same key (%s) in the same place. Currently, this means that they don't preserve state. This behavior should be very rare so we're considering deprecating it. Please contact the React team and explain your use case so that we can take that into consideration.\",l||\"Unknown Component\",s||\"[Unknown]\",u||\"[Unknown]\",e.key):null))),a}}return!1}var o=n(18);e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){e&&(null!=e.dangerouslySetInnerHTML&&(\"production\"!==t.env.NODE_ENV?y(null==e.children,\"Can only set one of `children` or `props.dangerouslySetInnerHTML`.\"):y(null==e.children),\"production\"!==t.env.NODE_ENV?y(\"object\"==typeof e.dangerouslySetInnerHTML&&\"__html\"in e.dangerouslySetInnerHTML,\"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\"):y(\"object\"==typeof e.dangerouslySetInnerHTML&&\"__html\"in e.dangerouslySetInnerHTML)),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?E(null==e.innerHTML,\"Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`.\"):null,\"production\"!==t.env.NODE_ENV?E(!e.contentEditable||null==e.children,\"A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.\"):null),\"production\"!==t.env.NODE_ENV?y(null==e.style||\"object\"==typeof e.style,\"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.\"):y(null==e.style||\"object\"==typeof e.style))}function o(e,n,r,o){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?E(\"onScroll\"!==n||g(\"scroll\",!0),\"This browser doesn't support the `onScroll` event\"):null);var i=f.findReactContainerForID(e);if(i){var a=i.nodeType===P?i.ownerDocument:i;O(n,a)}o.getPutListenerQueue().enqueuePutListener(e,n,r)}function i(e){S.call(M,e)||(\"production\"!==t.env.NODE_ENV?y(D.test(e),\"Invalid tag: %s\",e):y(D.test(e)),M[e]=!0)}function a(e){i(e),this._tag=e,this._renderedChildren=null,this._previousStyleCopy=null,this._rootNodeID=null}var s=n(52),u=n(47),l=n(46),c=n(71),p=n(50),f=n(70),d=n(91),h=n(31),v=n(16),m=n(49),y=n(10),g=n(78),b=n(42),E=n(18),_=c.deleteListener,O=c.listenTo,N=c.registrationNameModules,w={string:!0,number:!0},C=b({style:null}),P=1,x=null,T={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},D=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,M={},S={}.hasOwnProperty;a.displayName=\"ReactDOMComponent\",a.Mixin={construct:function(e){this._currentElement=e},mountComponent:function(e,t,n){this._rootNodeID=e,r(this._currentElement.props);var o=T[this._tag]?\"\":\"</\"+this._tag+\">\";return this._createOpenTagMarkupAndPutListeners(t)+this._createContentMarkup(t,n)+o},_createOpenTagMarkupAndPutListeners:function(e){var t=this._currentElement.props,n=\"<\"+this._tag;for(var r in t)if(t.hasOwnProperty(r)){var i=t[r];if(null!=i)if(N.hasOwnProperty(r))o(this._rootNodeID,r,i,e);else{r===C&&(i&&(i=this._previousStyleCopy=v({},t.style)),i=s.createMarkupForStyles(i));var a=l.createMarkupForProperty(r,i);a&&(n+=\" \"+a)}}if(e.renderToStaticMarkup)return n+\">\";var u=l.createMarkupForID(this._rootNodeID);return n+\" \"+u+\">\"},_createContentMarkup:function(e,t){var n=\"\";\"listing\"!==this._tag&&\"pre\"!==this._tag&&\"textarea\"!==this._tag||(n=\"\\n\");var r=this._currentElement.props,o=r.dangerouslySetInnerHTML;if(null!=o){if(null!=o.__html)return n+o.__html}else{var i=w[typeof r.children]?r.children:null,a=null!=i?null:r.children;if(null!=i)return n+m(i);if(null!=a){var s=this.mountChildren(a,e,t);return n+s.join(\"\")}}return n},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,o){r(this._currentElement.props),this._updateDOMProperties(t.props,e),this._updateDOMChildren(t.props,e,o)},_updateDOMProperties:function(e,t){var n,r,i,a=this._currentElement.props;for(n in e)if(!a.hasOwnProperty(n)&&e.hasOwnProperty(n))if(n===C){var s=this._previousStyleCopy;for(r in s)s.hasOwnProperty(r)&&(i=i||{},i[r]=\"\");this._previousStyleCopy=null}else N.hasOwnProperty(n)?_(this._rootNodeID,n):(u.isStandardName[n]||u.isCustomAttribute(n))&&x.deletePropertyByID(this._rootNodeID,n);for(n in a){var l=a[n],c=n===C?this._previousStyleCopy:e[n];if(a.hasOwnProperty(n)&&l!==c)if(n===C)if(l?l=this._previousStyleCopy=v({},l):this._previousStyleCopy=null,c){for(r in c)!c.hasOwnProperty(r)||l&&l.hasOwnProperty(r)||(i=i||{},i[r]=\"\");for(r in l)l.hasOwnProperty(r)&&c[r]!==l[r]&&(i=i||{},i[r]=l[r])}else i=l;else N.hasOwnProperty(n)?o(this._rootNodeID,n,l,t):(u.isStandardName[n]||u.isCustomAttribute(n))&&x.updatePropertyByID(this._rootNodeID,n,l)}i&&x.updateStylesByID(this._rootNodeID,i)},_updateDOMChildren:function(e,t,n){var r=this._currentElement.props,o=w[typeof e.children]?e.children:null,i=w[typeof r.children]?r.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,s=r.dangerouslySetInnerHTML&&r.dangerouslySetInnerHTML.__html,u=null!=o?null:e.children,l=null!=i?null:r.children,c=null!=o||null!=a,p=null!=i||null!=s;null!=u&&null==l?this.updateChildren(null,t,n):c&&!p&&this.updateTextContent(\"\"),null!=i?o!==i&&this.updateTextContent(\"\"+i):null!=s?a!==s&&x.updateInnerHTMLByID(this._rootNodeID,s):null!=l&&this.updateChildren(l,t,n)},unmountComponent:function(){this.unmountChildren(),c.deleteAllListeners(this._rootNodeID),p.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null}},h.measureMethods(a,\"ReactDOMComponent\",{mountComponent:\"mountComponent\",updateComponent:\"updateComponent\"}),v(a.prototype,a.Mixin,d.Mixin),a.injection={injectIDOperations:function(e){a.BackendIDOperations=x=e}},e.exports=a}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t,n){h.push({parentID:e,parentNode:null,type:c.INSERT_MARKUP,markupIndex:v.push(t)-1,textContent:null,fromIndex:null,toIndex:n})}function o(e,t,n){h.push({parentID:e,parentNode:null,type:c.MOVE_EXISTING,markupIndex:null,textContent:null,fromIndex:t,toIndex:n})}function i(e,t){h.push({parentID:e,parentNode:null,type:c.REMOVE_NODE,markupIndex:null,textContent:null,fromIndex:t,toIndex:null})}function a(e,t){h.push({parentID:e,parentNode:null,type:c.TEXT_CONTENT,markupIndex:null,textContent:t,fromIndex:null,toIndex:null})}function s(){h.length&&(l.processChildrenUpdates(h,v),u())}function u(){h.length=0,v.length=0}var l=n(88),c=n(67),p=n(32),f=n(92),d=0,h=[],v=[],m={Mixin:{mountChildren:function(e,t,n){var r=f.instantiateChildren(e,t,n);this._renderedChildren=r;var o=[],i=0;for(var a in r)if(r.hasOwnProperty(a)){var s=r[a],u=this._rootNodeID+a,l=p.mountComponent(s,u,t,n);s._mountIndex=i,o.push(l),i++}return o},updateTextContent:function(e){d++;var t=!0;try{var n=this._renderedChildren;f.unmountChildren(n);for(var r in n)n.hasOwnProperty(r)&&this._unmountChildByName(n[r],r);this.setTextContent(e),t=!1}finally{d--,d||(t?u():s())}},updateChildren:function(e,t,n){d++;var r=!0;try{this._updateChildren(e,t,n),r=!1}finally{d--,d||(r?u():s())}},_updateChildren:function(e,t,n){var r=this._renderedChildren,o=f.updateChildren(r,e,t,n);if(this._renderedChildren=o,o||r){var i,a=0,s=0;for(i in o)if(o.hasOwnProperty(i)){var u=r&&r[i],l=o[i];u===l?(this.moveChild(u,s,a),a=Math.max(u._mountIndex,a),u._mountIndex=s):(u&&(a=Math.max(u._mountIndex,a),this._unmountChildByName(u,i)),this._mountChildByNameAtIndex(l,i,s,t,n)),s++}for(i in r)!r.hasOwnProperty(i)||o&&o.hasOwnProperty(i)||this._unmountChildByName(r[i],i)}},unmountChildren:function(){var e=this._renderedChildren;f.unmountChildren(e),this._renderedChildren=null},moveChild:function(e,t,n){e._mountIndex<n&&o(this._rootNodeID,e._mountIndex,t)},createChild:function(e,t){r(this._rootNodeID,t,e._mountIndex)},removeChild:function(e){i(this._rootNodeID,e._mountIndex)},setTextContent:function(e){a(this._rootNodeID,e)},_mountChildByNameAtIndex:function(e,t,n,r,o){var i=this._rootNodeID+t,a=p.mountComponent(e,i,r,o);e._mountIndex=n,this.createChild(e,a)},_unmountChildByName:function(e,t){this.removeChild(e),e._mountIndex=null}}};e.exports=m},function(e,t,n){\"use strict\";var r=n(32),o=n(93),i=n(86),a=n(89),s={instantiateChildren:function(e,t,n){var r=o(e);for(var a in r)if(r.hasOwnProperty(a)){var s=r[a],u=i(s,null);r[a]=u}return r},updateChildren:function(e,t,n,s){var u=o(t);if(!u&&!e)return null;var l;for(l in u)if(u.hasOwnProperty(l)){var c=e&&e[l],p=c&&c._currentElement,f=u[l];if(a(p,f))r.receiveComponent(c,f,n,s),u[l]=c;else{c&&r.unmountComponent(c,l);var d=i(f,null);u[l]=d}}for(l in e)!e.hasOwnProperty(l)||u&&u.hasOwnProperty(l)||r.unmountComponent(e[l]);return u},unmountChildren:function(e){for(var t in e){var n=e[t];r.unmountComponent(n)}}};e.exports=s},function(e,t,n){(function(t){\"use strict\";function r(e,n,r){var o=e,i=!o.hasOwnProperty(r);\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?a(i,\"flattenChildren(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.\",r):null),i&&null!=n&&(o[r]=n)}function o(e){if(null==e)return e;var t={};return i(e,r,t),t}var i=n(21),a=n(18);e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return h.createClass({tagName:e.toUpperCase(),render:function(){return new T(e,null,null,null,null,this.props)}})}function o(){if(M.EventEmitter.injectReactEventListener(D),M.EventPluginHub.injectEventPluginOrder(u),M.EventPluginHub.injectInstanceHandle(S),M.EventPluginHub.injectMount(k),M.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:j,EnterLeaveEventPlugin:l,ChangeEventPlugin:a,MobileSafariClickEventPlugin:f,SelectEventPlugin:R,BeforeInputEventPlugin:i}),M.NativeComponent.injectGenericComponentClass(y),M.NativeComponent.injectTextComponentClass(x),M.NativeComponent.injectAutoWrapper(r),M.Class.injectMixin(d),M.NativeComponent.injectComponentClasses({button:g,form:b,iframe:O,img:E,input:N,option:w,select:C,textarea:P,html:V(\"html\"),head:V(\"head\"),body:V(\"body\")}),M.DOMProperty.injectDOMPropertyConfig(p),M.DOMProperty.injectDOMPropertyConfig(L),M.EmptyComponent.injectEmptyComponent(\"noscript\"),M.Updates.injectReconcileTransaction(I),M.Updates.injectBatchingStrategy(m),M.RootIndex.injectCreateReactRootIndex(c.canUseDOM?s.createReactRootIndex:A.createReactRootIndex),M.Component.injectEnvironment(v),M.DOMComponent.injectIDOperations(_),\"production\"!==t.env.NODE_ENV){var e=c.canUseDOM&&window.location.href||\"\";if(/[?&]react_perf\\b/.test(e)){var o=n(153);o.start()}}}var i=n(95),a=n(103),s=n(105),u=n(106),l=n(107),c=n(54),p=n(111),f=n(112),d=n(113),h=n(40),v=n(50),m=n(115),y=n(90),g=n(116),b=n(119),E=n(121),_=n(51),O=n(122),N=n(123),w=n(126),C=n(127),P=n(128),x=n(45),T=n(14),D=n(129),M=n(132),S=n(22),k=n(70),I=n(133),R=n(139),A=n(141),j=n(142),L=n(151),V=n(152);e.exports={inject:o}}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){var e=window.opera;return\"object\"==typeof e&&\"function\"==typeof e.version&&parseInt(e.version(),10)<=12}function o(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function i(e){switch(e){case T.topCompositionStart:return D.compositionStart;case T.topCompositionEnd:return D.compositionEnd;case T.topCompositionUpdate:return D.compositionUpdate}}function a(e,t){return e===T.topKeyDown&&t.keyCode===_}function s(e,t){switch(e){case T.topKeyUp:return E.indexOf(t.keyCode)!==-1;case T.topKeyDown:return t.keyCode!==_;case T.topKeyPress:case T.topMouseDown:case T.topBlur:return!0;default:return!1}}function u(e){var t=e.detail;return\"object\"==typeof t&&\"data\"in t?t.data:null}function l(e,t,n,r){var o,l;if(O?o=i(e):S?s(e,r)&&(o=D.compositionEnd):a(e,r)&&(o=D.compositionStart),!o)return null;C&&(S||o!==D.compositionStart?o===D.compositionEnd&&S&&(l=S.getData()):S=m.getPooled(t));var c=y.getPooled(o,n,r);if(l)c.data=l;else{var p=u(r);null!==p&&(c.data=p)}return h.accumulateTwoPhaseDispatches(c),c}function c(e,t){switch(e){case T.topCompositionEnd:return u(t);case T.topKeyPress:var n=t.which;return n!==P?null:(M=!0,x);case T.topTextInput:var r=t.data;return r===x&&M?null:r;default:return null}}function p(e,t){if(S){if(e===T.topCompositionEnd||s(e,t)){var n=S.getData();return m.release(S),S=null,n}return null}switch(e){case T.topPaste:return null;case T.topKeyPress:return t.which&&!o(t)?String.fromCharCode(t.which):null;case T.topCompositionEnd:return C?null:t.data;default:return null}}function f(e,t,n,r){var o;if(o=w?c(e,r):p(e,r),!o)return null;var i=g.getPooled(D.beforeInput,n,r);return i.data=o,h.accumulateTwoPhaseDispatches(i),i}var d=n(8),h=n(96),v=n(54),m=n(97),y=n(99),g=n(102),b=n(42),E=[9,13,27,32],_=229,O=v.canUseDOM&&\"CompositionEvent\"in window,N=null;v.canUseDOM&&\"documentMode\"in document&&(N=document.documentMode);var w=v.canUseDOM&&\"TextEvent\"in window&&!N&&!r(),C=v.canUseDOM&&(!O||N&&N>8&&N<=11),P=32,x=String.fromCharCode(P),T=d.topLevelTypes,D={beforeInput:{phasedRegistrationNames:{bubbled:b({onBeforeInput:null}),captured:b({onBeforeInputCapture:null})},dependencies:[T.topCompositionEnd,T.topKeyPress,T.topTextInput,T.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:b({onCompositionEnd:null}),captured:b({onCompositionEndCapture:null})},dependencies:[T.topBlur,T.topCompositionEnd,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:b({onCompositionStart:null}),captured:b({onCompositionStartCapture:null})},dependencies:[T.topBlur,T.topCompositionStart,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:b({onCompositionUpdate:null}),captured:b({onCompositionUpdateCapture:null})},dependencies:[T.topBlur,T.topCompositionUpdate,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]}},M=!1,S=null,k={eventTypes:D,extractEvents:function(e,t,n,r){return[l(e,t,n,r),f(e,t,n,r)]}};e.exports=k},function(e,t,n){(function(t){\"use strict\";function r(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return m(e,r)}function o(e,n,o){if(\"production\"!==t.env.NODE_ENV&&!e)throw new Error(\"Dispatching id must not be null\");var i=n?v.bubbled:v.captured,a=r(e,o,i);a&&(o._dispatchListeners=d(o._dispatchListeners,a),o._dispatchIDs=d(o._dispatchIDs,e))}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&f.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker,o,e)}function a(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=m(e,r);o&&(n._dispatchListeners=d(n._dispatchListeners,o),n._dispatchIDs=d(n._dispatchIDs,e))}}function s(e){e&&e.dispatchConfig.registrationName&&a(e.dispatchMarker,null,e)}function u(e){h(e,i)}function l(e,t,n,r){f.injection.getInstanceHandle().traverseEnterLeave(n,r,a,e,t)}function c(e){h(e,s)}var p=n(8),f=n(72),d=n(74),h=n(75),v=p.PropagationPhases,m=f.getListener,y={accumulateTwoPhaseDispatches:u,accumulateDirectDispatches:c,accumulateEnterLeaveDispatches:l};e.exports=y}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var o=n(12),i=n(16),a=n(98);i(r.prototype,{getText:function(){return\"value\"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=o.slice(e,s),this._fallbackText}}),o.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(){return!i&&o.canUseDOM&&(i=\"textContent\"in document.documentElement?\"textContent\":\"innerText\"),i}var o=n(54),i=null;e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i={data:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){this.dispatchConfig=e,this.dispatchMarker=t,this.nativeEvent=n;var r=this.constructor.Interface;for(var o in r)if(r.hasOwnProperty(o)){var i=r[o];i?this[o]=i(n):this[o]=n[o]}var s=null!=n.defaultPrevented?n.defaultPrevented:n.returnValue===!1;\ns?this.isDefaultPrevented=a.thatReturnsTrue:this.isDefaultPrevented=a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse}var o=n(12),i=n(16),a=n(19),s=n(101),u={type:null,target:s,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};i(r.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e.preventDefault?e.preventDefault():e.returnValue=!1,this.isDefaultPrevented=a.thatReturnsTrue},stopPropagation:function(){var e=this.nativeEvent;e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this.isPropagationStopped=a.thatReturnsTrue},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;this.dispatchConfig=null,this.dispatchMarker=null,this.nativeEvent=null}}),r.Interface=u,r.augmentClass=function(e,t){var n=this,r=Object.create(n.prototype);i(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=i({},n.Interface,t),e.augmentClass=n.augmentClass,o.addPoolingTo(e,o.threeArgumentPooler)},o.addPoolingTo(r,o.threeArgumentPooler),e.exports=r},function(e,t){\"use strict\";function n(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i={data:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e){return\"SELECT\"===e.nodeName||\"INPUT\"===e.nodeName&&\"file\"===e.type}function o(e){var t=N.getPooled(T.change,M,e);E.accumulateTwoPhaseDispatches(t),O.batchedUpdates(i,t)}function i(e){b.enqueueEvents(e),b.processEventQueue()}function a(e,t){D=e,M=t,D.attachEvent(\"onchange\",o)}function s(){D&&(D.detachEvent(\"onchange\",o),D=null,M=null)}function u(e,t,n){if(e===x.topChange)return n}function l(e,t,n){e===x.topFocus?(s(),a(t,n)):e===x.topBlur&&s()}function c(e,t){D=e,M=t,S=e.value,k=Object.getOwnPropertyDescriptor(e.constructor.prototype,\"value\"),Object.defineProperty(D,\"value\",A),D.attachEvent(\"onpropertychange\",f)}function p(){D&&(delete D.value,D.detachEvent(\"onpropertychange\",f),D=null,M=null,S=null,k=null)}function f(e){if(\"value\"===e.propertyName){var t=e.srcElement.value;t!==S&&(S=t,o(e))}}function d(e,t,n){if(e===x.topInput)return n}function h(e,t,n){e===x.topFocus?(p(),c(t,n)):e===x.topBlur&&p()}function v(e,t,n){if((e===x.topSelectionChange||e===x.topKeyUp||e===x.topKeyDown)&&D&&D.value!==S)return S=D.value,M}function m(e){return\"INPUT\"===e.nodeName&&(\"checkbox\"===e.type||\"radio\"===e.type)}function y(e,t,n){if(e===x.topClick)return n}var g=n(8),b=n(72),E=n(96),_=n(54),O=n(29),N=n(100),w=n(78),C=n(104),P=n(42),x=g.topLevelTypes,T={change:{phasedRegistrationNames:{bubbled:P({onChange:null}),captured:P({onChangeCapture:null})},dependencies:[x.topBlur,x.topChange,x.topClick,x.topFocus,x.topInput,x.topKeyDown,x.topKeyUp,x.topSelectionChange]}},D=null,M=null,S=null,k=null,I=!1;_.canUseDOM&&(I=w(\"change\")&&(!(\"documentMode\"in document)||document.documentMode>8));var R=!1;_.canUseDOM&&(R=w(\"input\")&&(!(\"documentMode\"in document)||document.documentMode>9));var A={get:function(){return k.get.call(this)},set:function(e){S=\"\"+e,k.set.call(this,e)}},j={eventTypes:T,extractEvents:function(e,t,n,o){var i,a;if(r(t)?I?i=u:a=l:C(t)?R?i=d:(i=v,a=h):m(t)&&(i=y),i){var s=i(e,t,n);if(s){var c=N.getPooled(T.change,s,o);return E.accumulateTwoPhaseDispatches(c),c}}a&&a(e,t,n)}};e.exports=j},function(e,t){\"use strict\";function n(e){return e&&(\"INPUT\"===e.nodeName&&r[e.type]||\"TEXTAREA\"===e.nodeName)}var r={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};e.exports=n},function(e,t){\"use strict\";var n=0,r={createReactRootIndex:function(){return n++}};e.exports=r},function(e,t,n){\"use strict\";var r=n(42),o=[r({ResponderEventPlugin:null}),r({SimpleEventPlugin:null}),r({TapEventPlugin:null}),r({EnterLeaveEventPlugin:null}),r({ChangeEventPlugin:null}),r({SelectEventPlugin:null}),r({BeforeInputEventPlugin:null}),r({AnalyticsEventPlugin:null}),r({MobileSafariClickEventPlugin:null})];e.exports=o},function(e,t,n){\"use strict\";var r=n(8),o=n(96),i=n(108),a=n(70),s=n(42),u=r.topLevelTypes,l=a.getFirstReactDOM,c={mouseEnter:{registrationName:s({onMouseEnter:null}),dependencies:[u.topMouseOut,u.topMouseOver]},mouseLeave:{registrationName:s({onMouseLeave:null}),dependencies:[u.topMouseOut,u.topMouseOver]}},p=[null,null],f={eventTypes:c,extractEvents:function(e,t,n,r){if(e===u.topMouseOver&&(r.relatedTarget||r.fromElement))return null;if(e!==u.topMouseOut&&e!==u.topMouseOver)return null;var s;if(t.window===t)s=t;else{var f=t.ownerDocument;s=f?f.defaultView||f.parentWindow:window}var d,h;if(e===u.topMouseOut?(d=t,h=l(r.relatedTarget||r.toElement)||s):(d=s,h=t),d===h)return null;var v=d?a.getID(d):\"\",m=h?a.getID(h):\"\",y=i.getPooled(c.mouseLeave,v,r);y.type=\"mouseleave\",y.target=d,y.relatedTarget=h;var g=i.getPooled(c.mouseEnter,m,r);return g.type=\"mouseenter\",g.target=h,g.relatedTarget=d,o.accumulateEnterLeaveDispatches(y,g,v,m),p[0]=y,p[1]=g,p}};e.exports=f},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i=n(77),a=n(110),s={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:a,button:function(e){var t=e.button;return\"which\"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return\"pageX\"in e?e.pageX:e.clientX+i.currentScrollLeft},pageY:function(e){return\"pageY\"in e?e.pageY:e.clientY+i.currentScrollTop}};o.augmentClass(r,s),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i=n(101),a={view:function(e){if(e.view)return e.view;var t=i(e);if(null!=t&&t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};o.augmentClass(r,a),e.exports=r},function(e,t){\"use strict\";function n(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=o[e];return!!r&&!!n[r]}function r(e){return n}var o={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};e.exports=r},function(e,t,n){\"use strict\";var r,o=n(47),i=n(54),a=o.injection.MUST_USE_ATTRIBUTE,s=o.injection.MUST_USE_PROPERTY,u=o.injection.HAS_BOOLEAN_VALUE,l=o.injection.HAS_SIDE_EFFECTS,c=o.injection.HAS_NUMERIC_VALUE,p=o.injection.HAS_POSITIVE_NUMERIC_VALUE,f=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(i.canUseDOM){var d=document.implementation;r=d&&d.hasFeature&&d.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\",\"1.1\")}var h={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:a|u,allowTransparency:a,alt:null,async:u,autoComplete:null,autoPlay:u,cellPadding:null,cellSpacing:null,charSet:a,checked:s|u,classID:a,className:r?a:s,cols:a|p,colSpan:null,content:null,contentEditable:null,contextMenu:a,controls:s|u,coords:null,crossOrigin:null,data:null,dateTime:a,defer:u,dir:null,disabled:a|u,download:f,draggable:null,encType:null,form:a,formAction:a,formEncType:a,formMethod:a,formNoValidate:u,formTarget:a,frameBorder:a,headers:null,height:a,hidden:a|u,high:null,href:null,hrefLang:null,htmlFor:null,httpEquiv:null,icon:null,id:s,label:null,lang:null,list:a,loop:s|u,low:null,manifest:a,marginHeight:null,marginWidth:null,max:null,maxLength:a,media:a,mediaGroup:null,method:null,min:null,multiple:s|u,muted:s|u,name:null,noValidate:u,open:u,optimum:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:s|u,rel:null,required:u,role:a,rows:a|p,rowSpan:null,sandbox:null,scope:null,scoped:u,scrolling:null,seamless:a|u,selected:s|u,shape:null,size:a|p,sizes:a,span:p,spellCheck:null,src:null,srcDoc:s,srcSet:a,start:c,step:null,style:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:s|l,width:a,wmode:a,autoCapitalize:null,autoCorrect:null,itemProp:a,itemScope:a|u,itemType:a,itemID:a,itemRef:a,property:null,unselectable:a},DOMAttributeNames:{acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},DOMPropertyNames:{autoCapitalize:\"autocapitalize\",autoComplete:\"autocomplete\",autoCorrect:\"autocorrect\",autoFocus:\"autofocus\",autoPlay:\"autoplay\",encType:\"encoding\",hrefLang:\"hreflang\",radioGroup:\"radiogroup\",spellCheck:\"spellcheck\",srcDoc:\"srcdoc\",srcSet:\"srcset\"}};e.exports=h},function(e,t,n){\"use strict\";var r=n(8),o=n(19),i=r.topLevelTypes,a={eventTypes:null,extractEvents:function(e,t,n,r){if(e===i.topTouchStart){var a=r.target;a&&!a.onclick&&(a.onclick=o)}}};e.exports=a},function(e,t,n){\"use strict\";var r=n(114),o={getDOMNode:function(){return r(this)}};e.exports=o},function(e,t,n){(function(t){\"use strict\";function r(e){if(\"production\"!==t.env.NODE_ENV){var n=o.current;null!==n&&(\"production\"!==t.env.NODE_ENV?l(n._warnedAboutRefsInRender,\"%s is accessing getDOMNode or findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.\",n.getName()||\"A component\"):null,n._warnedAboutRefsInRender=!0)}return null==e?null:u(e)?e:i.has(e)?a.getNodeFromInstance(e):(\"production\"!==t.env.NODE_ENV?s(null==e.render||\"function\"!=typeof e.render,\"Component (with keys: %s) contains `render` method but is not mounted in the DOM\",Object.keys(e)):s(null==e.render||\"function\"!=typeof e.render),void(\"production\"!==t.env.NODE_ENV?s(!1,\"Element appears to be neither ReactComponent nor DOMNode (keys: %s)\",Object.keys(e)):s(!1)))}var o=n(20),i=n(28),a=n(70),s=n(10),u=n(84),l=n(18);e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){this.reinitializeTransaction()}var o=n(29),i=n(39),a=n(16),s=n(19),u={initialize:s,close:function(){f.isBatchingUpdates=!1}},l={initialize:s,close:o.flushBatchedUpdates.bind(o)},c=[l,u];a(r.prototype,i.Mixin,{getTransactionWrappers:function(){return c}});var p=new r,f={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o){var i=f.isBatchingUpdates;f.isBatchingUpdates=!0,i?e(t,n,r,o):p.perform(e,null,t,n,r,o)}};e.exports=f},function(e,t,n){\"use strict\";var r=n(117),o=n(113),i=n(40),a=n(14),s=n(9),u=a.createFactory(\"button\"),l=s({onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0}),c=i.createClass({displayName:\"ReactDOMButton\",tagName:\"BUTTON\",mixins:[r,o],render:function(){var e={};for(var t in this.props)!this.props.hasOwnProperty(t)||this.props.disabled&&l[t]||(e[t]=this.props[t]);return u(e,this.props.children)}});e.exports=c},function(e,t,n){\"use strict\";var r=n(118),o={componentDidMount:function(){this.props.autoFocus&&r(this.getDOMNode())}};e.exports=o},function(e,t){\"use strict\";function n(e){try{e.focus()}catch(e){}}e.exports=n},function(e,t,n){\"use strict\";var r=n(8),o=n(120),i=n(113),a=n(40),s=n(14),u=s.createFactory(\"form\"),l=a.createClass({displayName:\"ReactDOMForm\",tagName:\"FORM\",mixins:[i,o],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topReset,\"reset\"),this.trapBubbledEvent(r.topLevelTypes.topSubmit,\"submit\")}});e.exports=l},function(e,t,n){(function(t){\"use strict\";function r(e){e.remove()}var o=n(71),i=n(74),a=n(75),s=n(10),u={trapBubbledEvent:function(e,n){\"production\"!==t.env.NODE_ENV?s(this.isMounted(),\"Must be mounted to trap events\"):s(this.isMounted());var r=this.getDOMNode();\"production\"!==t.env.NODE_ENV?s(r,\"LocalEventTrapMixin.trapBubbledEvent(...): Requires node to be rendered.\"):s(r);var a=o.trapBubbledEvent(e,n,r);this._localEventListeners=i(this._localEventListeners,a)},componentWillUnmount:function(){this._localEventListeners&&a(this._localEventListeners,r)}};e.exports=u}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(8),o=n(120),i=n(113),a=n(40),s=n(14),u=s.createFactory(\"img\"),l=a.createClass({displayName:\"ReactDOMImg\",tagName:\"IMG\",mixins:[i,o],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topLoad,\"load\"),this.trapBubbledEvent(r.topLevelTypes.topError,\"error\")}});e.exports=l},function(e,t,n){\"use strict\";var r=n(8),o=n(120),i=n(113),a=n(40),s=n(14),u=s.createFactory(\"iframe\"),l=a.createClass({displayName:\"ReactDOMIframe\",tagName:\"IFRAME\",mixins:[i,o],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topLoad,\"load\")}});e.exports=l},function(e,t,n){(function(t){\"use strict\";function r(){this.isMounted()&&this.forceUpdate()}var o=n(117),i=n(46),a=n(124),s=n(113),u=n(40),l=n(14),c=n(70),p=n(29),f=n(16),d=n(10),h=l.createFactory(\"input\"),v={},m=u.createClass({displayName:\"ReactDOMInput\",tagName:\"INPUT\",mixins:[o,a.Mixin,s],getInitialState:function(){var e=this.props.defaultValue;return{initialChecked:this.props.defaultChecked||!1,initialValue:null!=e?e:null}},render:function(){var e=f({},this.props);e.defaultChecked=null,e.defaultValue=null;var t=a.getValue(this);e.value=null!=t?t:this.state.initialValue;var n=a.getChecked(this);return e.checked=null!=n?n:this.state.initialChecked,e.onChange=this._handleChange,h(e,this.props.children)},componentDidMount:function(){var e=c.getID(this.getDOMNode());v[e]=this},componentWillUnmount:function(){var e=this.getDOMNode(),t=c.getID(e);delete v[t]},componentDidUpdate:function(e,t,n){var r=this.getDOMNode();null!=this.props.checked&&i.setValueForProperty(r,\"checked\",this.props.checked||!1);var o=a.getValue(this);null!=o&&i.setValueForProperty(r,\"value\",\"\"+o)},_handleChange:function(e){var n,o=a.getOnChange(this);o&&(n=o.call(this,e)),p.asap(r,this);var i=this.props.name;if(\"radio\"===this.props.type&&null!=i){for(var s=this.getDOMNode(),u=s;u.parentNode;)u=u.parentNode;for(var l=u.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+i)+'][type=\"radio\"]'),f=0,h=l.length;f<h;f++){var m=l[f];if(m!==s&&m.form===s.form){var y=c.getID(m);\"production\"!==t.env.NODE_ENV?d(y,\"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\"):d(y);var g=v[y];\"production\"!==t.env.NODE_ENV?d(g,\"ReactDOMInput: Unknown radio button ID %s.\",y):d(g),p.asap(r,g)}}}return n}});e.exports=m}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){\"production\"!==t.env.NODE_ENV?l(null==e.props.checkedLink||null==e.props.valueLink,\"Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa.\"):l(null==e.props.checkedLink||null==e.props.valueLink)}function o(e){r(e),\"production\"!==t.env.NODE_ENV?l(null==e.props.value&&null==e.props.onChange,\"Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink.\"):l(null==e.props.value&&null==e.props.onChange)}function i(e){r(e),\"production\"!==t.env.NODE_ENV?l(null==e.props.checked&&null==e.props.onChange,\"Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink\"):l(null==e.props.checked&&null==e.props.onChange)}function a(e){this.props.valueLink.requestChange(e.target.value)}function s(e){this.props.checkedLink.requestChange(e.target.checked)}var u=n(125),l=n(10),c={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},p={Mixin:{propTypes:{value:function(e,t,n){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.\")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.\")},onChange:u.func}},getValue:function(e){return e.props.valueLink?(o(e),e.props.valueLink.value):e.props.value},getChecked:function(e){return e.props.checkedLink?(i(e),e.props.checkedLink.value):e.props.checked},getOnChange:function(e){return e.props.valueLink?(o(e),a):e.props.checkedLink?(i(e),s):e.props.onChange}};e.exports=p}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){function t(t,n,r,o,i){if(o=o||_,null==n[r]){var a=b[i];return t?new Error(\"Required \"+a+\" `\"+r+\"` was not specified in \"+(\"`\"+o+\"`.\")):null}return e(n,r,o,i)}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function o(e){function t(t,n,r,o){var i=t[n],a=v(i);if(a!==e){var s=b[o],u=m(i);return new Error(\"Invalid \"+s+\" `\"+n+\"` of type `\"+u+\"` \"+(\"supplied to `\"+r+\"`, expected `\"+e+\"`.\"))}return null}return r(t)}function i(){return r(E.thatReturns(null))}function a(e){function t(t,n,r,o){var i=t[n];if(!Array.isArray(i)){var a=b[o],s=v(i);return new Error(\"Invalid \"+a+\" `\"+n+\"` of type \"+(\"`\"+s+\"` supplied to `\"+r+\"`, expected an array.\"))}for(var u=0;u<i.length;u++){var l=e(i,u,r,o);if(l instanceof Error)return l}return null}return r(t)}function s(){function e(e,t,n,r){if(!y.isValidElement(e[t])){var o=b[r];return new Error(\"Invalid \"+o+\" `\"+t+\"` supplied to \"+(\"`\"+n+\"`, expected a ReactElement.\"))}return null}return r(e)}function u(e){function t(t,n,r,o){if(!(t[n]instanceof e)){var i=b[o],a=e.name||_;return new Error(\"Invalid \"+i+\" `\"+n+\"` supplied to \"+(\"`\"+r+\"`, expected instance of `\"+a+\"`.\"))}return null}return r(t)}function l(e){function t(t,n,r,o){for(var i=t[n],a=0;a<e.length;a++)if(i===e[a])return null;var s=b[o],u=JSON.stringify(e);return new Error(\"Invalid \"+s+\" `\"+n+\"` of value `\"+i+\"` \"+(\"supplied to `\"+r+\"`, expected one of \"+u+\".\"))}return r(t)}function c(e){function t(t,n,r,o){var i=t[n],a=v(i);if(\"object\"!==a){var s=b[o];return new Error(\"Invalid \"+s+\" `\"+n+\"` of type \"+(\"`\"+a+\"` supplied to `\"+r+\"`, expected an object.\"))}for(var u in i)if(i.hasOwnProperty(u)){var l=e(i,u,r,o);if(l instanceof Error)return l}return null}return r(t)}function p(e){function t(t,n,r,o){for(var i=0;i<e.length;i++){var a=e[i];if(null==a(t,n,r,o))return null}var s=b[o];return new Error(\"Invalid \"+s+\" `\"+n+\"` supplied to \"+(\"`\"+r+\"`.\"))}return r(t)}function f(){function e(e,t,n,r){if(!h(e[t])){var o=b[r];return new Error(\"Invalid \"+o+\" `\"+t+\"` supplied to \"+(\"`\"+n+\"`, expected a ReactNode.\"))}return null}return r(e)}function d(e){function t(t,n,r,o){var i=t[n],a=v(i);if(\"object\"!==a){var s=b[o];return new Error(\"Invalid \"+s+\" `\"+n+\"` of type `\"+a+\"` \"+(\"supplied to `\"+r+\"`, expected `object`.\"))}for(var u in e){var l=e[u];if(l){var c=l(i,u,r,o);if(c)return c}}return null}return r(t)}function h(e){switch(typeof e){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!e;case\"object\":if(Array.isArray(e))return e.every(h);if(null===e||y.isValidElement(e))return!0;e=g.extractIfFragment(e);for(var t in e)if(!h(e[t]))return!1;return!0;default:return!1}}function v(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":t}function m(e){var t=v(e);if(\"object\"===t){if(e instanceof Date)return\"date\";if(e instanceof RegExp)return\"regexp\"}return t}var y=n(14),g=n(13),b=n(37),E=n(19),_=\"<<anonymous>>\",O=s(),N=f(),w={array:o(\"array\"),bool:o(\"boolean\"),func:o(\"function\"),number:o(\"number\"),object:o(\"object\"),string:o(\"string\"),any:i(),arrayOf:a,element:O,instanceOf:u,node:N,objectOf:c,oneOf:l,oneOfType:p,shape:d};e.exports=w},function(e,t,n){(function(t){\"use strict\";var r=n(113),o=n(40),i=n(14),a=n(18),s=i.createFactory(\"option\"),u=o.createClass({displayName:\"ReactDOMOption\",tagName:\"OPTION\",mixins:[r],componentWillMount:function(){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?a(null==this.props.selected,\"Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>.\"):null)},render:function(){return s(this.props,this.props.children)}});e.exports=u}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){if(this._pendingUpdate){this._pendingUpdate=!1;var e=s.getValue(this);null!=e&&this.isMounted()&&i(this,e)}}function o(e,t,n){if(null==e[t])return null;if(e.multiple){if(!Array.isArray(e[t]))return new Error(\"The `\"+t+\"` prop supplied to <select> must be an array if `multiple` is true.\")}else if(Array.isArray(e[t]))return new Error(\"The `\"+t+\"` prop supplied to <select> must be a scalar value if `multiple` is false.\")}function i(e,t){var n,r,o,i=e.getDOMNode().options;if(e.props.multiple){for(n={},r=0,o=t.length;r<o;r++)n[\"\"+t[r]]=!0;for(r=0,o=i.length;r<o;r++){var a=n.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(n=\"\"+t,r=0,o=i.length;r<o;r++)if(i[r].value===n)return void(i[r].selected=!0);i.length&&(i[0].selected=!0)}}var a=n(117),s=n(124),u=n(113),l=n(40),c=n(14),p=n(29),f=n(16),d=c.createFactory(\"select\"),h=l.createClass({displayName:\"ReactDOMSelect\",tagName:\"SELECT\",mixins:[a,s.Mixin,u],propTypes:{defaultValue:o,value:o},render:function(){var e=f({},this.props);return e.onChange=this._handleChange,e.value=null,d(e,this.props.children)},componentWillMount:function(){this._pendingUpdate=!1},componentDidMount:function(){var e=s.getValue(this);null!=e?i(this,e):null!=this.props.defaultValue&&i(this,this.props.defaultValue)},componentDidUpdate:function(e){var t=s.getValue(this);null!=t?(this._pendingUpdate=!1,i(this,t)):!e.multiple!=!this.props.multiple&&(null!=this.props.defaultValue?i(this,this.props.defaultValue):i(this,this.props.multiple?[]:\"\"))},_handleChange:function(e){var t,n=s.getOnChange(this);return n&&(t=n.call(this,e)),this._pendingUpdate=!0,p.asap(r,this),t}});e.exports=h},function(e,t,n){(function(t){\"use strict\";function r(){this.isMounted()&&this.forceUpdate()}var o=n(117),i=n(46),a=n(124),s=n(113),u=n(40),l=n(14),c=n(29),p=n(16),f=n(10),d=n(18),h=l.createFactory(\"textarea\"),v=u.createClass({displayName:\"ReactDOMTextarea\",tagName:\"TEXTAREA\",mixins:[o,a.Mixin,s],getInitialState:function(){var e=this.props.defaultValue,n=this.props.children;null!=n&&(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?d(!1,\"Use the `defaultValue` or `value` props instead of setting children on <textarea>.\"):null),\"production\"!==t.env.NODE_ENV?f(null==e,\"If you supply `defaultValue` on a <textarea>, do not pass children.\"):f(null==e),Array.isArray(n)&&(\"production\"!==t.env.NODE_ENV?f(n.length<=1,\"<textarea> can only have at most one child.\"):f(n.length<=1),n=n[0]),e=\"\"+n),null==e&&(e=\"\");var r=a.getValue(this);return{initialValue:\"\"+(null!=r?r:e)}},render:function(){var e=p({},this.props);return\"production\"!==t.env.NODE_ENV?f(null==e.dangerouslySetInnerHTML,\"`dangerouslySetInnerHTML` does not make sense on <textarea>.\"):f(null==e.dangerouslySetInnerHTML),e.defaultValue=null,e.value=null,e.onChange=this._handleChange,h(e,this.state.initialValue)},componentDidUpdate:function(e,t,n){var r=a.getValue(this);if(null!=r){var o=this.getDOMNode();i.setValueForProperty(o,\"value\",\"\"+r)}},_handleChange:function(e){var t,n=a.getOnChange(this);return n&&(t=n.call(this,e)),c.asap(r,this),t}});e.exports=v}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){var t=p.getID(e),n=c.getReactRootIDFromNodeID(t),r=p.findReactContainerForID(n),o=p.getFirstReactDOM(r);return o}function o(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function i(e){for(var t=p.getFirstReactDOM(h(e.nativeEvent))||window,n=t;n;)e.ancestors.push(n),n=r(n);for(var o=0,i=e.ancestors.length;o<i;o++){t=e.ancestors[o];var a=p.getID(t)||\"\";m._handleTopLevel(e.topLevelType,t,a,e.nativeEvent)}}function a(e){var t=v(window);e(t)}var s=n(130),u=n(54),l=n(12),c=n(22),p=n(70),f=n(29),d=n(16),h=n(101),v=n(131);d(o.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(o,l.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:u.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?s.listen(r,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){var r=n;return r?s.capture(r,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);s.listen(window,\"scroll\",t)},dispatchEvent:function(e,t){if(m._enabled){var n=o.getPooled(e,t);try{f.batchedUpdates(i,n)}finally{o.release(n)}}}};e.exports=m},function(e,t,n){(function(t){var r=n(19),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0},capture:function(e,n,o){return e.addEventListener?(e.addEventListener(n,o,!0),{remove:function(){e.removeEventListener(n,o,!0)}}):(\"production\"!==t.env.NODE_ENV&&console.error(\"Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events.\"),{remove:r})},registerDefault:function(){}};e.exports=o}).call(t,n(6))},function(e,t){\"use strict\";function n(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}e.exports=n},function(e,t,n){\"use strict\";var r=n(47),o=n(72),i=n(88),a=n(40),s=n(79),u=n(71),l=n(38),c=n(90),p=n(31),f=n(23),d=n(29),h={Component:i.injection,Class:a.injection,DOMComponent:c.injection,DOMProperty:r.injection,EmptyComponent:s.injection,EventPluginHub:o.injection,EventEmitter:u.injection,NativeComponent:l.injection,Perf:p.injection,RootIndex:f.injection,Updates:d.injection};e.exports=h},function(e,t,n){\"use strict\";function r(){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.putListenerQueue=u.getPooled()}var o=n(30),i=n(12),a=n(71),s=n(134),u=n(138),l=n(39),c=n(16),p={initialize:s.getSelectionInformation,close:s.restoreSelection},f={initialize:function(){var e=a.isEnabled();return a.setEnabled(!1),e},close:function(e){a.setEnabled(e)}},d={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},h={initialize:function(){this.putListenerQueue.reset()},close:function(){this.putListenerQueue.putListeners()}},v=[h,p,f,d],m={getTransactionWrappers:function(){return v},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null,u.release(this.putListenerQueue),this.putListenerQueue=null}};c(r.prototype,l.Mixin,m),i.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(e){return i(document.documentElement,e)}var o=n(135),i=n(82),a=n(118),s=n(137),u={hasSelectionCapabilities:function(e){return e&&(\"INPUT\"===e.nodeName&&\"text\"===e.type||\"TEXTAREA\"===e.nodeName||\"true\"===e.contentEditable)},getSelectionInformation:function(){var e=s();return{focusedElem:e,selectionRange:u.hasSelectionCapabilities(e)?u.getSelection(e):null}},restoreSelection:function(e){var t=s(),n=e.focusedElem,o=e.selectionRange;t!==n&&r(n)&&(u.hasSelectionCapabilities(n)&&u.setSelection(n,o),a(n))},getSelection:function(e){var t;if(\"selectionStart\"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&\"INPUT\"===e.nodeName){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart(\"character\",-e.value.length),end:-n.moveEnd(\"character\",-e.value.length)})}else t=o.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if(\"undefined\"==typeof r&&(r=n),\"selectionStart\"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length);else if(document.selection&&\"INPUT\"===e.nodeName){var i=e.createTextRange();i.collapse(!0),i.moveStart(\"character\",n),i.moveEnd(\"character\",r-n),i.select()}else o.setOffsets(e,t)}};e.exports=u},function(e,t,n){\"use strict\";function r(e,t,n,r){return e===n&&t===r}function o(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint(\"EndToStart\",n);var i=o.text.length,a=i+r;return{start:i,end:a}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,i=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0),u=r(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),l=u?0:s.toString().length,c=s.cloneRange();c.selectNodeContents(e),c.setEnd(s.startContainer,s.startOffset);var p=r(c.startContainer,c.startOffset,c.endContainer,c.endOffset),f=p?0:c.toString().length,d=f+l,h=document.createRange();h.setStart(n,o),h.setEnd(i,a);var v=h.collapsed;return{start:v?d:f,end:v?f:d}}function a(e,t){var n,r,o=document.selection.createRange().duplicate();\"undefined\"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart(\"character\",n),o.setEndPoint(\"EndToStart\",o),o.moveEnd(\"character\",r-n),o.select()}function s(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),i=\"undefined\"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>i){var a=i;i=o,o=a}var s=l(e,o),u=l(e,i);if(s&&u){var p=document.createRange();p.setStart(s.node,s.offset),n.removeAllRanges(),o>i?(n.addRange(p),n.extend(u.node,u.offset)):(p.setEnd(u.node,u.offset),n.addRange(p))}}}var u=n(54),l=n(136),c=n(98),p=u.canUseDOM&&\"selection\"in document&&!(\"getSelection\"in window),f={getOffsets:p?o:i,setOffsets:p?a:s};e.exports=f},function(e,t){\"use strict\";function n(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function o(e,t){for(var o=n(e),i=0,a=0;o;){if(3===o.nodeType){if(a=i+o.textContent.length,i<=t&&a>=t)return{node:o,offset:t-i};i=a}o=n(r(o))}}e.exports=o},function(e,t){function n(){try{return document.activeElement||document.body}catch(e){return document.body}}e.exports=n},function(e,t,n){\"use strict\";function r(){this.listenersToPut=[]}var o=n(12),i=n(71),a=n(16);a(r.prototype,{enqueuePutListener:function(e,t,n){this.listenersToPut.push({rootNodeID:e,propKey:t,propValue:n})},putListeners:function(){for(var e=0;e<this.listenersToPut.length;e++){var t=this.listenersToPut[e];i.putListener(t.rootNodeID,t.propKey,t.propValue)}},reset:function(){this.listenersToPut.length=0},destructor:function(){this.reset()}}),o.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(e){if(\"selectionStart\"in e&&s.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function o(e){if(g||null==v||v!==l())return null;var t=r(v);if(!y||!f(y,t)){y=t;var n=u.getPooled(h.select,m,e);return n.type=\"select\",n.target=v,a.accumulateTwoPhaseDispatches(n),n}}var i=n(8),a=n(96),s=n(134),u=n(100),l=n(137),c=n(104),p=n(42),f=n(140),d=i.topLevelTypes,h={select:{phasedRegistrationNames:{bubbled:p({onSelect:null}),captured:p({onSelectCapture:null})},dependencies:[d.topBlur,d.topContextMenu,d.topFocus,d.topKeyDown,d.topMouseDown,d.topMouseUp,d.topSelectionChange]}},v=null,m=null,y=null,g=!1,b={eventTypes:h,extractEvents:function(e,t,n,r){switch(e){\ncase d.topFocus:(c(t)||\"true\"===t.contentEditable)&&(v=t,m=n,y=null);break;case d.topBlur:v=null,m=null,y=null;break;case d.topMouseDown:g=!0;break;case d.topContextMenu:case d.topMouseUp:return g=!1,o(r);case d.topSelectionChange:case d.topKeyDown:case d.topKeyUp:return o(r)}}};e.exports=b},function(e,t){\"use strict\";function n(e,t){if(e===t)return!0;var n;for(n in e)if(e.hasOwnProperty(n)&&(!t.hasOwnProperty(n)||e[n]!==t[n]))return!1;for(n in t)if(t.hasOwnProperty(n)&&!e.hasOwnProperty(n))return!1;return!0}e.exports=n},function(e,t){\"use strict\";var n=Math.pow(2,53),r={createReactRootIndex:function(){return Math.ceil(Math.random()*n)}};e.exports=r},function(e,t,n){(function(t){\"use strict\";var r=n(8),o=n(7),i=n(96),a=n(143),s=n(100),u=n(144),l=n(145),c=n(108),p=n(148),f=n(149),d=n(109),h=n(150),v=n(146),m=n(10),y=n(42),g=n(18),b=r.topLevelTypes,E={blur:{phasedRegistrationNames:{bubbled:y({onBlur:!0}),captured:y({onBlurCapture:!0})}},click:{phasedRegistrationNames:{bubbled:y({onClick:!0}),captured:y({onClickCapture:!0})}},contextMenu:{phasedRegistrationNames:{bubbled:y({onContextMenu:!0}),captured:y({onContextMenuCapture:!0})}},copy:{phasedRegistrationNames:{bubbled:y({onCopy:!0}),captured:y({onCopyCapture:!0})}},cut:{phasedRegistrationNames:{bubbled:y({onCut:!0}),captured:y({onCutCapture:!0})}},doubleClick:{phasedRegistrationNames:{bubbled:y({onDoubleClick:!0}),captured:y({onDoubleClickCapture:!0})}},drag:{phasedRegistrationNames:{bubbled:y({onDrag:!0}),captured:y({onDragCapture:!0})}},dragEnd:{phasedRegistrationNames:{bubbled:y({onDragEnd:!0}),captured:y({onDragEndCapture:!0})}},dragEnter:{phasedRegistrationNames:{bubbled:y({onDragEnter:!0}),captured:y({onDragEnterCapture:!0})}},dragExit:{phasedRegistrationNames:{bubbled:y({onDragExit:!0}),captured:y({onDragExitCapture:!0})}},dragLeave:{phasedRegistrationNames:{bubbled:y({onDragLeave:!0}),captured:y({onDragLeaveCapture:!0})}},dragOver:{phasedRegistrationNames:{bubbled:y({onDragOver:!0}),captured:y({onDragOverCapture:!0})}},dragStart:{phasedRegistrationNames:{bubbled:y({onDragStart:!0}),captured:y({onDragStartCapture:!0})}},drop:{phasedRegistrationNames:{bubbled:y({onDrop:!0}),captured:y({onDropCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:y({onFocus:!0}),captured:y({onFocusCapture:!0})}},input:{phasedRegistrationNames:{bubbled:y({onInput:!0}),captured:y({onInputCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:y({onKeyDown:!0}),captured:y({onKeyDownCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:y({onKeyPress:!0}),captured:y({onKeyPressCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:y({onKeyUp:!0}),captured:y({onKeyUpCapture:!0})}},load:{phasedRegistrationNames:{bubbled:y({onLoad:!0}),captured:y({onLoadCapture:!0})}},error:{phasedRegistrationNames:{bubbled:y({onError:!0}),captured:y({onErrorCapture:!0})}},mouseDown:{phasedRegistrationNames:{bubbled:y({onMouseDown:!0}),captured:y({onMouseDownCapture:!0})}},mouseMove:{phasedRegistrationNames:{bubbled:y({onMouseMove:!0}),captured:y({onMouseMoveCapture:!0})}},mouseOut:{phasedRegistrationNames:{bubbled:y({onMouseOut:!0}),captured:y({onMouseOutCapture:!0})}},mouseOver:{phasedRegistrationNames:{bubbled:y({onMouseOver:!0}),captured:y({onMouseOverCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:y({onMouseUp:!0}),captured:y({onMouseUpCapture:!0})}},paste:{phasedRegistrationNames:{bubbled:y({onPaste:!0}),captured:y({onPasteCapture:!0})}},reset:{phasedRegistrationNames:{bubbled:y({onReset:!0}),captured:y({onResetCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:y({onScroll:!0}),captured:y({onScrollCapture:!0})}},submit:{phasedRegistrationNames:{bubbled:y({onSubmit:!0}),captured:y({onSubmitCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:y({onTouchCancel:!0}),captured:y({onTouchCancelCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:y({onTouchEnd:!0}),captured:y({onTouchEndCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:y({onTouchMove:!0}),captured:y({onTouchMoveCapture:!0})}},touchStart:{phasedRegistrationNames:{bubbled:y({onTouchStart:!0}),captured:y({onTouchStartCapture:!0})}},wheel:{phasedRegistrationNames:{bubbled:y({onWheel:!0}),captured:y({onWheelCapture:!0})}}},_={topBlur:E.blur,topClick:E.click,topContextMenu:E.contextMenu,topCopy:E.copy,topCut:E.cut,topDoubleClick:E.doubleClick,topDrag:E.drag,topDragEnd:E.dragEnd,topDragEnter:E.dragEnter,topDragExit:E.dragExit,topDragLeave:E.dragLeave,topDragOver:E.dragOver,topDragStart:E.dragStart,topDrop:E.drop,topError:E.error,topFocus:E.focus,topInput:E.input,topKeyDown:E.keyDown,topKeyPress:E.keyPress,topKeyUp:E.keyUp,topLoad:E.load,topMouseDown:E.mouseDown,topMouseMove:E.mouseMove,topMouseOut:E.mouseOut,topMouseOver:E.mouseOver,topMouseUp:E.mouseUp,topPaste:E.paste,topReset:E.reset,topScroll:E.scroll,topSubmit:E.submit,topTouchCancel:E.touchCancel,topTouchEnd:E.touchEnd,topTouchMove:E.touchMove,topTouchStart:E.touchStart,topWheel:E.wheel};for(var O in _)_[O].dependencies=[O];var N={eventTypes:E,executeDispatch:function(e,n,r){var i=o.executeDispatch(e,n,r);\"production\"!==t.env.NODE_ENV?g(\"boolean\"!=typeof i,\"Returning `false` from an event handler is deprecated and will be ignored in a future release. Instead, manually call e.stopPropagation() or e.preventDefault(), as appropriate.\"):null,i===!1&&(e.stopPropagation(),e.preventDefault())},extractEvents:function(e,n,r,o){var y=_[e];if(!y)return null;var g;switch(e){case b.topInput:case b.topLoad:case b.topError:case b.topReset:case b.topSubmit:g=s;break;case b.topKeyPress:if(0===v(o))return null;case b.topKeyDown:case b.topKeyUp:g=l;break;case b.topBlur:case b.topFocus:g=u;break;case b.topClick:if(2===o.button)return null;case b.topContextMenu:case b.topDoubleClick:case b.topMouseDown:case b.topMouseMove:case b.topMouseOut:case b.topMouseOver:case b.topMouseUp:g=c;break;case b.topDrag:case b.topDragEnd:case b.topDragEnter:case b.topDragExit:case b.topDragLeave:case b.topDragOver:case b.topDragStart:case b.topDrop:g=p;break;case b.topTouchCancel:case b.topTouchEnd:case b.topTouchMove:case b.topTouchStart:g=f;break;case b.topScroll:g=d;break;case b.topWheel:g=h;break;case b.topCopy:case b.topCut:case b.topPaste:g=a}\"production\"!==t.env.NODE_ENV?m(g,\"SimpleEventPlugin: Unhandled event type, `%s`.\",e):m(g);var E=g.getPooled(y,r,o);return i.accumulateTwoPhaseDispatches(E),E}};e.exports=N}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i={clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i={relatedTarget:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i=n(146),a=n(147),s=n(110),u={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:s,charCode:function(e){return\"keypress\"===e.type?i(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?i(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}};o.augmentClass(r,u),e.exports=r},function(e,t){\"use strict\";function n(e){var t,n=e.keyCode;return\"charCode\"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}e.exports=n},function(e,t,n){\"use strict\";function r(e){if(e.key){var t=i[e.key]||e.key;if(\"Unidentified\"!==t)return t}if(\"keypress\"===e.type){var n=o(e);return 13===n?\"Enter\":String.fromCharCode(n)}return\"keydown\"===e.type||\"keyup\"===e.type?a[e.keyCode]||\"Unidentified\":\"\"}var o=n(146),i={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},a={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"};e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(108),i={dataTransfer:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i=n(110),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:i};o.augmentClass(r,a),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(108),i={deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";var r=n(47),o=r.injection.MUST_USE_ATTRIBUTE,i={Properties:{clipPath:o,cx:o,cy:o,d:o,dx:o,dy:o,fill:o,fillOpacity:o,fontFamily:o,fontSize:o,fx:o,fy:o,gradientTransform:o,gradientUnits:o,markerEnd:o,markerMid:o,markerStart:o,offset:o,opacity:o,patternContentUnits:o,patternUnits:o,points:o,preserveAspectRatio:o,r:o,rx:o,ry:o,spreadMethod:o,stopColor:o,stopOpacity:o,stroke:o,strokeDasharray:o,strokeLinecap:o,strokeOpacity:o,strokeWidth:o,textAnchor:o,transform:o,version:o,viewBox:o,x1:o,x2:o,x:o,y1:o,y2:o,y:o},DOMAttributeNames:{clipPath:\"clip-path\",fillOpacity:\"fill-opacity\",fontFamily:\"font-family\",fontSize:\"font-size\",gradientTransform:\"gradientTransform\",gradientUnits:\"gradientUnits\",markerEnd:\"marker-end\",markerMid:\"marker-mid\",markerStart:\"marker-start\",patternContentUnits:\"patternContentUnits\",patternUnits:\"patternUnits\",preserveAspectRatio:\"preserveAspectRatio\",spreadMethod:\"spreadMethod\",stopColor:\"stop-color\",stopOpacity:\"stop-opacity\",strokeDasharray:\"stroke-dasharray\",strokeLinecap:\"stroke-linecap\",strokeOpacity:\"stroke-opacity\",strokeWidth:\"stroke-width\",textAnchor:\"text-anchor\",viewBox:\"viewBox\"}};e.exports=i},function(e,t,n){(function(t){\"use strict\";function r(e){var n=i.createFactory(e),r=o.createClass({tagName:e.toUpperCase(),displayName:\"ReactFullPageComponent\"+e,componentWillUnmount:function(){\"production\"!==t.env.NODE_ENV?a(!1,\"%s tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg <html>, <head>, and <body>) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.\",this.constructor.displayName):a(!1)},render:function(){return n(this.props)}});return r}var o=n(40),i=n(14),a=n(10);e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return Math.floor(100*e)/100}function o(e,t,n){e[t]=(e[t]||0)+n}var i=n(47),a=n(154),s=n(70),u=n(31),l=n(155),c={_allMeasurements:[],_mountStack:[0],_injected:!1,start:function(){c._injected||u.injection.injectMeasure(c.measure),c._allMeasurements.length=0,u.enableMeasure=!0},stop:function(){u.enableMeasure=!1},getLastMeasurements:function(){return c._allMeasurements},printExclusive:function(e){e=e||c._allMeasurements;var t=a.getExclusiveSummary(e);console.table(t.map(function(e){return{\"Component class name\":e.componentName,\"Total inclusive time (ms)\":r(e.inclusive),\"Exclusive mount time (ms)\":r(e.exclusive),\"Exclusive render time (ms)\":r(e.render),\"Mount time per instance (ms)\":r(e.exclusive/e.count),\"Render time per instance (ms)\":r(e.render/e.count),Instances:e.count}}))},printInclusive:function(e){e=e||c._allMeasurements;var t=a.getInclusiveSummary(e);console.table(t.map(function(e){return{\"Owner > component\":e.componentName,\"Inclusive time (ms)\":r(e.time),Instances:e.count}})),console.log(\"Total time:\",a.getTotalTime(e).toFixed(2)+\" ms\")},getMeasurementsSummaryMap:function(e){var t=a.getInclusiveSummary(e,!0);return t.map(function(e){return{\"Owner > component\":e.componentName,\"Wasted time (ms)\":e.time,Instances:e.count}})},printWasted:function(e){e=e||c._allMeasurements,console.table(c.getMeasurementsSummaryMap(e)),console.log(\"Total time:\",a.getTotalTime(e).toFixed(2)+\" ms\")},printDOM:function(e){e=e||c._allMeasurements;var t=a.getDOMSummary(e);console.table(t.map(function(e){var t={};return t[i.ID_ATTRIBUTE_NAME]=e.id,t.type=e.type,t.args=JSON.stringify(e.args),t})),console.log(\"Total time:\",a.getTotalTime(e).toFixed(2)+\" ms\")},_recordWrite:function(e,t,n,r){var o=c._allMeasurements[c._allMeasurements.length-1].writes;o[e]=o[e]||[],o[e].push({type:t,time:n,args:r})},measure:function(e,t,n){return function(){for(var r=[],i=0,a=arguments.length;i<a;i++)r.push(arguments[i]);var u,p,f;if(\"_renderNewRootComponent\"===t||\"flushBatchedUpdates\"===t)return c._allMeasurements.push({exclusive:{},inclusive:{},render:{},counts:{},writes:{},displayNames:{},totalTime:0}),f=l(),p=n.apply(this,r),c._allMeasurements[c._allMeasurements.length-1].totalTime=l()-f,p;if(\"_mountImageIntoNode\"===t||\"ReactDOMIDOperations\"===e){if(f=l(),p=n.apply(this,r),u=l()-f,\"_mountImageIntoNode\"===t){var d=s.getID(r[1]);c._recordWrite(d,t,u,r[0])}else\"dangerouslyProcessChildrenUpdates\"===t?r[0].forEach(function(e){var t={};null!==e.fromIndex&&(t.fromIndex=e.fromIndex),null!==e.toIndex&&(t.toIndex=e.toIndex),null!==e.textContent&&(t.textContent=e.textContent),null!==e.markupIndex&&(t.markup=r[1][e.markupIndex]),c._recordWrite(e.parentID,e.type,u,t)}):c._recordWrite(r[0],t,u,Array.prototype.slice.call(r,1));return p}if(\"ReactCompositeComponent\"!==e||\"mountComponent\"!==t&&\"updateComponent\"!==t&&\"_renderValidatedComponent\"!==t)return n.apply(this,r);if(\"string\"==typeof this._currentElement.type)return n.apply(this,r);var h=\"mountComponent\"===t?r[0]:this._rootNodeID,v=\"_renderValidatedComponent\"===t,m=\"mountComponent\"===t,y=c._mountStack,g=c._allMeasurements[c._allMeasurements.length-1];if(v?o(g.counts,h,1):m&&y.push(0),f=l(),p=n.apply(this,r),u=l()-f,v)o(g.render,h,u);else if(m){var b=y.pop();y[y.length-1]+=u,o(g.exclusive,h,u-b),o(g.inclusive,h,u)}else o(g.inclusive,h,u);return g.displayNames[h]={current:this.getName(),owner:this._currentElement._owner?this._currentElement._owner.getName():\"<root>\"},p}}};e.exports=c},function(e,t,n){function r(e){for(var t=0,n=0;n<e.length;n++){var r=e[n];t+=r.totalTime}return t}function o(e){for(var t=[],n=0;n<e.length;n++){var r,o=e[n];for(r in o.writes)o.writes[r].forEach(function(e){t.push({id:r,type:c[e.type]||e.type,args:e.args})})}return t}function i(e){for(var t,n={},r=0;r<e.length;r++){var o=e[r],i=u({},o.exclusive,o.inclusive);for(var a in i)t=o.displayNames[a].current,n[t]=n[t]||{componentName:t,inclusive:0,exclusive:0,render:0,count:0},o.render[a]&&(n[t].render+=o.render[a]),o.exclusive[a]&&(n[t].exclusive+=o.exclusive[a]),o.inclusive[a]&&(n[t].inclusive+=o.inclusive[a]),o.counts[a]&&(n[t].count+=o.counts[a])}var s=[];for(t in n)n[t].exclusive>=l&&s.push(n[t]);return s.sort(function(e,t){return t.exclusive-e.exclusive}),s}function a(e,t){for(var n,r={},o=0;o<e.length;o++){var i,a=e[o],c=u({},a.exclusive,a.inclusive);t&&(i=s(a));for(var p in c)if(!t||i[p]){var f=a.displayNames[p];n=f.owner+\" > \"+f.current,r[n]=r[n]||{componentName:n,time:0,count:0},a.inclusive[p]&&(r[n].time+=a.inclusive[p]),a.counts[p]&&(r[n].count+=a.counts[p])}}var d=[];for(n in r)r[n].time>=l&&d.push(r[n]);return d.sort(function(e,t){return t.time-e.time}),d}function s(e){var t={},n=Object.keys(e.writes),r=u({},e.exclusive,e.inclusive);for(var o in r){for(var i=!1,a=0;a<n.length;a++)if(0===n[a].indexOf(o)){i=!0;break}!i&&e.counts[o]>0&&(t[o]=!0)}return t}var u=n(16),l=1.2,c={_mountImageIntoNode:\"set innerHTML\",INSERT_MARKUP:\"set innerHTML\",MOVE_EXISTING:\"move\",REMOVE_NODE:\"remove\",TEXT_CONTENT:\"set textContent\",updatePropertyByID:\"update attribute\",deletePropertyByID:\"delete attribute\",updateStylesByID:\"update styles\",updateInnerHTMLByID:\"set innerHTML\",dangerouslyReplaceNodeWithMarkupByID:\"replace\"},p={getExclusiveSummary:i,getInclusiveSummary:a,getDOMSummary:o,getTotalTime:r};e.exports=p},function(e,t,n){var r=n(156);r&&r.now||(r=Date);var o=r.now.bind(r);e.exports=o},function(e,t,n){\"use strict\";var r,o=n(54);o.canUseDOM&&(r=window.performance||window.msPerformance||window.webkitPerformance),e.exports=r||{}},function(e,t,n){(function(t){\"use strict\";function r(e){\"production\"!==t.env.NODE_ENV?p(i.isValidElement(e),\"renderToString(): You must pass a valid ReactElement.\"):p(i.isValidElement(e));var n;try{var r=a.createReactRootID();return n=u.getPooled(!1),n.perform(function(){var t=c(e,null),o=t.mountComponent(r,n,l);return s.addChecksumToMarkup(o)},null)}finally{u.release(n)}}function o(e){\"production\"!==t.env.NODE_ENV?p(i.isValidElement(e),\"renderToStaticMarkup(): You must pass a valid ReactElement.\"):p(i.isValidElement(e));var n;try{var r=a.createReactRootID();return n=u.getPooled(!0),n.perform(function(){var t=c(e,null);return t.mountComponent(r,n,l)},null)}finally{u.release(n)}}var i=n(14),a=n(22),s=n(80),u=n(158),l=n(17),c=n(86),p=n(10);e.exports={renderToString:r,renderToStaticMarkup:o}}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.reactMountReady=i.getPooled(null),this.putListenerQueue=a.getPooled()}var o=n(12),i=n(30),a=n(138),s=n(39),u=n(16),l=n(19),c={initialize:function(){this.reactMountReady.reset()},close:l},p={initialize:function(){this.putListenerQueue.reset()},close:l},f=[p,c],d={getTransactionWrappers:function(){return f},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){i.release(this.reactMountReady),this.reactMountReady=null,a.release(this.putListenerQueue),this.putListenerQueue=null}};u(r.prototype,s.Mixin,d),o.addPoolingTo(r),e.exports=r},function(e,t,n){(function(t){\"use strict\";function r(e){return\"production\"!==t.env.NODE_ENV?i(o.isValidElement(e),\"onlyChild must be passed a children with exactly one child.\"):i(o.isValidElement(e)),e}var o=n(14),i=n(10);e.exports=r}).call(t,n(6))},function(e,t,n){var r=n(161);r.connect=n(175),r.connectFilter=n(177),r.ListenerMixin=n(176),r.listenTo=n(178),r.listenToMany=n(179),e.exports=r},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r={version:{\"reflux-core\":\"0.2.1\"}};r.ActionMethods=n(162),r.ListenerMethods=n(163),r.PublisherMethods=n(173),r.StoreMethods=n(172),r.createAction=n(174),r.createStore=n(168);var o=n(167).staticJoinCreator;r.joinTrailing=r.all=o(\"last\"),r.joinLeading=o(\"first\"),r.joinStrict=o(\"strict\"),r.joinConcat=o(\"all\");var i=r.utils=n(164);r.EventEmitter=i.EventEmitter,r.Promise=i.Promise,r.createActions=function(){var e=function(e,t){Object.keys(e).forEach(function(n){var o=e[n];t[n]=r.createAction(o)})};return function(t){var n={};return t instanceof Array?t.forEach(function(t){i.isObject(t)?e(t,n):n[t]=r.createAction(t)}):e(t,n),n}}(),r.setEventEmitter=function(e){r.EventEmitter=i.EventEmitter=e},r.setPromise=function(e){r.Promise=i.Promise=e},r.setPromiseFactory=function(e){i.createPromise=e},r.nextTick=function(e){i.nextTick=e},r.use=function(e){e(r)},r.__keep=n(169),Function.prototype.bind||console.error(\"Function.prototype.bind not available. ES5 shim required. https://github.com/spoike/refluxjs#es5\"),t.default=r,e.exports=t.default},function(e,t){\"use strict\";e.exports={}},function(e,t,n){\"use strict\";var r=n(164),o=n(167).instanceJoinCreator,i=function(e){for(var t,n=0,r={};n<(e.children||[]).length;++n)t=e.children[n],e[t]&&(r[t]=e[t]);return r},a=function e(t){var n={};for(var o in t){var a=t[o],s=i(a),u=e(s);n[o]=a;for(var l in u){var c=u[l];n[o+r.capitalize(l)]=c}}return n};e.exports={hasListener:function(e){for(var t,n,r,o=0;o<(this.subscriptions||[]).length;++o)for(r=[].concat(this.subscriptions[o].listenable),t=0;t<r.length;t++)if(n=r[t],n===e||n.hasListener&&n.hasListener(e))return!0;return!1},listenToMany:function(e){var t=a(e);for(var n in t){var o=r.callbackName(n),i=this[o]?o:this[n]?n:void 0;i&&this.listenTo(t[n],i,this[o+\"Default\"]||this[i+\"Default\"]||i)}},validateListening:function(e){return e===this?\"Listener is not able to listen to itself\":r.isFunction(e.listen)?e.hasListener&&e.hasListener(this)?\"Listener cannot listen to this listenable because of circular loop\":void 0:e+\" is missing a listen method\"},listenTo:function(e,t,n){var o,i,a,s=this.subscriptions=this.subscriptions||[];return r.throwIf(this.validateListening(e)),this.fetchInitialState(e,n),o=e.listen(this[t]||t,this),i=function(){var e=s.indexOf(a);r.throwIf(e===-1,\"Tried to remove listen already gone from subscriptions list!\"),s.splice(e,1),o()},a={stop:i,listenable:e},s.push(a),a},stopListeningTo:function(e){for(var t,n=0,o=this.subscriptions||[];n<o.length;n++)if(t=o[n],t.listenable===e)return t.stop(),r.throwIf(o.indexOf(t)!==-1,\"Failed to remove listen from subscriptions list!\"),!0;return!1},stopListeningToAll:function(){for(var e,t=this.subscriptions||[];e=t.length;)t[0].stop(),r.throwIf(t.length!==e-1,\"Failed to remove listen from subscriptions list!\")},fetchInitialState:function(e,t){t=t&&this[t]||t;var n=this;if(r.isFunction(t)&&r.isFunction(e.getInitialState)){var o=e.getInitialState();o&&r.isFunction(o.then)?o.then(function(){t.apply(n,arguments)}):t.call(this,o)}},joinTrailing:o(\"last\"),joinLeading:o(\"first\"),joinConcat:o(\"all\"),joinStrict:o(\"strict\")}},function(module,exports,__webpack_require__){(function(setImmediate){\"use strict\";function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function callbackName(e,t){return t=t||\"on\",t+exports.capitalize(e)}function checkEnv(target){var flag=void 0;try{eval(target)&&(flag=!0)}catch(e){flag=!1}environment[callbackName(target,\"has\")]=flag}function isObject(e){var t=typeof e;return\"function\"===t||\"object\"===t&&!!e}function extend(e){if(!isObject(e))return e;for(var t,n,r=1,o=arguments.length;r<o;r++){t=arguments[r];for(n in t)if(Object.getOwnPropertyDescriptor&&Object.defineProperty){var i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i)}else e[n]=t[n]}return e}function isFunction(e){return\"function\"==typeof e}function object(e,t){for(var n={},r=0;r<e.length;r++)n[e[r]]=t[r];return n}function isArguments(e){return\"object\"==typeof e&&\"callee\"in e&&\"number\"==typeof e.length}function throwIf(e,t){if(e)throw Error(t||e)}Object.defineProperty(exports,\"__esModule\",{value:!0}),exports.capitalize=capitalize,exports.callbackName=callbackName,exports.isObject=isObject,exports.extend=extend,exports.isFunction=isFunction,exports.object=object,exports.isArguments=isArguments,exports.throwIf=throwIf;var environment={};exports.environment=environment,checkEnv(\"setImmediate\"),checkEnv(\"Promise\"),exports.EventEmitter=__webpack_require__(2),environment.hasSetImmediate?exports.nextTick=function(e){setImmediate(e)}:exports.nextTick=function(e){setTimeout(e,0)},environment.hasPromise?(exports.Promise=Promise,exports.createPromise=function(e){return new exports.Promise(e)}):(exports.Promise=null,exports.createPromise=function(){})}).call(exports,__webpack_require__(165).setImmediate)},function(e,t,n){function r(e,t){this._id=e,this._clearFn=t}var o=Function.prototype.apply;t.setTimeout=function(){return new r(o.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new r(o.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(166),t.setImmediate=setImmediate,t.clearImmediate=clearImmediate},function(e,t,n){(function(e,t){!function(e,n){\"use strict\";function r(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var r={callback:e,args:t};return v[h]=r,d(h),h++}function o(e){delete v[e]}function i(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}function a(e){if(m)setTimeout(a,0,e);else{var t=v[e];if(t){m=!0;try{i(t)}finally{o(e),m=!1}}}}function s(){d=function(e){t.nextTick(function(){a(e)})}}function u(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=n,t}}function l(){var t=\"setImmediate$\"+Math.random()+\"$\",n=function(n){n.source===e&&\"string\"==typeof n.data&&0===n.data.indexOf(t)&&a(+n.data.slice(t.length))};e.addEventListener?e.addEventListener(\"message\",n,!1):e.attachEvent(\"onmessage\",n),d=function(n){e.postMessage(t+n,\"*\")}}function c(){var e=new MessageChannel;e.port1.onmessage=function(e){var t=e.data;a(t)},d=function(t){e.port2.postMessage(t)}}function p(){var e=y.documentElement;d=function(t){var n=y.createElement(\"script\");n.onreadystatechange=function(){a(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}function f(){d=function(e){setTimeout(a,0,e)}}if(!e.setImmediate){var d,h=1,v={},m=!1,y=e.document,g=Object.getPrototypeOf&&Object.getPrototypeOf(e);g=g&&g.setTimeout?g:e,\"[object process]\"==={}.toString.call(e.process)?s():u()?l():e.MessageChannel?c():y&&\"onreadystatechange\"in y.createElement(\"script\")?p():f(),g.setImmediate=r,g.clearImmediate=o}}(\"undefined\"==typeof self?\"undefined\"==typeof e?this:e:self)}).call(t,function(){return this}(),n(6))},function(e,t,n){\"use strict\";function r(e,t,n){return function(){var r,o=n.subscriptions,i=o?o.indexOf(e):-1;for(u.throwIf(i===-1,\"Tried to remove join already gone from subscriptions list!\"),r=0;r<t.length;r++)t[r]();o.splice(i,1)}}function o(e){e.listenablesEmitted=new Array(e.numberOfListenables),e.args=new Array(e.numberOfListenables)}function i(e,t){return function(){var n=l.call(arguments);if(t.listenablesEmitted[e])switch(t.strategy){case\"strict\":throw new Error(\"Strict join failed because listener triggered twice.\");case\"last\":t.args[e]=n;break;case\"all\":t.args[e].push(n)}else t.listenablesEmitted[e]=!0,t.args[e]=\"all\"===t.strategy?[n]:n;a(t)}}function a(e){for(var t=0;t<e.numberOfListenables;t++)if(!e.listenablesEmitted[t])return;e.callback.apply(e.listener,e.args),o(e)}var s=n(168),u=n(164),l=Array.prototype.slice,c={strict:\"joinStrict\",first:\"joinLeading\",last:\"joinTrailing\",all:\"joinConcat\"};t.staticJoinCreator=function(e){return function(){var t=l.call(arguments);return s({init:function(){this[c[e]].apply(this,t.concat(\"triggerAsync\"))}})}},t.instanceJoinCreator=function(e){return function(){u.throwIf(arguments.length<2,\"Cannot create a join with less than 2 listenables!\");var t,n,a=l.call(arguments),s=a.pop(),c=a.length,p={numberOfListenables:c,callback:this[s]||s,listener:this,strategy:e},f=[];for(t=0;t<c;t++)u.throwIf(this.validateListening(a[t]));for(t=0;t<c;t++)f.push(a[t].listen(i(t,p),this));return o(p),n={listenable:a},n.stop=r(n,f,this),this.subscriptions=(this.subscriptions||[]).concat(n),n}}},function(e,t,n){\"use strict\";var r=n(164),o=n(169),i=n(170),a=n(171),s={preEmit:1,shouldEmit:1};e.exports=function(e){function t(){var t,n=0;if(this.subscriptions=[],this.emitter=new r.EventEmitter,this.eventLabel=\"change\",a(this,e),this.init&&r.isFunction(this.init)&&this.init(),this.listenables)for(t=[].concat(this.listenables);n<t.length;n++)this.listenToMany(t[n])}var u=n(172),l=n(173),c=n(163);e=e||{};for(var p in u)if(!s[p]&&(l[p]||c[p]))throw new Error(\"Cannot override API method \"+p+\" in Reflux.StoreMethods. Use another method name or override it on Reflux.PublisherMethods / Reflux.ListenerMethods instead.\");for(var f in e)if(!s[f]&&(l[f]||c[f]))throw new Error(\"Cannot override API method \"+f+\" in store creation. Use another method name or override it on Reflux.PublisherMethods / Reflux.ListenerMethods instead.\");e=i(e),r.extend(t.prototype,c,l,u,e);var d=new t;return o.createdStores.push(d),d}},function(e,t){\"use strict\";t.createdStores=[],t.createdActions=[],t.reset=function(){for(;t.createdStores.length;)t.createdStores.pop();for(;t.createdActions.length;)t.createdActions.pop()}},function(e,t,n){\"use strict\";var r=n(164);e.exports=function(e){var t={init:[],preEmit:[],shouldEmit:[]},n=function e(n){var o={};return n.mixins&&n.mixins.forEach(function(t){r.extend(o,e(t))}),r.extend(o,n),Object.keys(t).forEach(function(e){n.hasOwnProperty(e)&&t[e].push(n[e])}),o}(e);return t.init.length>1&&(n.init=function(){var e=arguments;t.init.forEach(function(t){t.apply(this,e)},this)}),t.preEmit.length>1&&(n.preEmit=function(){return t.preEmit.reduce(function(e,t){var n=t.apply(this,e);return void 0===n?e:[n]}.bind(this),arguments)}),t.shouldEmit.length>1&&(n.shouldEmit=function(){var e=arguments;return!t.shouldEmit.some(function(t){return!t.apply(this,e)},this)}),Object.keys(t).forEach(function(e){1===t[e].length&&(n[e]=t[e][0])}),n}},function(e,t){\"use strict\";e.exports=function(e,t){for(var n in t)if(Object.getOwnPropertyDescriptor&&Object.defineProperty){var r=Object.getOwnPropertyDescriptor(t,n);if(!r.value||\"function\"!=typeof r.value||!t.hasOwnProperty(n))continue;e[n]=t[n].bind(e)}else{var o=t[n];if(\"function\"!=typeof o||!t.hasOwnProperty(n))continue;e[n]=o.bind(e)}return e}},function(e,t){\"use strict\";e.exports={}},function(e,t,n){\"use strict\";var r=n(164);e.exports={preEmit:function(){},shouldEmit:function(){return!0},listen:function(e,t){t=t||this;var n=function(n){o||e.apply(t,n)},r=this,o=!1;return this.emitter.addListener(this.eventLabel,n),function(){o=!0,r.emitter.removeListener(r.eventLabel,n)}},promise:function(e){var t=this,n=this.children.indexOf(\"completed\")>=0&&this.children.indexOf(\"failed\")>=0;if(!n)throw new Error('Publisher must have \"completed\" and \"failed\" child publishers');e.then(function(e){return t.completed(e)},function(e){return t.failed(e)})},listenAndPromise:function(e,t){var n=this;t=t||this,this.willCallPromise=(this.willCallPromise||0)+1;var r=this.listen(function(){if(!e)throw new Error(\"Expected a function returning a promise but got \"+e);var r=arguments,o=e.apply(t,r);return n.promise.call(n,o)},t);return function(){n.willCallPromise--,r.call(n)}},trigger:function(){var e=arguments,t=this.preEmit.apply(this,e);e=void 0===t?e:r.isArguments(t)?t:[].concat(t),this.shouldEmit.apply(this,e)&&this.emitter.emit(this.eventLabel,e)},triggerAsync:function(){var e=arguments,t=this;r.nextTick(function(){t.trigger.apply(t,e)})},triggerPromise:function(){var e=this,t=arguments,n=this.children.indexOf(\"completed\")>=0&&this.children.indexOf(\"failed\")>=0,o=r.createPromise(function(o,i){if(e.willCallPromise)return void r.nextTick(function(){var n=e.promise;e.promise=function(t){return t.then(o,i),e.promise=n,e.promise.apply(e,arguments)},e.trigger.apply(e,t)});if(n)var a=e.completed.listen(function(e){a(),s(),o(e)}),s=e.failed.listen(function(e){a(),s(),i(e)});e.triggerAsync.apply(e,t),n||o()});return o}}},function(e,t,n){\"use strict\";var r=n(164),o=n(162),i=n(173),a=n(169),s={preEmit:1,shouldEmit:1},u=function e(t){t=t||{},r.isObject(t)||(t={actionName:t});for(var n in o)if(!s[n]&&i[n])throw new Error(\"Cannot override API method \"+n+\" in Reflux.ActionMethods. Use another method name or override it on Reflux.PublisherMethods instead.\");for(var u in t)if(!s[u]&&i[u])throw new Error(\"Cannot override API method \"+u+\" in action creation. Use another method name or override it on Reflux.PublisherMethods instead.\");t.children=t.children||[],t.asyncResult&&(t.children=t.children.concat([\"completed\",\"failed\"]));for(var l=0,c={};l<t.children.length;l++){var p=t.children[l];c[p]=e(p)}var f=r.extend({eventLabel:\"action\",emitter:new r.EventEmitter,_isAction:!0},i,o,t),d=function e(){var t=e.sync?\"trigger\":r.environment.hasPromise?\"triggerPromise\":\"triggerAsync\";\nreturn e[t].apply(e,arguments)};return r.extend(d,c,f),a.createdActions.push(d),d};e.exports=u},function(e,t,n){var r=n(163),o=n(176),i=n(164);e.exports=function(e,t){return{getInitialState:function(){return i.isFunction(e.getInitialState)?void 0===t?e.getInitialState():i.object([t],[e.getInitialState()]):{}},componentDidMount:function(){i.extend(this,r);var n=this,o=void 0===t?this.setState:function(e){\"undefined\"!=typeof n.isMounted&&n.isMounted()!==!0||n.setState(i.object([t],[e]))};this.listenTo(e,o)},componentWillUnmount:o.componentWillUnmount}}},function(e,t,n){var r=n(164),o=n(163);e.exports=r.extend({componentWillUnmount:o.stopListeningToAll},o)},function(e,t,n){var r=n(163),o=n(176),i=n(164);e.exports=function(e,t,n){return n=i.isFunction(t)?t:n,{getInitialState:function(){if(i.isFunction(e.getInitialState)){if(i.isFunction(t))return n.call(this,e.getInitialState());var r=n.call(this,e.getInitialState());return\"undefined\"!=typeof r?i.object([t],[r]):{}}return{}},componentDidMount:function(){i.extend(this,r);var o=this,a=function(e){if(i.isFunction(t))o.setState(n.call(o,e));else{var r=n.call(o,e);o.setState(i.object([t],[r]))}};this.listenTo(e,a)},componentWillUnmount:o.componentWillUnmount}}},function(e,t,n){var r=n(163);e.exports=function(e,t,n){return{componentDidMount:function(){for(var o in r)if(this[o]!==r[o]){if(this[o])throw\"Can't have other property '\"+o+\"' when using Reflux.listenTo!\";this[o]=r[o]}this.listenTo(e,t,n)},componentWillUnmount:r.stopListeningToAll}}},function(e,t,n){var r=n(163);e.exports=function(e){return{componentDidMount:function(){for(var t in r)if(this[t]!==r[t]){if(this[t])throw\"Can't have other property '\"+t+\"' when using Reflux.listenToMany!\";this[t]=r[t]}this.listenToMany(e)},componentWillUnmount:r.stopListeningToAll}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(181),i=r(o),a=n(188),s=r(a),u=n(189),l=r(u),c=n(192),p=r(c),f=n(184),d=r(f),h=n(193),v=r(h),m=n(194),y=r(m),g=n(195),b=r(g),E=n(196),_=r(E),O=n(200),N=r(O),w=n(201),C=r(w),P=n(205),x=r(P),T=n(207),D=r(T),M=n(208),S=r(M),k=n(202),I=r(k),R=n(209),A=r(R),j=n(211),L=r(j),V=n(210),F=r(V),U=n(212),B=r(U),K=n(213),W=r(K),H=n(206),q=r(H),z=n(215),Y=r(z),G=n(216),Q=r(G),$=n(218),X=r($),J=n(219),Z=r(J),ee=n(220),te=r(ee),ne=n(221),re=r(ne),oe=n(222),ie=r(oe),ae=n(223),se=r(ae),ue=n(224),le=r(ue),ce=n(228),pe=r(ce),fe=n(229),de=r(fe),he=n(227),ve=r(he),me=n(230),ye=r(me),ge=n(231),be=r(ge),Ee=n(232),_e=r(Ee),Oe=n(233),Ne=r(Oe),we=n(234),Ce=r(we),Pe=n(236),xe=r(Pe),Te=n(226),De=r(Te),Me=n(237),Se=r(Me),ke=n(241),Ie=r(ke),Re=n(242),Ae=r(Re),je=n(245),Le=r(je),Ve=n(182),Fe=r(Ve),Ue=n(246),Be=r(Ue),Ke=n(247),We=r(Ke),He=n(248),qe=r(He),ze=n(249),Ye=r(ze),Ge=n(250),Qe=r(Ge),$e=n(251),Xe=r($e),Je=n(252),Ze=r(Je),et=n(253),tt=r(et),nt=n(254),rt=r(nt),ot=n(255),it=r(ot),at=n(256),st=r(at),ut=n(257),lt=r(ut),ct=n(258),pt=r(ct),ft=n(259),dt=r(ft),ht=n(185),vt=r(ht),mt=n(225),yt=r(mt),gt=n(238),bt=r(gt);t.default={Accordion:i.default,Affix:s.default,AffixMixin:l.default,Alert:p.default,BootstrapMixin:d.default,Badge:v.default,Button:y.default,ButtonGroup:b.default,ButtonInput:_.default,ButtonToolbar:N.default,CollapsibleNav:C.default,Carousel:x.default,CarouselItem:D.default,Col:S.default,CollapsibleMixin:I.default,DropdownButton:A.default,DropdownMenu:L.default,DropdownStateMixin:F.default,FadeMixin:B.default,FormControls:W.default,Glyphicon:q.default,Grid:Y.default,Input:Q.default,Interpolate:X.default,Jumbotron:Z.default,Label:te.default,ListGroup:re.default,ListGroupItem:ie.default,MenuItem:se.default,Modal:le.default,ModalHeader:pe.default,ModalTitle:de.default,ModalBody:ve.default,ModalFooter:ye.default,Nav:be.default,Navbar:_e.default,NavItem:Ne.default,ModalTrigger:Ce.default,Overlay:Se.default,OverlayTrigger:xe.default,OverlayMixin:De.default,PageHeader:Ie.default,Panel:Le.default,PanelGroup:Fe.default,PageItem:Be.default,Pager:We.default,Pagination:Ae.default,Popover:qe.default,Portal:yt.default,Position:bt.default,ProgressBar:Ye.default,Row:Qe.default,SplitButton:Xe.default,SubNav:Ze.default,TabbedArea:tt.default,Table:rt.default,TabPane:it.default,Thumbnail:st.default,Tooltip:lt.default,utils:pt.default,Well:dt.default,styleMaps:vt.default},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(182),u=r(s),l=a.default.createClass({displayName:\"Accordion\",render:function(){return a.default.createElement(u.default,o({},this.props,{accordion:!0}),this.props.children)}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(187),f=r(p),d=a.default.createClass({displayName:\"PanelGroup\",mixins:[c.default],propTypes:{accordion:a.default.PropTypes.bool,activeKey:a.default.PropTypes.any,className:a.default.PropTypes.string,children:a.default.PropTypes.node,defaultActiveKey:a.default.PropTypes.any,onSelect:a.default.PropTypes.func},getDefaultProps:function(){return{bsClass:\"panel-group\"}},getInitialState:function(){var e=this.props.defaultActiveKey;return{activeKey:e}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e),onSelect:null}),f.default.map(this.props.children,this.renderPanel))},renderPanel:function(e,t){var n=null!=this.props.activeKey?this.props.activeKey:this.state.activeKey,r={bsStyle:e.props.bsStyle||this.props.bsStyle,key:e.key?e.key:t,ref:e.ref};return this.props.accordion&&(r.collapsible=!0,r.expanded=e.props.eventKey===n,r.onSelect=this.handleSelect),(0,i.cloneElement)(e,r)},shouldComponentUpdate:function(){return!this._isChanging},handleSelect:function(e,t){e.preventDefault(),this.props.onSelect&&(this._isChanging=!0,this.props.onSelect(t),this._isChanging=!1),this.state.activeKey===t&&(t=null),this.setState({activeKey:t})}});t.default=d,e.exports=t.default},function(e,t,n){var r,o;/*!\n\t  Copyright (c) 2016 Jed Watson.\n\t  Licensed under the MIT License (MIT), see\n\t  http://jedwatson.github.io/classnames\n\t*/\n!function(){\"use strict\";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if(\"string\"===o||\"number\"===o)e.push(r);else if(Array.isArray(r))e.push(n.apply(null,r));else if(\"object\"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(\" \")}var i={}.hasOwnProperty;\"undefined\"!=typeof e&&e.exports?e.exports=n:(r=[],o=function(){return n}.apply(t,r),!(void 0!==o&&(e.exports=o)))}()},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(185),i=r(o),a=n(186),s=r(a),u={propTypes:{bsClass:s.default.keyOf(i.default.CLASSES),bsStyle:s.default.keyOf(i.default.STYLES),bsSize:s.default.keyOf(i.default.SIZES)},getBsClassSet:function(){var e={},t=this.props.bsClass&&i.default.CLASSES[this.props.bsClass];if(t){e[t]=!0;var n=t+\"-\",r=this.props.bsSize&&i.default.SIZES[this.props.bsSize];r&&(e[n+r]=!0);var o=this.props.bsStyle&&i.default.STYLES[this.props.bsStyle];this.props.bsStyle&&(e[n+o]=!0)}return e},prefixClass:function(e){return i.default.CLASSES[this.props.bsClass]+\"-\"+e}};t.default=u,e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n={CLASSES:{alert:\"alert\",button:\"btn\",\"button-group\":\"btn-group\",\"button-toolbar\":\"btn-toolbar\",column:\"col\",\"input-group\":\"input-group\",form:\"form\",glyphicon:\"glyphicon\",label:\"label\",thumbnail:\"thumbnail\",\"list-group-item\":\"list-group-item\",panel:\"panel\",\"panel-group\":\"panel-group\",pagination:\"pagination\",\"progress-bar\":\"progress-bar\",nav:\"nav\",navbar:\"navbar\",modal:\"modal\",row:\"row\",well:\"well\"},STYLES:{default:\"default\",primary:\"primary\",success:\"success\",info:\"info\",warning:\"warning\",danger:\"danger\",link:\"link\",inline:\"inline\",tabs:\"tabs\",pills:\"pills\"},addStyle:function(e){n.STYLES[e]=e},SIZES:{large:\"lg\",medium:\"md\",small:\"sm\",xsmall:\"xs\"},GLYPHS:[\"asterisk\",\"plus\",\"euro\",\"eur\",\"minus\",\"cloud\",\"envelope\",\"pencil\",\"glass\",\"music\",\"search\",\"heart\",\"star\",\"star-empty\",\"user\",\"film\",\"th-large\",\"th\",\"th-list\",\"ok\",\"remove\",\"zoom-in\",\"zoom-out\",\"off\",\"signal\",\"cog\",\"trash\",\"home\",\"file\",\"time\",\"road\",\"download-alt\",\"download\",\"upload\",\"inbox\",\"play-circle\",\"repeat\",\"refresh\",\"list-alt\",\"lock\",\"flag\",\"headphones\",\"volume-off\",\"volume-down\",\"volume-up\",\"qrcode\",\"barcode\",\"tag\",\"tags\",\"book\",\"bookmark\",\"print\",\"camera\",\"font\",\"bold\",\"italic\",\"text-height\",\"text-width\",\"align-left\",\"align-center\",\"align-right\",\"align-justify\",\"list\",\"indent-left\",\"indent-right\",\"facetime-video\",\"picture\",\"map-marker\",\"adjust\",\"tint\",\"edit\",\"share\",\"check\",\"move\",\"step-backward\",\"fast-backward\",\"backward\",\"play\",\"pause\",\"stop\",\"forward\",\"fast-forward\",\"step-forward\",\"eject\",\"chevron-left\",\"chevron-right\",\"plus-sign\",\"minus-sign\",\"remove-sign\",\"ok-sign\",\"question-sign\",\"info-sign\",\"screenshot\",\"remove-circle\",\"ok-circle\",\"ban-circle\",\"arrow-left\",\"arrow-right\",\"arrow-up\",\"arrow-down\",\"share-alt\",\"resize-full\",\"resize-small\",\"exclamation-sign\",\"gift\",\"leaf\",\"fire\",\"eye-open\",\"eye-close\",\"warning-sign\",\"plane\",\"calendar\",\"random\",\"comment\",\"magnet\",\"chevron-up\",\"chevron-down\",\"retweet\",\"shopping-cart\",\"folder-close\",\"folder-open\",\"resize-vertical\",\"resize-horizontal\",\"hdd\",\"bullhorn\",\"bell\",\"certificate\",\"thumbs-up\",\"thumbs-down\",\"hand-right\",\"hand-left\",\"hand-up\",\"hand-down\",\"circle-arrow-right\",\"circle-arrow-left\",\"circle-arrow-up\",\"circle-arrow-down\",\"globe\",\"wrench\",\"tasks\",\"filter\",\"briefcase\",\"fullscreen\",\"dashboard\",\"paperclip\",\"heart-empty\",\"link\",\"phone\",\"pushpin\",\"usd\",\"gbp\",\"sort\",\"sort-by-alphabet\",\"sort-by-alphabet-alt\",\"sort-by-order\",\"sort-by-order-alt\",\"sort-by-attributes\",\"sort-by-attributes-alt\",\"unchecked\",\"expand\",\"collapse-down\",\"collapse-up\",\"log-in\",\"flash\",\"log-out\",\"new-window\",\"record\",\"save\",\"open\",\"saved\",\"import\",\"export\",\"send\",\"floppy-disk\",\"floppy-saved\",\"floppy-remove\",\"floppy-save\",\"floppy-open\",\"credit-card\",\"transfer\",\"cutlery\",\"header\",\"compressed\",\"earphone\",\"phone-alt\",\"tower\",\"stats\",\"sd-video\",\"hd-video\",\"subtitles\",\"sound-stereo\",\"sound-dolby\",\"sound-5-1\",\"sound-6-1\",\"sound-7-1\",\"copyright-mark\",\"registration-mark\",\"cloud-download\",\"cloud-upload\",\"tree-conifer\",\"tree-deciduous\",\"cd\",\"save-file\",\"open-file\",\"level-up\",\"copy\",\"paste\",\"alert\",\"equalizer\",\"king\",\"queen\",\"pawn\",\"bishop\",\"knight\",\"baby-formula\",\"tent\",\"blackboard\",\"bed\",\"apple\",\"erase\",\"hourglass\",\"lamp\",\"duplicate\",\"piggy-bank\",\"scissors\",\"bitcoin\",\"yen\",\"ruble\",\"scale\",\"ice-lolly\",\"ice-lolly-tasted\",\"education\",\"option-horizontal\",\"option-vertical\",\"menu-hamburger\",\"modal-window\",\"oil\",\"grain\",\"sunglasses\",\"text-size\",\"text-color\",\"text-background\",\"object-align-top\",\"object-align-bottom\",\"object-align-horizontal\",\"object-align-left\",\"object-align-vertical\",\"object-align-right\",\"triangle-right\",\"triangle-left\",\"triangle-bottom\",\"triangle-top\",\"console\",\"superscript\",\"subscript\",\"menu-left\",\"menu-right\",\"menu-down\",\"menu-up\"]};t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return Array.isArray(e)?e:Array.from(e)}function i(e,t,n,r){return\"Invalid prop '\"+t+\"' of value '\"+e[t]+\"'\"+(\" supplied to '\"+n+\"'\"+r)}function a(e){function t(t,n,r,o){return o=o||h,null!=n[r]?e(n,r,o):t?new Error(\"Required prop '\"+r+\"' was not specified in '\"+o+\"'.\"):void 0}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function s(){function e(e,t,n){if(\"object\"!=typeof e[t]||\"function\"!=typeof e[t].render&&1!==e[t].nodeType)return new Error(i(e,t,n,\", expected a DOM element or an object that has a `render` method\"))}return a(e)}function u(e){function t(t,n,r){var o=t[n];if(!e.hasOwnProperty(o)){var a=JSON.stringify(Object.keys(e));return new Error(i(t,n,r,\", expected one of \"+a+\".\"))}}return a(t)}function l(e){function t(t,n,r){var i=e.map(function(e){return t[e]}).reduce(function(e,t){return e+(void 0!==t?1:0)},0);if(i>1){var a=o(e),s=a[0],u=a.slice(1),l=\"\"+u.join(\", \")+\" and \"+s;return new Error(\"Invalid prop '\"+n+\"', only one of the following may be provided: \"+l)}}return t}function c(e){if(void 0===e)throw new Error(\"No validations provided\");if(!(e instanceof Array))throw new Error(\"Invalid argument must be an array\");if(0===e.length)throw new Error(\"No validations provided\");return function(t,n,r){for(var o=0;o<e.length;o++){var i=e[o](t,n,r);if(void 0!==i&&null!==i)return i}}}function p(){function e(e,t,n){var r=i(e,t,n,\". Expected an Element `type`\");if(\"function\"!=typeof e[t]){if(d.default.isValidElement(e[t]))return new Error(r+\", not an actual Element\");if(\"string\"!=typeof e[t])return new Error(r+\" such as a tag name or return value of React.createClass(...)\")}}return a(e)}Object.defineProperty(t,\"__esModule\",{value:!0});var f=n(4),d=r(f),h=\"<<anonymous>>\",v={isRequiredForA11y:function(e){return function(t,n,r){return null===t[n]?new Error(\"The prop `\"+n+\"` is required to make \"+r+\" accessible for users using assistive technologies such as screen readers `\"):e(t,n,r)}},mountable:s(),elementType:p(),keyOf:u,singlePropFrom:l,all:c};t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){var r=0;return l.default.Children.map(e,function(e){if(l.default.isValidElement(e)){var o=r;return r++,t.call(n,e,o)}return e})}function i(e,t,n){var r=0;return l.default.Children.forEach(e,function(e){l.default.isValidElement(e)&&(t.call(n,e,r),r++)})}function a(e){var t=0;return l.default.Children.forEach(e,function(e){l.default.isValidElement(e)&&t++}),t}function s(e){var t=!1;return l.default.Children.forEach(e,function(e){!t&&l.default.isValidElement(e)&&(t=!0)}),t}Object.defineProperty(t,\"__esModule\",{value:!0});var u=n(4),l=r(u);t.default={map:o,forEach:i,numberOf:a,hasValidComponent:s},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(189),c=r(l),p=n(190),f=r(p),d=a.default.createClass({displayName:\"Affix\",statics:{domUtils:f.default},mixins:[c.default],render:function(){var e={top:this.state.affixPositionTop};return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,this.state.affixClass),style:e}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(190),s=r(a),u=n(191),l=r(u),c={propTypes:{offset:i.default.PropTypes.number,offsetTop:i.default.PropTypes.number,offsetBottom:i.default.PropTypes.number},getInitialState:function(){return{affixClass:\"affix-top\"}},getPinnedOffset:function(e){return this.pinnedOffset?this.pinnedOffset:(e.className=e.className.replace(/affix-top|affix-bottom|affix/,\"\"),e.className+=e.className.length?\" affix\":\"affix\",this.pinnedOffset=s.default.getOffset(e).top-window.pageYOffset,this.pinnedOffset)},checkPosition:function(){var e=void 0,t=void 0,n=void 0,r=void 0,o=void 0,a=void 0,u=void 0,l=void 0,c=void 0;this.isMounted()&&(e=i.default.findDOMNode(this),t=document.documentElement.offsetHeight,n=window.pageYOffset,r=s.default.getOffset(e),\"top\"===this.affixed&&(r.top+=n),o=null!=this.props.offsetTop?this.props.offsetTop:this.props.offset,a=null!=this.props.offsetBottom?this.props.offsetBottom:this.props.offset,null==o&&null==a||(null==o&&(o=0),null==a&&(a=0),u=!(null!=this.unpin&&n+this.unpin<=r.top)&&(null!=a&&r.top+e.offsetHeight>=t-a?\"bottom\":null!=o&&n<=o&&\"top\"),this.affixed!==u&&(null!=this.unpin&&(e.style.top=\"\"),l=\"affix\"+(u?\"-\"+u:\"\"),this.affixed=u,this.unpin=\"bottom\"===u?this.getPinnedOffset(e):null,\"bottom\"===u&&(e.className=e.className.replace(/affix-top|affix-bottom|affix/,\"affix-bottom\"),c=t-a-e.offsetHeight-s.default.getOffset(e).top),this.setState({affixClass:l,affixPositionTop:c}))))},checkPositionWithEventLoop:function(){setTimeout(this.checkPosition,0)},componentDidMount:function(){this._onWindowScrollListener=l.default.listen(window,\"scroll\",this.checkPosition),this._onDocumentClickListener=l.default.listen(s.default.ownerDocument(this),\"click\",this.checkPositionWithEventLoop)},componentWillUnmount:function(){this._onWindowScrollListener&&this._onWindowScrollListener.remove(),this._onDocumentClickListener&&this._onDocumentClickListener.remove()},componentDidUpdate:function(e,t){t.affixClass===this.state.affixClass&&this.checkPositionWithEventLoop()}};t.default=c,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=d.default.findDOMNode(e);return t&&t.ownerDocument||document}function i(e){var t=o(e);return t.defaultView?t.defaultView:t.parentWindow}function a(e){var t=o(e);try{return t.activeElement||t.body}catch(e){return t.body}}function s(e){return o(e).defaultView.getComputedStyle(e,null)}function u(e){if(window.jQuery)return window.jQuery(e).offset();var t=o(e).documentElement,n={top:0,left:0};return\"undefined\"!=typeof e.getBoundingClientRect&&(n=e.getBoundingClientRect()),{top:n.top+window.pageYOffset-t.clientTop,left:n.left+window.pageXOffset-t.clientLeft}}function l(e,t){var n=void 0,r=void 0;return window.jQuery?t?(n=window.jQuery(e).offset(),r=window.jQuery(t).offset(),{top:n.top-r.top,left:n.left-r.left}):window.jQuery(e).position():(r={top:0,left:0},\"fixed\"===s(e).position?n=e.getBoundingClientRect():(t||(t=c(e)),n=u(e),\"HTML\"!==t.nodeName&&(r=u(t)),r.top+=parseInt(s(t).borderTopWidth,10),r.left+=parseInt(s(t).borderLeftWidth,10)),{top:n.top-r.top-parseInt(s(e).marginTop,10),left:n.left-r.left-parseInt(s(e).marginLeft,10)})}function c(e){for(var t=o(e).documentElement,n=e.offsetParent||t;n&&\"HTML\"!==n.nodeName&&\"static\"===s(n).position;)n=n.offsetParent;return n||t}function p(e,t){function n(e,t){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}return e&&e.contains?e.contains(t):e&&e.compareDocumentPosition?e===t||!!(16&e.compareDocumentPosition(t)):n(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0});var f=n(4),d=r(f),h=!(\"undefined\"==typeof window||!window.document||!window.document.createElement);t.default={canUseDom:h,contains:p,ownerWindow:i,ownerDocument:o,getComputedStyles:s,getOffset:u,getPosition:l,activeElement:a,offsetParent:c},e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0}};t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Alert\",mixins:[c.default],propTypes:{onDismiss:a.default.PropTypes.func,dismissAfter:a.default.PropTypes.number,closeLabel:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"alert\",bsStyle:\"info\",closeLabel:\"Close Alert\"}},renderDismissButton:function(){return a.default.createElement(\"button\",{type:\"button\",className:\"close\",\"aria-label\":this.props.closeLabel,onClick:this.props.onDismiss},a.default.createElement(\"span\",{\"aria-hidden\":\"true\"},\"×\"))},render:function(){var e=this.getBsClassSet(),t=!!this.props.onDismiss;return e[\"alert-dismissable\"]=t,a.default.createElement(\"div\",o({},this.props,{role:\"alert\",className:(0,u.default)(this.props.className,e)}),t?this.renderDismissButton():null,this.props.children)},componentDidMount:function(){this.props.dismissAfter&&this.props.onDismiss&&(this.dismissTimer=setTimeout(this.props.onDismiss,this.props.dismissAfter))},componentWillUnmount:function(){clearTimeout(this.dismissTimer)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(187),u=r(s),l=n(183),c=r(l),p=a.default.createClass({displayName:\"Badge\",propTypes:{pullRight:a.default.PropTypes.bool},hasContent:function(){return u.default.hasValidComponent(this.props.children)||a.default.Children.count(this.props.children)>1||\"string\"==typeof this.props.children||\"number\"==typeof this.props.children},render:function(){var e={\"pull-right\":this.props.pullRight,badge:this.hasContent()};return a.default.createElement(\"span\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(186),f=r(p),d=a.default.createClass({displayName:\"Button\",mixins:[c.default],propTypes:{active:a.default.PropTypes.bool,disabled:a.default.PropTypes.bool,block:a.default.PropTypes.bool,navItem:a.default.PropTypes.bool,navDropdown:a.default.PropTypes.bool,componentClass:f.default.elementType,href:a.default.PropTypes.string,target:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"button\",bsStyle:\"default\",type:\"button\"}},render:function(){var e=this.props.navDropdown?{}:this.getBsClassSet(),t=void 0;return e=o({active:this.props.active,\"btn-block\":this.props.block},e),this.props.navItem?this.renderNavItem(e):(t=this.props.href||this.props.target||this.props.navDropdown?\"renderAnchor\":\"renderButton\",this[t](e))},renderAnchor:function(e){var t=this.props.componentClass||\"a\",n=this.props.href||\"#\";return e.disabled=this.props.disabled,a.default.createElement(t,o({},this.props,{href:n,className:(0,u.default)(this.props.className,e),role:\"button\"}),this.props.children)},renderButton:function(e){var t=this.props.componentClass||\"button\";return a.default.createElement(t,o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)},renderNavItem:function(e){var t={active:this.props.active};return a.default.createElement(\"li\",{className:(0,u.default)(t)},this.renderAnchor(e))}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(186),f=r(p),d=a.default.createClass({displayName:\"ButtonGroup\",mixins:[c.default],propTypes:{vertical:a.default.PropTypes.bool,justified:a.default.PropTypes.bool,block:f.default.all([a.default.PropTypes.bool,function(e,t,n){if(e.block&&!e.vertical)return new Error(\"The block property requires the vertical property to be set to have any effect\")}])},getDefaultProps:function(){return{bsClass:\"button-group\"}},render:function(){var e=this.getBsClassSet();return e[\"btn-group\"]=!this.props.vertical,e[\"btn-group-vertical\"]=this.props.vertical,e[\"btn-group-justified\"]=this.props.justified,e[\"btn-block\"]=this.props.block,a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=n(4),c=r(l),p=n(194),f=r(p),d=n(197),h=r(d),v=n(198),m=r(v),y=n(199),g=r(y),b=function(e){function t(){i(this,t),null!=e&&e.apply(this,arguments)}return a(t,e),u(t,[{key:\"renderFormGroup\",value:function(e){var t=this.props,n=(t.bsStyle,t.value,o(t,[\"bsStyle\",\"value\"]));return c.default.createElement(h.default,n,e)}},{key:\"renderInput\",value:function(){var e=this.props,t=e.children,n=e.value,r=o(e,[\"children\",\"value\"]),i=t?t:n;return c.default.createElement(f.default,s({},r,{componentClass:\"input\",ref:\"input\",key:\"input\",value:i}))}}]),t}(m.default);b.types=[\"button\",\"reset\",\"submit\"],b.defaultProps={type:\"button\"},b.propTypes={type:c.default.PropTypes.oneOf(b.types),bsStyle:function(e){return null},children:g.default,value:g.default},t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(4),u=r(s),l=n(183),c=r(l),p=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),a(t,[{key:\"render\",value:function(){var e={\"form-group\":!this.props.standalone,\"form-group-lg\":!this.props.standalone&&\"large\"===this.props.bsSize,\"form-group-sm\":!this.props.standalone&&\"small\"===this.props.bsSize,\"has-feedback\":this.props.hasFeedback,\"has-success\":\"success\"===this.props.bsStyle,\"has-warning\":\"warning\"===this.props.bsStyle,\"has-error\":\"error\"===this.props.bsStyle};return u.default.createElement(\"div\",{className:(0,c.default)(e,this.props.groupClassName)},this.props.children)}}]),t}(u.default.Component);p.defaultProps={standalone:!1},p.propTypes={standalone:u.default.PropTypes.bool,hasFeedback:u.default.PropTypes.bool,bsSize:function(e){return e.standalone&&void 0!==e.bsSize?new Error(\"bsSize will not be used when `standalone` is set.\"):u.default.PropTypes.oneOf([\"small\",\"medium\",\"large\"]).apply(null,arguments)},bsStyle:u.default.PropTypes.oneOf([\"success\",\"warning\",\"error\"]),groupClassName:u.default.PropTypes.string},t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=n(197),d=r(f),h=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"getInputDOMNode\",value:function(){return l.default.findDOMNode(this.refs.input)}},{key:\"getValue\",value:function(){if(\"static\"===this.props.type)return this.props.value;if(this.props.type)return\"select\"===this.props.type&&this.props.multiple?this.getSelectedOptions():this.getInputDOMNode().value;throw\"Cannot use getValue without specifying input type.\"}},{key:\"getChecked\",value:function(){return this.getInputDOMNode().checked}},{key:\"getSelectedOptions\",value:function(){var e=[];return Array.prototype.forEach.call(this.getInputDOMNode().getElementsByTagName(\"option\"),function(t){if(t.selected){var n=t.getAttribute(\"value\")||t.innerHtml;e.push(n)}}),e}},{key:\"isCheckboxOrRadio\",value:function(){return\"checkbox\"===this.props.type||\"radio\"===this.props.type}},{key:\"isFile\",value:function(){return\"file\"===this.props.type}},{key:\"renderInputGroup\",value:function(e){var t=this.props.addonBefore?l.default.createElement(\"span\",{className:\"input-group-addon\",key:\"addonBefore\"},this.props.addonBefore):null,n=this.props.addonAfter?l.default.createElement(\"span\",{className:\"input-group-addon\",key:\"addonAfter\"},this.props.addonAfter):null,r=this.props.buttonBefore?l.default.createElement(\"span\",{className:\"input-group-btn\"},this.props.buttonBefore):null,o=this.props.buttonAfter?l.default.createElement(\"span\",{className:\"input-group-btn\"},this.props.buttonAfter):null,i=void 0;switch(this.props.bsSize){case\"small\":i=\"input-group-sm\";break;case\"large\":i=\"input-group-lg\"}return t||n||r||o?l.default.createElement(\"div\",{className:(0,p.default)(i,\"input-group\"),key:\"input-group\"},t,r,e,n,o):e}},{key:\"renderIcon\",value:function(){var e={glyphicon:!0,\"form-control-feedback\":!0,\"glyphicon-ok\":\"success\"===this.props.bsStyle,\"glyphicon-warning-sign\":\"warning\"===this.props.bsStyle,\"glyphicon-remove\":\"error\"===this.props.bsStyle};return this.props.hasFeedback?l.default.createElement(\"span\",{className:(0,p.default)(e),key:\"icon\"}):null}},{key:\"renderHelp\",value:function(){return this.props.help?l.default.createElement(\"span\",{className:\"help-block\",key:\"help\"},this.props.help):null}},{key:\"renderCheckboxAndRadioWrapper\",value:function(e){var t={checkbox:\"checkbox\"===this.props.type,radio:\"radio\"===this.props.type};return l.default.createElement(\"div\",{className:(0,p.default)(t),key:\"checkboxRadioWrapper\"},e)}},{key:\"renderWrapper\",value:function(e){return this.props.wrapperClassName?l.default.createElement(\"div\",{className:this.props.wrapperClassName,key:\"wrapper\"},e):e}},{key:\"renderLabel\",value:function(e){var t={\"control-label\":!this.isCheckboxOrRadio()};return t[this.props.labelClassName]=this.props.labelClassName,this.props.label?l.default.createElement(\"label\",{htmlFor:this.props.id,className:(0,p.default)(t),key:\"label\"},e,this.props.label):e}},{key:\"renderInput\",value:function(){if(!this.props.type)return this.props.children;switch(this.props.type){case\"select\":return l.default.createElement(\"select\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control\"),ref:\"input\",key:\"input\"}),this.props.children);case\"textarea\":return l.default.createElement(\"textarea\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control\"),ref:\"input\",key:\"input\"}));case\"static\":return l.default.createElement(\"p\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control-static\"),ref:\"input\",key:\"input\"}),this.props.value)}var e=this.isCheckboxOrRadio()||this.isFile()?\"\":\"form-control\";return l.default.createElement(\"input\",a({},this.props,{className:(0,p.default)(this.props.className,e),ref:\"input\",key:\"input\"}))}},{key:\"renderFormGroup\",value:function(e){return l.default.createElement(d.default,this.props,e)}},{key:\"renderChildren\",value:function(){return this.isCheckboxOrRadio()?this.renderWrapper([this.renderCheckboxAndRadioWrapper(this.renderLabel(this.renderInput())),this.renderHelp()]):[this.renderLabel(),this.renderWrapper([this.renderInputGroup(this.renderInput()),this.renderIcon(),this.renderHelp()])]}},{key:\"render\",value:function(){var e=this.renderChildren();return this.renderFormGroup(e)}}]),t}(l.default.Component);h.propTypes={type:l.default.PropTypes.string,label:l.default.PropTypes.node,help:l.default.PropTypes.node,addonBefore:l.default.PropTypes.node,addonAfter:l.default.PropTypes.node,buttonBefore:l.default.PropTypes.node,buttonAfter:l.default.PropTypes.node,bsSize:l.default.PropTypes.oneOf([\"small\",\"medium\",\"large\"]),bsStyle:l.default.PropTypes.oneOf([\"success\",\"warning\",\"error\"]),hasFeedback:l.default.PropTypes.bool,id:l.default.PropTypes.string,groupClassName:l.default.PropTypes.string,wrapperClassName:l.default.PropTypes.string,labelClassName:l.default.PropTypes.string,multiple:l.default.PropTypes.bool,disabled:l.default.PropTypes.bool,value:l.default.PropTypes.any},t.default=h,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){var r=(0,s.singlePropFrom)(u)(e,t,n);if(!r){var o=a.default.PropTypes.oneOfType(l);r=o(e,t,n)}return r}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var i=n(4),a=r(i),s=n(186),u=[\"children\",\"value\"],l=[a.default.PropTypes.number,a.default.PropTypes.string];e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"ButtonToolbar\",mixins:[c.default],getDefaultProps:function(){return{bsClass:\"button-toolbar\"}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"div\",o({},this.props,{role:\"toolbar\",className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(184),s=r(a),u=n(202),l=r(u),c=n(183),p=r(c),f=n(190),d=r(f),h=n(187),v=r(h),m=n(204),y=r(m),g=i.default.createClass({displayName:\"CollapsibleNav\",mixins:[s.default,l.default],propTypes:{onSelect:i.default.PropTypes.func,activeHref:i.default.PropTypes.string,activeKey:i.default.PropTypes.any,collapsible:i.default.PropTypes.bool,expanded:i.default.PropTypes.bool,eventKey:i.default.PropTypes.any},getCollapsibleDOMNode:function(){return i.default.findDOMNode(this)},getCollapsibleDimensionValue:function(){var e=0,t=this.refs;for(var n in t)if(t.hasOwnProperty(n)){var r=i.default.findDOMNode(t[n]),o=r.offsetHeight,a=d.default.getComputedStyles(r);e+=o+parseInt(a.marginTop,10)+parseInt(a.marginBottom,10)}return e},render:function(){var e=this.props.collapsible?this.getCollapsibleClassSet(\"navbar-collapse\"):null,t=this.props.collapsible?this.renderCollapsibleNavChildren:this.renderChildren;return i.default.createElement(\"div\",{eventKey:this.props.eventKey,className:(0,p.default)(this.props.className,e)},v.default.map(this.props.children,t))},getChildActiveProp:function(e){return!!e.props.active||(null!=this.props.activeKey&&e.props.eventKey===this.props.activeKey||(null!=this.props.activeHref&&e.props.href===this.props.activeHref||e.props.active))},renderChildren:function(e,t){var n=e.key?e.key:t;return(0,o.cloneElement)(e,{activeKey:this.props.activeKey,activeHref:this.props.activeHref,ref:\"nocollapse_\"+n,key:n,navItem:!0})},renderCollapsibleNavChildren:function(e,t){var n=e.key?e.key:t;return(0,o.cloneElement)(e,{active:this.getChildActiveProp(e),activeKey:this.props.activeKey,activeHref:this.props.activeHref,onSelect:(0,y.default)(e.props.onSelect,this.props.onSelect),ref:\"collapsible_\"+n,key:n,navItem:!0})}});t.default=g,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(203),s=r(a),u={propTypes:{defaultExpanded:i.default.PropTypes.bool,expanded:i.default.PropTypes.bool},getInitialState:function(){var e=null!=this.props.defaultExpanded?this.props.defaultExpanded:null!=this.props.expanded&&this.props.expanded;return{expanded:e,collapsing:!1}},componentWillUpdate:function(e,t){var n=null!=e.expanded?e.expanded:t.expanded;if(n!==this.isExpanded()){var r=this.getCollapsibleDOMNode(),o=this.dimension(),i=\"0\";n||(i=this.getCollapsibleDimensionValue()),r.style[o]=i+\"px\",this._afterWillUpdate()}},componentDidUpdate:function(e,t){this._checkToggleCollapsing(e,t),this._checkStartAnimation()},_afterWillUpdate:function(){},_checkStartAnimation:function(){if(this.state.collapsing){var e=this.getCollapsibleDOMNode(),t=this.dimension(),n=this.getCollapsibleDimensionValue(),r=void 0;r=this.isExpanded()?n+\"px\":\"0px\",e.style[t]=r}},_checkToggleCollapsing:function(e,t){var n=null!=e.expanded?e.expanded:t.expanded,r=this.isExpanded();n!==r&&(n?this._handleCollapse():this._handleExpand())},_handleExpand:function(){var e=this,t=this.getCollapsibleDOMNode(),n=this.dimension(),r=function r(){e._removeEndEventListener(t,r),t.style[n]=\"\",e.setState({collapsing:!1})};this._addEndEventListener(t,r),this.setState({collapsing:!0})},_handleCollapse:function(){var e=this,t=this.getCollapsibleDOMNode(),n=function n(){e._removeEndEventListener(t,n),e.setState({collapsing:!1})};this._addEndEventListener(t,n),this.setState({collapsing:!0})},\n_addEndEventListener:function(e,t){s.default.addEndEventListener(e,t)},_removeEndEventListener:function(e,t){s.default.removeEndEventListener(e,t)},dimension:function(){return\"function\"==typeof this.getCollapsibleDimension?this.getCollapsibleDimension():\"height\"},isExpanded:function(){return null!=this.props.expanded?this.props.expanded:this.state.expanded},getCollapsibleClassSet:function(e){var t={};return\"string\"==typeof e&&e.split(\" \").forEach(function(e){e&&(t[e]=!0)}),t.collapsing=this.state.collapsing,t.collapse=!this.state.collapsing,t.in=this.isExpanded()&&!this.state.collapsing,t}};t.default=u,e.exports=t.default},function(e,t){\"use strict\";function n(){var e=document.createElement(\"div\"),t=e.style;\"AnimationEvent\"in window||delete a.animationend.animation,\"TransitionEvent\"in window||delete a.transitionend.transition;for(var n in a){var r=a[n];for(var o in r)if(o in t){s.push(r[o]);break}}}function r(e,t,n){e.addEventListener(t,n,!1)}function o(e,t,n){e.removeEventListener(t,n,!1)}Object.defineProperty(t,\"__esModule\",{value:!0});var i=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),a={transitionend:{transition:\"transitionend\",WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"mozTransitionEnd\",OTransition:\"oTransitionEnd\",msTransition:\"MSTransitionEnd\"},animationend:{animation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\",MozAnimation:\"mozAnimationEnd\",OAnimation:\"oAnimationEnd\",msAnimation:\"MSAnimationEnd\"}},s=[];i&&n();var u={addEndEventListener:function(e,t){return 0===s.length?void window.setTimeout(t,0):void s.forEach(function(n){r(e,n,t)})},removeEndEventListener:function(e,t){0!==s.length&&s.forEach(function(n){o(e,n,t)})}};t.default=u,e.exports=t.default},function(e,t){\"use strict\";function n(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return null!=e}).reduce(function(e,t){if(\"function\"!=typeof t)throw new Error(\"Invalid Argument Type, must only provide functions, undefined, or null.\");return null===e?t:function(){for(var n=arguments.length,r=Array(n),o=0;o<n;o++)r[o]=arguments[o];e.apply(this,r),t.apply(this,r)}},null)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(187),f=r(p),d=n(206),h=r(d),v=a.default.createClass({displayName:\"Carousel\",mixins:[c.default],propTypes:{slide:a.default.PropTypes.bool,indicators:a.default.PropTypes.bool,interval:a.default.PropTypes.number,controls:a.default.PropTypes.bool,pauseOnHover:a.default.PropTypes.bool,wrap:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,onSlideEnd:a.default.PropTypes.func,activeIndex:a.default.PropTypes.number,defaultActiveIndex:a.default.PropTypes.number,direction:a.default.PropTypes.oneOf([\"prev\",\"next\"]),prevIcon:a.default.PropTypes.node,nextIcon:a.default.PropTypes.node},getDefaultProps:function(){return{slide:!0,interval:5e3,pauseOnHover:!0,wrap:!0,indicators:!0,controls:!0,prevIcon:a.default.createElement(h.default,{glyph:\"chevron-left\"}),nextIcon:a.default.createElement(h.default,{glyph:\"chevron-right\"})}},getInitialState:function(){return{activeIndex:null==this.props.defaultActiveIndex?0:this.props.defaultActiveIndex,previousActiveIndex:null,direction:null}},getDirection:function(e,t){return e===t?null:e>t?\"prev\":\"next\"},componentWillReceiveProps:function(e){var t=this.getActiveIndex();null!=e.activeIndex&&e.activeIndex!==t&&(clearTimeout(this.timeout),this.setState({previousActiveIndex:t,direction:null!=e.direction?e.direction:this.getDirection(t,e.activeIndex)}))},componentDidMount:function(){this.waitForNext()},componentWillUnmount:function(){clearTimeout(this.timeout)},next:function(e){e&&e.preventDefault();var t=this.getActiveIndex()+1,n=f.default.numberOf(this.props.children);if(t>n-1){if(!this.props.wrap)return;t=0}this.handleSelect(t,\"next\")},prev:function(e){e&&e.preventDefault();var t=this.getActiveIndex()-1;if(t<0){if(!this.props.wrap)return;t=f.default.numberOf(this.props.children)-1}this.handleSelect(t,\"prev\")},pause:function(){this.isPaused=!0,clearTimeout(this.timeout)},play:function(){this.isPaused=!1,this.waitForNext()},waitForNext:function(){!this.isPaused&&this.props.slide&&this.props.interval&&null==this.props.activeIndex&&(this.timeout=setTimeout(this.next,this.props.interval))},handleMouseOver:function(){this.props.pauseOnHover&&this.pause()},handleMouseOut:function(){this.isPaused&&this.play()},render:function(){var e={carousel:!0,slide:this.props.slide};return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e),onMouseOver:this.handleMouseOver,onMouseOut:this.handleMouseOut}),this.props.indicators?this.renderIndicators():null,a.default.createElement(\"div\",{className:\"carousel-inner\",ref:\"inner\"},f.default.map(this.props.children,this.renderItem)),this.props.controls?this.renderControls():null)},renderPrev:function(){return a.default.createElement(\"a\",{className:\"left carousel-control\",href:\"#prev\",key:0,onClick:this.prev},this.props.prevIcon)},renderNext:function(){return a.default.createElement(\"a\",{className:\"right carousel-control\",href:\"#next\",key:1,onClick:this.next},this.props.nextIcon)},renderControls:function(){if(!this.props.wrap){var e=this.getActiveIndex(),t=f.default.numberOf(this.props.children);return[0!==e?this.renderPrev():null,e!==t-1?this.renderNext():null]}return[this.renderPrev(),this.renderNext()]},renderIndicator:function(e,t){var n=t===this.getActiveIndex()?\"active\":null;return a.default.createElement(\"li\",{key:t,className:n,onClick:this.handleSelect.bind(this,t,null)})},renderIndicators:function(){var e=[];return f.default.forEach(this.props.children,function(t,n){e.push(this.renderIndicator(t,n),\" \")},this),a.default.createElement(\"ol\",{className:\"carousel-indicators\"},e)},getActiveIndex:function(){return null!=this.props.activeIndex?this.props.activeIndex:this.state.activeIndex},handleItemAnimateOutEnd:function(){this.setState({previousActiveIndex:null,direction:null},function(){this.waitForNext(),this.props.onSlideEnd&&this.props.onSlideEnd()})},renderItem:function(e,t){var n=this.getActiveIndex(),r=t===n,o=null!=this.state.previousActiveIndex&&this.state.previousActiveIndex===t&&this.props.slide;return(0,i.cloneElement)(e,{active:r,ref:e.ref,key:e.key?e.key:t,index:t,animateOut:o,animateIn:r&&null!=this.state.previousActiveIndex&&this.props.slide,direction:this.state.direction,onAnimateOutEnd:o?this.handleItemAnimateOutEnd:null})},handleSelect:function(e,t){clearTimeout(this.timeout);var n=this.getActiveIndex();if(t=t||this.getDirection(n,e),this.props.onSelect&&this.props.onSelect(e,t),null==this.props.activeIndex&&e!==n){if(null!=this.state.previousActiveIndex)return;this.setState({activeIndex:e,previousActiveIndex:n,direction:t})}}});t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(185),f=r(p),d=a.default.createClass({displayName:\"Glyphicon\",mixins:[c.default],propTypes:{glyph:a.default.PropTypes.oneOf(f.default.GLYPHS).isRequired},getDefaultProps:function(){return{bsClass:\"glyphicon\"}},render:function(){var e=this.getBsClassSet();return e[\"glyphicon-\"+this.props.glyph]=!0,a.default.createElement(\"span\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(203),c=r(l),p=a.default.createClass({displayName:\"CarouselItem\",propTypes:{direction:a.default.PropTypes.oneOf([\"prev\",\"next\"]),onAnimateOutEnd:a.default.PropTypes.func,active:a.default.PropTypes.bool,animateIn:a.default.PropTypes.bool,animateOut:a.default.PropTypes.bool,caption:a.default.PropTypes.node,index:a.default.PropTypes.number},getInitialState:function(){return{direction:null}},getDefaultProps:function(){return{animation:!0}},handleAnimateOutEnd:function(){this.props.onAnimateOutEnd&&this.isMounted()&&this.props.onAnimateOutEnd(this.props.index)},componentWillReceiveProps:function(e){this.props.active!==e.active&&this.setState({direction:null})},componentDidUpdate:function(e){!this.props.active&&e.active&&c.default.addEndEventListener(a.default.findDOMNode(this),this.handleAnimateOutEnd),this.props.active!==e.active&&setTimeout(this.startAnimation,20)},startAnimation:function(){this.isMounted()&&this.setState({direction:\"prev\"===this.props.direction?\"right\":\"left\"})},render:function(){var e={item:!0,active:this.props.active&&!this.props.animateIn||this.props.animateOut,next:this.props.active&&this.props.animateIn&&\"next\"===this.props.direction,prev:this.props.active&&this.props.animateIn&&\"prev\"===this.props.direction};return this.state.direction&&(this.props.animateIn||this.props.animateOut)&&(e[this.state.direction]=!0),a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children,this.props.caption?this.renderCaption():null)},renderCaption:function(){return a.default.createElement(\"div\",{className:\"carousel-caption\"},this.props.caption)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(185),c=r(l),p=n(186),f=r(p),d=a.default.createClass({displayName:\"Col\",propTypes:{xs:a.default.PropTypes.number,sm:a.default.PropTypes.number,md:a.default.PropTypes.number,lg:a.default.PropTypes.number,xsOffset:a.default.PropTypes.number,smOffset:a.default.PropTypes.number,mdOffset:a.default.PropTypes.number,lgOffset:a.default.PropTypes.number,xsPush:a.default.PropTypes.number,smPush:a.default.PropTypes.number,mdPush:a.default.PropTypes.number,lgPush:a.default.PropTypes.number,xsPull:a.default.PropTypes.number,smPull:a.default.PropTypes.number,mdPull:a.default.PropTypes.number,lgPull:a.default.PropTypes.number,componentClass:f.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass,t={};return Object.keys(c.default.SIZES).forEach(function(e){var n=c.default.SIZES[e],r=n,o=n+\"-\";this.props[r]&&(t[\"col-\"+o+this.props[r]]=!0),r=n+\"Offset\",o=n+\"-offset-\",this.props[r]>=0&&(t[\"col-\"+o+this.props[r]]=!0),r=n+\"Push\",o=n+\"-push-\",this.props[r]>=0&&(t[\"col-\"+o+this.props[r]]=!0),r=n+\"Pull\",o=n+\"-pull-\",this.props[r]>=0&&(t[\"col-\"+o+this.props[r]]=!0)},this),a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,t)}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(204),c=r(l),p=n(184),f=r(p),d=n(210),h=r(d),v=n(194),m=r(v),y=n(195),g=r(y),b=n(211),E=r(b),_=n(187),O=r(_),N=a.default.createClass({displayName:\"DropdownButton\",mixins:[f.default,h.default],propTypes:{pullRight:a.default.PropTypes.bool,dropup:a.default.PropTypes.bool,title:a.default.PropTypes.node,href:a.default.PropTypes.string,id:a.default.PropTypes.string,onClick:a.default.PropTypes.func,onSelect:a.default.PropTypes.func,navItem:a.default.PropTypes.bool,noCaret:a.default.PropTypes.bool,buttonClassName:a.default.PropTypes.string,className:a.default.PropTypes.string,children:a.default.PropTypes.node},render:function(){var e=this.props.navItem?\"renderNavItem\":\"renderButtonGroup\",t=this.props.noCaret?null:a.default.createElement(\"span\",{className:\"caret\"});return this[e]([a.default.createElement(m.default,o({},this.props,{ref:\"dropdownButton\",className:(0,u.default)(\"dropdown-toggle\",this.props.buttonClassName),onClick:(0,c.default)(this.props.onClick,this.handleDropdownClick),key:0,navDropdown:this.props.navItem,navItem:null,title:null,pullRight:null,dropup:null}),this.props.title,\" \",t),a.default.createElement(E.default,{ref:\"menu\",\"aria-labelledby\":this.props.id,pullRight:this.props.pullRight,key:1},O.default.map(this.props.children,this.renderMenuItem))])},renderButtonGroup:function(e){var t={open:this.state.open,dropup:this.props.dropup};return a.default.createElement(g.default,{bsSize:this.props.bsSize,className:(0,u.default)(this.props.className,t)},e)},renderNavItem:function(e){var t={dropdown:!0,open:this.state.open,dropup:this.props.dropup};return a.default.createElement(\"li\",{className:(0,u.default)(this.props.className,t)},e)},renderMenuItem:function(e,t){var n=this.props.onSelect||e.props.onSelect?this.handleOptionSelect:null;return(0,i.cloneElement)(e,{onSelect:(0,c.default)(e.props.onSelect,n),key:e.key?e.key:t})},handleDropdownClick:function(e){e.preventDefault(),this.setDropdownState(!this.state.open)},handleOptionSelect:function(e){this.props.onSelect&&this.props.onSelect(e),this.setDropdownState(!1)}});t.default=N,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),a=r(i),s=n(190),u=r(s),l=n(191),c=r(l),p={getInitialState:function(){return{open:!1}},setDropdownState:function(e,t){e?this.bindRootCloseHandlers():this.unbindRootCloseHandlers(),this.setState({open:e},t)},handleDocumentKeyUp:function(e){27===e.keyCode&&this.setDropdownState(!1)},handleDocumentClick:function(e){var t=e.target||e.srcElement;o(t,a.default.findDOMNode(this))||this.setDropdownState(!1)},bindRootCloseHandlers:function(){var e=u.default.ownerDocument(this);this._onDocumentClickListener=c.default.listen(e,\"click\",this.handleDocumentClick),this._onDocumentKeyupListener=c.default.listen(e,\"keyup\",this.handleDocumentKeyUp)},unbindRootCloseHandlers:function(){this._onDocumentClickListener&&this._onDocumentClickListener.remove(),this._onDocumentKeyupListener&&this._onDocumentKeyupListener.remove()},componentWillUnmount:function(){this.unbindRootCloseHandlers()}};t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(204),c=r(l),p=n(187),f=r(p),d=a.default.createClass({displayName:\"DropdownMenu\",propTypes:{pullRight:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func},render:function(){var e={\"dropdown-menu\":!0,\"dropdown-menu-right\":this.props.pullRight};return a.default.createElement(\"ul\",o({},this.props,{className:(0,u.default)(this.props.className,e),role:\"menu\"}),f.default.map(this.props.children,this.renderMenuItem))},renderMenuItem:function(e,t){return(0,i.cloneElement)(e,{onSelect:(0,c.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t})}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n=e.querySelectorAll(\".\"+t.join(\".\"));n=[].map.call(n,function(e){return e});for(var r=0;r<t.length;r++)if(!e.className.match(new RegExp(\"\\\\b\"+t[r]+\"\\\\b\")))return n;return n.unshift(e),n}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),a=r(i),s=n(190),u=r(s);t.default={_fadeIn:function(){var e=void 0;this.isMounted()&&(e=o(a.default.findDOMNode(this),[\"fade\"]),e.length&&e.forEach(function(e){e.className+=\" in\"}))},_fadeOut:function(){var e=o(this._fadeOutEl,[\"fade\",\"in\"]);e.length&&e.forEach(function(e){e.className=e.className.replace(/\\bin\\b/,\"\")}),setTimeout(this._handleFadeOutEnd,300)},_handleFadeOutEnd:function(){this._fadeOutEl&&this._fadeOutEl.parentNode&&this._fadeOutEl.parentNode.removeChild(this._fadeOutEl)},componentDidMount:function(){document.querySelectorAll&&setTimeout(this._fadeIn,20)},componentWillUnmount:function(){var e=o(a.default.findDOMNode(this),[\"fade\"]),t=this.props.container&&a.default.findDOMNode(this.props.container)||u.default.ownerDocument(this).body;e.length&&(this._fadeOutEl=document.createElement(\"div\"),t.appendChild(this._fadeOutEl),this._fadeOutEl.appendChild(a.default.findDOMNode(this).cloneNode(!0)),setTimeout(this._fadeOut,20))}},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(214),i=r(o);t.default={Static:i.default},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=n(198),d=r(f),h=n(199),v=r(h),m=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"getValue\",value:function(){var e=this.props,t=e.children,n=e.value;return t?t:n}},{key:\"renderInput\",value:function(){return l.default.createElement(\"p\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control-static\"),ref:\"input\",key:\"input\"}),this.getValue())}}]),t}(d.default);m.propTypes={value:v.default,children:v.default},t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(186),c=r(l),p=a.default.createClass({displayName:\"Grid\",propTypes:{fluid:a.default.PropTypes.bool,componentClass:c.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass,t=this.props.fluid?\"container-fluid\":\"container\";return a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,t)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},u=n(4),l=r(u),c=n(198),p=r(c),f=n(196),d=r(f),h=n(213),v=r(h),m=n(217),y=r(m),g=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),a(t,[{key:\"render\",value:function(){return d.default.types.indexOf(this.props.type)>-1?((0,y.default)(\"Input type=\"+this.props.type,\"ButtonInput\"),l.default.createElement(d.default,this.props)):\"static\"===this.props.type?((0,y.default)(\"Input type=static\",\"StaticText\"),l.default.createElement(v.default.Static,this.props)):s(Object.getPrototypeOf(t.prototype),\"render\",this).call(this)}}]),t}(p.default);t.default=g,e.exports=t.default},function(e,t,n){(function(n){\"use strict\";function r(e,t,r){if(\"production\"!==n.env.NODE_ENV){if(\"undefined\"==typeof console||\"function\"!=typeof console.warn)return;var o=\"\"+e+\" is deprecated. Use \"+t+\" instead.\";console.warn(o),r&&console.warn(\"You can read more about it at \"+r)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r,e.exports=t.default}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(187),u=r(s),l=/\\%\\((.+?)\\)s/,c=a.default.createClass({displayName:\"Interpolate\",propTypes:{component:a.default.PropTypes.node,format:a.default.PropTypes.string,unsafe:a.default.PropTypes.bool},getDefaultProps:function(){return{component:\"span\"}},render:function(){var e=u.default.hasValidComponent(this.props.children)||\"string\"==typeof this.props.children?this.props.children:this.props.format,t=this.props.component,n=this.props.unsafe===!0,r=o({},this.props);if(delete r.children,delete r.format,delete r.component,delete r.unsafe,n){var i=e.split(l).reduce(function(e,t,n){var o=void 0;if(n%2===0?o=t:(o=r[t],delete r[t]),a.default.isValidElement(o))throw new Error(\"cannot interpolate a React component into unsafe text\");return e+=o},\"\");return r.dangerouslySetInnerHTML={__html:i},a.default.createElement(t,r)}var s=e.split(l).reduce(function(e,t,n){var o=void 0;if(n%2===0){if(0===t.length)return e;o=t}else o=r[t],delete r[t];return e.push(o),e},[]);return a.default.createElement(t,r,s)}});t.default=c,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(186),c=r(l),p=a.default.createClass({displayName:\"Jumbotron\",propTypes:{componentClass:c.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass;return a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,\"jumbotron\")}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Label\",mixins:[c.default],getDefaultProps:function(){return{bsClass:\"label\",bsStyle:\"default\"}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"span\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=n(187),d=r(f),h=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){var e=this,t=d.default.map(this.props.children,function(e,t){return(0,u.cloneElement)(e,{key:e.key?e.key:t})}),n=!1;if(!this.props.children)return this.renderDiv(t);if(1!==l.default.Children.count(this.props.children)||Array.isArray(this.props.children))n=Array.prototype.some.call(this.props.children,function(t){return Array.isArray(t)?Array.prototype.some.call(t,function(t){return e.isAnchor(t.props)}):e.isAnchor(t.props)});else{var r=this.props.children;n=this.isAnchor(r.props)}return n?this.renderDiv(t):this.renderUL(t)}},{key:\"isAnchor\",value:function(e){return e.href||e.onClick}},{key:\"renderUL\",value:function(e){var t=d.default.map(e,function(e,t){return(0,u.cloneElement)(e,{listItem:!0})});return l.default.createElement(\"ul\",a({},this.props,{className:(0,p.default)(this.props.className,\"list-group\")}),t)}},{key:\"renderDiv\",value:function(e){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,\"list-group\")}),e)}}]),t}(l.default.Component);h.propTypes={className:l.default.PropTypes.string,id:l.default.PropTypes.string},t.default=h,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(184),u=r(s),l=n(183),c=r(l),p=a.default.createClass({displayName:\"ListGroupItem\",mixins:[u.default],propTypes:{bsStyle:a.default.PropTypes.oneOf([\"danger\",\"info\",\"success\",\"warning\"]),className:a.default.PropTypes.string,active:a.default.PropTypes.any,disabled:a.default.PropTypes.any,header:a.default.PropTypes.node,listItem:a.default.PropTypes.bool,onClick:a.default.PropTypes.func,eventKey:a.default.PropTypes.any,href:a.default.PropTypes.string,target:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"list-group-item\"}},render:function(){var e=this.getBsClassSet();return e.active=this.props.active,e.disabled=this.props.disabled,this.props.href||this.props.onClick?this.renderAnchor(e):this.props.listItem?this.renderLi(e):this.renderSpan(e)},renderLi:function(e){return a.default.createElement(\"li\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.header?this.renderStructuredContent():this.props.children)},renderAnchor:function(e){return a.default.createElement(\"a\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.header?this.renderStructuredContent():this.props.children)},renderSpan:function(e){return a.default.createElement(\"span\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.header?this.renderStructuredContent():this.props.children)},renderStructuredContent:function(){var e=void 0;e=a.default.isValidElement(this.props.header)?(0,i.cloneElement)(this.props.header,{key:\"header\",className:(0,c.default)(this.props.header.props.className,\"list-group-item-heading\")}):a.default.createElement(\"h4\",{key:\"header\",className:\"list-group-item-heading\"},this.props.header);var t=a.default.createElement(\"p\",{key:\"content\",className:\"list-group-item-text\"},this.props.children);return[e,t]}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"MenuItem\",propTypes:{header:a.default.PropTypes.bool,divider:a.default.PropTypes.bool,href:a.default.PropTypes.string,title:a.default.PropTypes.string,target:a.default.PropTypes.string,onSelect:a.default.PropTypes.func,eventKey:a.default.PropTypes.any,active:a.default.PropTypes.bool,disabled:a.default.PropTypes.bool},getDefaultProps:function(){return{href:\"#\",active:!1}},handleClick:function(e){return this.props.disabled?void e.preventDefault():void(this.props.onSelect&&(e.preventDefault(),this.props.onSelect(this.props.eventKey,this.props.href,this.props.target)))},renderAnchor:function(){return a.default.createElement(\"a\",{onClick:this.handleClick,href:this.props.href,target:this.props.target,title:this.props.title,tabIndex:\"-1\"},this.props.children)},render:function(){var e={\"dropdown-header\":this.props.header,divider:this.props.divider,active:this.props.active,disabled:this.props.disabled},t=null;return this.props.header?t=this.props.children:this.props.divider||(t=this.renderAnchor()),a.default.createElement(\"li\",o({},this.props,{role:\"presentation\",title:null,href:null,className:(0,u.default)(this.props.className,e)}),t)}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){var n=N.default.ownerDocument(t);return e===n.body||e===n.documentElement?n.documentElement.clientHeight:e.clientHeight}function a(e){return e.props.container&&d.default.findDOMNode(e.props.container)||N.default.ownerDocument(e).body}function s(e,t){return function(n,r,o){var i=t;return void 0===n[e]&&(i=i.isRequired),i(n,r,o)}}function u(e){var t=[];return d.default.Children.forEach(e,function(e){return t.push(e)}),t}function l(e,t){var n=N.default.ownerDocument(e),r=!n.addEventListener,o=void 0;return V&&V.remove(),r?(document.attachEvent(\"onfocusin\",t),o=function(){return document.detachEvent(\"onfocusin\",t)}):(document.addEventListener(\"focus\",t,!0),o=function(){return document.removeEventListener(\"focus\",t,!0)}),V={remove:o}}function c(){if(void 0!==F)return F;var e=document.createElement(\"div\");e.style.position=\"absolute\",e.style.top=\"-9999px\",e.style.width=\"50px\",e.style.height=\"50px\",e.style.overflow=\"scroll\",document.body.appendChild(e),F=e.offsetWidth-e.clientWidth,document.body.removeChild(e),e=null}Object.defineProperty(t,\"__esModule\",{value:!0});var p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f=n(4),d=r(f),h=n(183),v=r(h),m=n(204),y=r(m),g=n(184),b=r(g),E=n(212),_=r(E),O=n(190),N=r(O),w=n(191),C=r(w),P=n(217),x=r(P),T=n(225),D=r(T),M=n(227),S=r(M),k=n(228),I=r(k),R=n(229),A=r(R),j=n(230),L=r(j),V=void 0,F=void 0,U=d.default.createClass({\ndisplayName:\"ModalMarkup\",mixins:[b.default,_.default],propTypes:{title:d.default.PropTypes.node,backdrop:d.default.PropTypes.oneOf([\"static\",!0,!1]),keyboard:d.default.PropTypes.bool,closeButton:d.default.PropTypes.bool,animation:d.default.PropTypes.bool,onHide:s(\"onRequestHide\",d.default.PropTypes.func),onRequestHide:d.default.PropTypes.func,dialogClassName:d.default.PropTypes.string,autoFocus:d.default.PropTypes.bool,enforceFocus:d.default.PropTypes.bool},getDefaultProps:function(){return{bsClass:\"modal\",backdrop:!0,keyboard:!0,animation:!0,closeButton:!0,autoFocus:!0,enforceFocus:!0}},getInitialState:function(){return{}},render:function(){var e=this.state,t=p({},e.dialogStyles,{display:\"block\"}),n=this.getBsClassSet();delete n.modal,n[\"modal-dialog\"]=!0;var r={modal:!0,fade:this.props.animation,in:!this.props.animation},o=d.default.createElement(\"div\",p({},this.props,{title:null,tabIndex:\"-1\",role:\"dialog\",style:t,className:(0,v.default)(this.props.className,r),onClick:this.props.backdrop===!0?this.handleBackdropClick:null,ref:\"modal\"}),d.default.createElement(\"div\",{className:(0,v.default)(this.props.dialogClassName,n)},d.default.createElement(\"div\",{className:\"modal-content\",role:\"document\"},this.renderContent())));return this.props.backdrop?this.renderBackdrop(o,e.backdropStyles):o},renderContent:function(){var e=this,t=u(this.props.children),n=t.some(function(e){return e.type.__isModalHeader});return n||null==this.props.title||((0,x.default)(\"Specifying `closeButton` or `title` Modal props\",\"the new Modal.Header, and Modal.Title components\"),t.unshift(d.default.createElement(I.default,{closeButton:this.props.closeButton,onHide:this._getHide()},this.props.title&&d.default.createElement(A.default,null,this.props.title)))),d.default.Children.map(t,function(t){return t.type.__isModalHeader?(0,f.cloneElement)(t,{onHide:(0,y.default)(e._getHide(),t.props.onHide)}):t})},renderBackdrop:function(e){var t={\"modal-backdrop\":!0,fade:this.props.animation,in:!this.props.animation},n=this.props.backdrop===!0?this.handleBackdropClick:null;return d.default.createElement(\"div\",null,d.default.createElement(\"div\",{className:(0,v.default)(t),ref:\"backdrop\",onClick:n}),e)},_getHide:function(){return!this.props.onHide&&this.props.onRequestHide&&(0,x.default)(\"The Modal prop `onRequestHide`\",\"the `onHide` prop\"),this.props.onHide||this.props.onRequestHide},iosClickHack:function(){d.default.findDOMNode(this.refs.modal).onclick=function(){},d.default.findDOMNode(this.refs.backdrop).onclick=function(){}},componentWillMount:function(){this.checkForFocus()},componentDidMount:function(){var e=this,t=N.default.ownerDocument(this),n=N.default.ownerWindow(this);this._onDocumentKeyupListener=C.default.listen(t,\"keyup\",this.handleDocumentKeyUp),this._onWindowResizeListener=C.default.listen(n,\"resize\",this.handleWindowResize),this.props.enforceFocus&&(this._onFocusinListener=l(this,this.enforceFocus));var r=a(this);r.className+=r.className.length?\" modal-open\":\"modal-open\",this._containerIsOverflowing=r.scrollHeight>i(r,this),this._originalPadding=r.style.paddingRight,this._containerIsOverflowing&&(r.style.paddingRight=parseInt(this._originalPadding||0,10)+c()+\"px\"),this.props.backdrop&&this.iosClickHack(),this.setState(this._getStyles(),function(){return e.focusModalContent()})},componentDidUpdate:function(e){if(this.props.backdrop&&this.props.backdrop!==e.backdrop&&(this.iosClickHack(),this.setState(this._getStyles())),this.props.container!==e.container){var t=a(this);this._containerIsOverflowing=t.scrollHeight>i(t,this)}},componentWillUnmount:function(){this._onDocumentKeyupListener.remove(),this._onWindowResizeListener.remove(),this._onFocusinListener&&this._onFocusinListener.remove();var e=a(this);e.style.paddingRight=this._originalPadding,e.className=e.className.replace(/ ?modal-open/,\"\"),this.restoreLastFocus()},handleBackdropClick:function(e){e.target===e.currentTarget&&this._getHide()()},handleDocumentKeyUp:function(e){this.props.keyboard&&27===e.keyCode&&this._getHide()()},handleWindowResize:function(){this.setState(this._getStyles())},checkForFocus:function(){if(N.default.canUseDom)try{this.lastFocus=document.activeElement}catch(e){}},focusModalContent:function(){var e=d.default.findDOMNode(this.refs.modal),t=N.default.activeElement(this),n=t&&N.default.contains(e,t);this.props.autoFocus&&!n&&(this.lastFocus=t,e.focus())},restoreLastFocus:function(){this.lastFocus&&(this.lastFocus.focus(),this.lastFocus=null)},enforceFocus:function(){if(this.isMounted()){var e=N.default.activeElement(this),t=d.default.findDOMNode(this.refs.modal);t===e||N.default.contains(t,e)||t.focus()}},_getStyles:function(){if(!N.default.canUseDom)return{};var e=d.default.findDOMNode(this.refs.modal),t=e.scrollHeight,n=a(this),r=this._containerIsOverflowing,o=t>i(n,this);return{dialogStyles:{paddingRight:r&&!o?c():void 0,paddingLeft:!r&&o?c():void 0}}}}),B=d.default.createClass({displayName:\"Modal\",propTypes:p({},D.default.propTypes,U.propTypes),defaultProps:{show:null},render:function(){var e=this.props,t=e.show,n=o(e,[\"show\"]),r=d.default.createElement(U,n,this.props.children);return this.props.__isUsedInModalTrigger||null==t?r:d.default.createElement(D.default,{container:n.container},t&&r)}});B.Body=S.default,B.Header=I.default,B.Title=A.default,B.Footer=L.default,t.default=B,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(186),s=r(a),u=n(226),l=i.default.createClass({displayName:\"Portal\",propTypes:{container:s.default.mountable},mixins:[u.OverlayMixin],renderOverlay:function(){return this.props.children?i.default.Children.only(this.props.children):null},render:function(){return null}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(186),u=r(s),l=n(190),c=r(l),p=n(217),f=r(p),d={propTypes:{container:u.default.mountable},componentDidMount:function(){this._renderOverlay()},componentDidUpdate:function(){this._renderOverlay()},componentWillUnmount:function(){this._unrenderOverlay(),this._mountOverlayTarget()},_mountOverlayTarget:function(){this._overlayTarget||(this._overlayTarget=document.createElement(\"div\"),this.getContainerDOMNode().appendChild(this._overlayTarget))},_unmountOverlayTarget:function(){this._overlayTarget&&(this.getContainerDOMNode().removeChild(this._overlayTarget),this._overlayTarget=null)},_renderOverlay:function(){var e=this.renderOverlay();null!==e?(this._mountOverlayTarget(),this._overlayInstance=a.default.render(e,this._overlayTarget)):(this._unrenderOverlay(),this._unmountOverlayTarget())},_unrenderOverlay:function(){this._overlayTarget&&(a.default.unmountComponentAtNode(this._overlayTarget),this._overlayInstance=null)},getOverlayDOMNode:function(){if(!this.isMounted())throw new Error(\"getOverlayDOMNode(): A component must be mounted to have a DOM node.\");return this._overlayInstance?a.default.findDOMNode(this._overlayInstance):null},getContainerDOMNode:function(){return a.default.findDOMNode(this.props.container)||c.default.ownerDocument(this).body}};t.OverlayMixin=d,t.default=o({},d,{componentWillMount:function(){(0,f.default)(\"Overlay mixin\",\"the `<Portal/>` Component\",\"http://react-bootstrap.github.io/components.html#utilities-portal\")}})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,this.props.modalClassName)}),this.props.children)}}]),t}(l.default.Component);f.propTypes={modalClassName:l.default.PropTypes.string},f.defaultProps={modalClassName:\"modal-body\"},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,this.props.modalClassName)}),this.props.closeButton&&l.default.createElement(\"button\",{className:\"close\",\"aria-label\":this.props[\"aria-label\"]||\"Close\",onClick:this.props.onHide,style:{marginTop:-2}},l.default.createElement(\"span\",{\"aria-hidden\":\"true\"},\"×\")),this.props.children)}}]),t}(l.default.Component);f.__isModalHeader=!0,f.propTypes={modalClassName:l.default.PropTypes.string,closeButton:l.default.PropTypes.bool,onHide:l.default.PropTypes.func},f.defaultProps={modalClassName:\"modal-header\",closeButton:!1},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"h4\",a({},this.props,{className:(0,p.default)(this.props.className,\"modal-title\")}),this.props.children)}}]),t}(l.default.Component);f.propTypes={modalClassName:l.default.PropTypes.string},f.defaultProps={modalClassName:\"modal-title\"},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,this.props.modalClassName)}),this.props.children)}}]),t}(l.default.Component);f.propTypes={modalClassName:l.default.PropTypes.string},f.defaultProps={modalClassName:\"modal-footer\"},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(184),u=r(s),l=n(202),c=r(l),p=n(183),f=r(p),d=n(190),h=r(d),v=n(187),m=r(v),y=n(204),g=r(y),b=a.default.createClass({displayName:\"Nav\",mixins:[u.default,c.default],propTypes:{activeHref:a.default.PropTypes.string,activeKey:a.default.PropTypes.any,bsStyle:a.default.PropTypes.oneOf([\"tabs\",\"pills\"]),stacked:a.default.PropTypes.bool,justified:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,collapsible:a.default.PropTypes.bool,expanded:a.default.PropTypes.bool,navbar:a.default.PropTypes.bool,eventKey:a.default.PropTypes.any,pullRight:a.default.PropTypes.bool,right:a.default.PropTypes.bool},getDefaultProps:function(){return{bsClass:\"nav\"}},getCollapsibleDOMNode:function(){return a.default.findDOMNode(this)},getCollapsibleDimensionValue:function(){var e=a.default.findDOMNode(this.refs.ul),t=e.offsetHeight,n=h.default.getComputedStyles(e);return t+parseInt(n.marginTop,10)+parseInt(n.marginBottom,10)},render:function(){var e=this.props.collapsible?this.getCollapsibleClassSet(\"navbar-collapse\"):null;return this.props.navbar&&!this.props.collapsible?this.renderUl():a.default.createElement(\"nav\",o({},this.props,{className:(0,f.default)(this.props.className,e)}),this.renderUl())},renderUl:function(){var e=this.getBsClassSet();return e[\"nav-stacked\"]=this.props.stacked,e[\"nav-justified\"]=this.props.justified,e[\"navbar-nav\"]=this.props.navbar,e[\"pull-right\"]=this.props.pullRight,e[\"navbar-right\"]=this.props.right,a.default.createElement(\"ul\",o({},this.props,{role:\"tabs\"===this.props.bsStyle?\"tablist\":null,className:(0,f.default)(this.props.className,e),ref:\"ul\"}),m.default.map(this.props.children,this.renderNavItem))},getChildActiveProp:function(e){return!!e.props.active||(null!=this.props.activeKey&&e.props.eventKey===this.props.activeKey||(null!=this.props.activeHref&&e.props.href===this.props.activeHref||e.props.active))},renderNavItem:function(e,t){return(0,i.cloneElement)(e,{role:\"tabs\"===this.props.bsStyle?\"tab\":null,active:this.getChildActiveProp(e),activeKey:this.props.activeKey,activeHref:this.props.activeHref,onSelect:(0,g.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t,navItem:!0})}});t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(184),u=r(s),l=n(183),c=r(l),p=n(187),f=r(p),d=n(204),h=r(d),v=n(186),m=r(v),y=a.default.createClass({displayName:\"Navbar\",mixins:[u.default],propTypes:{fixedTop:a.default.PropTypes.bool,fixedBottom:a.default.PropTypes.bool,staticTop:a.default.PropTypes.bool,inverse:a.default.PropTypes.bool,fluid:a.default.PropTypes.bool,role:a.default.PropTypes.string,componentClass:m.default.elementType,brand:a.default.PropTypes.node,toggleButton:a.default.PropTypes.node,toggleNavKey:a.default.PropTypes.oneOfType([a.default.PropTypes.string,a.default.PropTypes.number]),onToggle:a.default.PropTypes.func,navExpanded:a.default.PropTypes.bool,defaultNavExpanded:a.default.PropTypes.bool},getDefaultProps:function(){return{bsClass:\"navbar\",bsStyle:\"default\",role:\"navigation\",componentClass:\"nav\"}},getInitialState:function(){return{navExpanded:this.props.defaultNavExpanded}},shouldComponentUpdate:function(){return!this._isChanging},handleToggle:function(){this.props.onToggle&&(this._isChanging=!0,this.props.onToggle(),this._isChanging=!1),this.setState({navExpanded:!this.state.navExpanded})},isNavExpanded:function(){return null!=this.props.navExpanded?this.props.navExpanded:this.state.navExpanded},render:function(){var e=this.getBsClassSet(),t=this.props.componentClass;return e[\"navbar-fixed-top\"]=this.props.fixedTop,e[\"navbar-fixed-bottom\"]=this.props.fixedBottom,e[\"navbar-static-top\"]=this.props.staticTop,e[\"navbar-inverse\"]=this.props.inverse,a.default.createElement(t,o({},this.props,{className:(0,c.default)(this.props.className,e)}),a.default.createElement(\"div\",{className:this.props.fluid?\"container-fluid\":\"container\"},this.props.brand||this.props.toggleButton||null!=this.props.toggleNavKey?this.renderHeader():null,f.default.map(this.props.children,this.renderChild)))},renderChild:function(e,t){return(0,i.cloneElement)(e,{navbar:!0,collapsible:null!=this.props.toggleNavKey&&this.props.toggleNavKey===e.props.eventKey,expanded:null!=this.props.toggleNavKey&&this.props.toggleNavKey===e.props.eventKey&&this.isNavExpanded(),key:e.key?e.key:t})},renderHeader:function(){var e=void 0;return this.props.brand&&(e=a.default.isValidElement(this.props.brand)?(0,i.cloneElement)(this.props.brand,{className:(0,c.default)(this.props.brand.props.className,\"navbar-brand\")}):a.default.createElement(\"span\",{className:\"navbar-brand\"},this.props.brand)),a.default.createElement(\"div\",{className:\"navbar-header\"},e,this.props.toggleButton||null!=this.props.toggleNavKey?this.renderToggleButton():null)},renderToggleButton:function(){var e=void 0;return a.default.isValidElement(this.props.toggleButton)?(0,i.cloneElement)(this.props.toggleButton,{className:(0,c.default)(this.props.toggleButton.props.className,\"navbar-toggle\"),onClick:(0,h.default)(this.handleToggle,this.props.toggleButton.props.onClick)}):(e=null!=this.props.toggleButton?this.props.toggleButton:[a.default.createElement(\"span\",{className:\"sr-only\",key:0},\"Toggle navigation\"),a.default.createElement(\"span\",{className:\"icon-bar\",key:1}),a.default.createElement(\"span\",{className:\"icon-bar\",key:2}),a.default.createElement(\"span\",{className:\"icon-bar\",key:3})],a.default.createElement(\"button\",{className:\"navbar-toggle\",type:\"button\",onClick:this.handleToggle},e))}});t.default=y,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(183),l=r(u),c=n(184),p=r(c),f=s.default.createClass({displayName:\"NavItem\",mixins:[p.default],propTypes:{linkId:s.default.PropTypes.string,onSelect:s.default.PropTypes.func,active:s.default.PropTypes.bool,disabled:s.default.PropTypes.bool,href:s.default.PropTypes.string,role:s.default.PropTypes.string,title:s.default.PropTypes.node,eventKey:s.default.PropTypes.any,target:s.default.PropTypes.string,\"aria-controls\":s.default.PropTypes.string},getDefaultProps:function(){return{href:\"#\"}},render:function(){var e=this.props,t=e.role,n=e.linkId,r=e.disabled,a=e.active,u=e.href,c=e.title,p=e.target,f=e.children,d=e[\"aria-controls\"],h=o(e,[\"role\",\"linkId\",\"disabled\",\"active\",\"href\",\"title\",\"target\",\"children\",\"aria-controls\"]),v={active:a,disabled:r},m={role:t,href:u,title:c,target:p,id:n,onClick:this.handleClick,ref:\"anchor\"};return t||\"#\"!==u||(m.role=\"button\"),s.default.createElement(\"li\",i({},h,{role:\"presentation\",className:(0,l.default)(h.className,v)}),s.default.createElement(\"a\",i({},m,{\"aria-selected\":a,\"aria-controls\":d}),f))},handleClick:function(e){this.props.onSelect&&(e.preventDefault(),this.props.disabled||this.props.onSelect(this.props.eventKey,this.props.href,this.props.target))}});t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return(0,c.default)(\"The Modal prop `onRequestHide`\",\"the `onHide` prop\"),e.apply(void 0,n)}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),a=r(i),s=n(186),u=r(s),l=n(217),c=r(l),p=n(204),f=r(p),d=n(235),h=r(d),v=n(226),m=a.default.createClass({displayName:\"ModalTrigger\",mixins:[v.OverlayMixin],propTypes:{modal:a.default.PropTypes.node.isRequired,container:u.default.mountable,onBlur:a.default.PropTypes.func,onFocus:a.default.PropTypes.func,onMouseOut:a.default.PropTypes.func,onMouseOver:a.default.PropTypes.func},getInitialState:function(){return{isOverlayShown:!1}},show:function(){this.setState({isOverlayShown:!0})},hide:function(){this.setState({isOverlayShown:!1})},toggle:function(){this.setState({isOverlayShown:!this.state.isOverlayShown})},renderOverlay:function(){var e=this.props.modal;return this.state.isOverlayShown?(0,i.cloneElement)(e,{onHide:this.hide,onRequestHide:o(this.hide),__isUsedInModalTrigger:!0}):a.default.createElement(\"span\",null)},render:function(){var e=a.default.Children.only(this.props.children),t={};return t.onClick=(0,f.default)(e.props.onClick,this.toggle),t.onMouseOver=(0,f.default)(e.props.onMouseOver,this.props.onMouseOver),t.onMouseOut=(0,f.default)(e.props.onMouseOut,this.props.onMouseOut),t.onFocus=(0,f.default)(e.props.onFocus,this.props.onFocus),t.onBlur=(0,f.default)(e.props.onBlur,this.props.onBlur),(0,i.cloneElement)(e,t)}});m.withContext=(0,h.default)(m,\"modal\");var y=a.default.createClass({displayName:\"DepreciatedModalTrigger\",componentWillMount:function(){(0,c.default)(\"The `ModalTrigger` component\",\"the `Modal` component directly\",\"http://react-bootstrap.github.io/components.html#modals\")},render:function(){return a.default.createElement(m,this.props)}});y.withContext=m.withContext,y.ModalTrigger=m,t.default=y,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}function s(e,t){return function(n){var r=function(e){function t(){i(this,t),null!=e&&e.apply(this,arguments)}return a(t,e),l(t,[{key:\"getChildContext\",value:function(){return this.props.context}},{key:\"render\",value:function(){var e=this.props,t=e.wrapped,n=(e.context,o(e,[\"wrapped\",\"context\"]));return p.default.cloneElement(t,n)}}]),t}(p.default.Component);r.childContextTypes=n;var s=function(){function n(){i(this,n)}return l(n,[{key:\"render\",value:function(){var n=u({},this.props);return n[t]=this.getWrappedOverlay(),p.default.createElement(e,n,this.props.children)}},{key:\"getWrappedOverlay\",value:function(){return p.default.createElement(r,{context:this.context,wrapped:this.props[t]})}}]),n}();return s.contextTypes=n,s}}Object.defineProperty(t,\"__esModule\",{value:!0});var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();t.default=s;var c=n(4),p=r(c);e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return Array.isArray(t)?t.indexOf(e)>=0:e===t}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(204),l=r(u),c=n(235),p=r(c),f=n(237),d=r(f),h=n(239),v=r(h),m=n(217),y=r(m),g=n(18),b=r(g),E=s.default.createClass({displayName:\"OverlayTrigger\",propTypes:i({},d.default.propTypes,{trigger:s.default.PropTypes.oneOfType([s.default.PropTypes.oneOf([\"manual\",\"click\",\"hover\",\"focus\"]),s.default.PropTypes.arrayOf(s.default.PropTypes.oneOf([\"click\",\"hover\",\"focus\"]))]),delay:s.default.PropTypes.number,delayShow:s.default.PropTypes.number,delayHide:s.default.PropTypes.number,defaultOverlayShown:s.default.PropTypes.bool,overlay:s.default.PropTypes.node.isRequired,onBlur:s.default.PropTypes.func,onClick:s.default.PropTypes.func,onFocus:s.default.PropTypes.func,onMouseEnter:s.default.PropTypes.func,onMouseLeave:s.default.PropTypes.func,target:function(){},onHide:function(){},show:function(){}}),getDefaultProps:function(){return{trigger:[\"hover\",\"focus\"]}},getInitialState:function(){return{isOverlayShown:null!=this.props.defaultOverlayShown&&this.props.defaultOverlayShown}},show:function(){this.setState({isOverlayShown:!0})},hide:function(){this.setState({isOverlayShown:!1})},toggle:function(){this.state.isOverlayShown?this.hide():this.show()},componentDidMount:function(){this._mountNode=document.createElement(\"div\"),s.default.render(this._overlay,this._mountNode)},componentWillUnmount:function(){s.default.unmountComponentAtNode(this._mountNode),this._mountNode=null,clearTimeout(this._hoverDelay)},componentDidUpdate:function(){s.default.render(this._overlay,this._mountNode)},getOverlay:function(){var e=this,t={show:this.state.isOverlayShown,onHide:this.hide,rootClose:this.props.rootClose,target:function(){return s.default.findDOMNode(e)},placement:this.props.placement,container:this.props.container,containerPadding:this.props.containerPadding},n=(0,a.cloneElement)(this.props.overlay,{placement:t.placement,container:t.container});return s.default.createElement(d.default,t,n)},render:function(){var e=s.default.Children.only(this.props.children),t={\"aria-describedby\":this.props.overlay.props.id};return this._overlay=this.getOverlay(),\"manual\"!==this.props.trigger?(t.onClick=(0,l.default)(e.props.onClick,this.props.onClick),o(\"click\",this.props.trigger)&&(t.onClick=(0,l.default)(this.toggle,t.onClick)),o(\"hover\",this.props.trigger)&&((0,b.default)(!(\"hover\"===this.props.trigger),'[react-bootstrap] Specifying only the `\"hover\"` trigger limits the visibilty of the overlay to just mouse users. Consider also including the `\"focus\"` trigger so that touch and keyboard only users can see the overlay as well.'),t.onMouseOver=(0,l.default)(this.handleDelayedShow,this.props.onMouseOver),t.onMouseOut=(0,l.default)(this.handleDelayedHide,this.props.onMouseOut)),o(\"focus\",this.props.trigger)&&(t.onFocus=(0,l.default)(this.handleDelayedShow,this.props.onFocus),t.onBlur=(0,l.default)(this.handleDelayedHide,this.props.onBlur))):(0,y.default)('\"manual\" trigger type',\" the Overlay component\"),(0,a.cloneElement)(e,t)},handleDelayedShow:function(){var e=this;if(null!=this._hoverDelay)return clearTimeout(this._hoverDelay),void(this._hoverDelay=null);var t=null!=this.props.delayShow?this.props.delayShow:this.props.delay;return t?void(this._hoverDelay=setTimeout(function(){e._hoverDelay=null,e.show()},t)):void this.show()},handleDelayedHide:function(){var e=this;if(null!=this._hoverDelay)return clearTimeout(this._hoverDelay),void(this._hoverDelay=null);var t=null!=this.props.delayHide?this.props.delayHide:this.props.delay;return t?void(this._hoverDelay=setTimeout(function(){e._hoverDelay=null,e.hide()},t)):void this.hide()},calcOverlayPosition:function(){var e=this.props.overlay;return(0,y.default)(\"OverlayTrigger.calcOverlayPosition()\",\"utils/overlayPositionUtils\"),v.default.calcOverlayPosition(e.props.placement||this.props.placement,s.default.findDOMNode(e),s.default.findDOMNode(this),s.default.findDOMNode(e.props.container||this.props.container),e.props.containerPadding||this.props.containerPadding)},getPosition:function(){(0,y.default)(\"OverlayTrigger.getPosition()\",\"utils/overlayPositionUtils\");var e=this.props.overlay;return v.default.getPosition(s.default.findDOMNode(this),s.default.findDOMNode(e.props.container||this.props.container))}});E.withContext=(0,p.default)(E,\"overlay\"),t.default=E,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},c=n(4),p=r(c),f=n(225),d=r(f),h=n(238),v=r(h),m=n(240),y=r(m),g=function(e){function t(e,n){i(this,t),l(Object.getPrototypeOf(t.prototype),\"constructor\",this).call(this,e,n)}return a(t,e),u(t,[{key:\"render\",value:function(){var e=this.props,t=e.container,n=e.containerPadding,r=e.target,i=e.placement,a=e.rootClose,s=o(e,[\"container\",\"containerPadding\",\"target\",\"placement\",\"rootClose\"]),u=p.default.createElement(v.default,{container:t,containerPadding:n,target:r,placement:i},this.props.children);return a&&(u=p.default.createElement(y.default,{onRootClose:this.props.onHide},u)),p.default.createElement(d.default,{container:t,rootClose:a,onRootClose:this.props.onHide},s.show&&u)}}]),t}(p.default.Component);g.propTypes=s({},d.default.propTypes,v.default.propTypes,{show:p.default.PropTypes.bool,rootClose:p.default.PropTypes.bool,onHide:p.default.PropTypes.func}),t.default=g,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\");\n}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},c=n(4),p=r(c),f=n(190),d=r(f),h=n(239),v=n(186),m=r(v),y=function(e){function t(e,n){i(this,t),l(Object.getPrototypeOf(t.prototype),\"constructor\",this).call(this,e,n),this.state={positionLeft:null,positionTop:null,arrowOffsetLeft:null,arrowOffsetTop:null}}return a(t,e),u(t,[{key:\"componentWillMount\",value:function(){this._needsFlush=!0}},{key:\"componentWillRecieveProps\",value:function(){this._needsFlush=!0}},{key:\"componentDidMount\",value:function(){this._maybeUpdatePosition()}},{key:\"componentDidUpate\",value:function(){this._maybeUpdatePosition()}},{key:\"render\",value:function(){var e=this.props,t=e.placement,n=e.children,r=this.props.target?this.state:{},i=r.positionLeft,a=r.positionTop,u=o(r,[\"positionLeft\",\"positionTop\"]);return(0,c.cloneElement)(p.default.Children.only(n),s({},u,{placement:t,positionTop:a,positionLeft:i,style:s({},n.props.style,{left:i,top:a})}))}},{key:\"_maybeUpdatePosition\",value:function(){this._needsFlush&&(this._needsFlush=!1,this._updatePosition())}},{key:\"_updatePosition\",value:function(){if(null!=this.props.target){var e=p.default.findDOMNode(this.props.target(this.props)),t=p.default.findDOMNode(this.props.container)||d.default.ownerDocument(this).body;this.setState((0,h.calcOverlayPosition)(this.props.placement,p.default.findDOMNode(this),e,t,this.props.containerPadding))}}}]),t}(p.default.Component);y.propTypes={target:p.default.PropTypes.func,container:m.default.mountable,containerPadding:p.default.PropTypes.number,placement:p.default.PropTypes.oneOf([\"top\",\"right\",\"bottom\",\"left\"])},y.defaultProps={containerPadding:0,placement:\"right\"},t.default=y,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n,r){var o=l.getContainerDimensions(n),i=o.scroll,a=o.height,s=e-r-i,u=e+r-i+t;return s<0?-s:u>a?a-u:0}function i(e,t,n,r){var o=l.getContainerDimensions(n),i=o.width,a=e-r,s=e+r+t;return a<0?-a:s>i?i-s:0}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(190),u=r(s),l={getContainerDimensions:function(e){var t=void 0,n=void 0,r=void 0;return\"BODY\"===e.tagName?(t=window.innerWidth,n=window.innerHeight,r=u.default.ownerDocument(e).documentElement.scrollTop||e.scrollTop):(t=e.offsetWidth,n=e.offsetHeight,r=e.scrollTop),{width:t,height:n,scroll:r}},getPosition:function(e,t){var n=\"BODY\"===t.tagName?u.default.getOffset(e):u.default.getPosition(e,t);return a({},n,{height:e.offsetHeight,width:e.offsetWidth})},calcOverlayPosition:function(e,t,n,r,a){var s=l.getPosition(n,r),u=t.offsetHeight,c=t.offsetWidth,p=void 0,f=void 0,d=void 0,h=void 0;if(\"left\"===e||\"right\"===e){f=s.top+(s.height-u)/2,p=\"left\"===e?s.left-c:s.left+s.width;var v=o(f,u,r,a);f+=v,h=50*(1-2*v/u)+\"%\",d=null}else{if(\"top\"!==e&&\"bottom\"!==e)throw new Error('calcOverlayPosition(): No such placement of \"'+e+'\" found.');p=s.left+(s.width-c)/2,f=\"top\"===e?s.top-u:s.top+s.height;var m=i(p,c,r,a);p+=m,d=50*(1-2*m/c)+\"%\",h=null}return{positionLeft:p,positionTop:f,arrowOffsetLeft:d,arrowOffsetTop:h}}};t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},u=n(4),l=r(u),c=n(190),p=r(c),f=n(191),d=r(f),h=function(e){function t(e){o(this,t),s(Object.getPrototypeOf(t.prototype),\"constructor\",this).call(this,e),this.handleDocumentClick=this.handleDocumentClick.bind(this),this.handleDocumentKeyUp=this.handleDocumentKeyUp.bind(this)}return i(t,e),a(t,[{key:\"bindRootCloseHandlers\",value:function(){var e=p.default.ownerDocument(this);this._onDocumentClickListener=d.default.listen(e,\"click\",this.handleDocumentClick),this._onDocumentKeyupListener=d.default.listen(e,\"keyup\",this.handleDocumentKeyUp)}},{key:\"handleDocumentClick\",value:function(e){var t=e.target||e.srcElement;p.default.contains(l.default.findDOMNode(this),t)||this.props.onRootClose()}},{key:\"handleDocumentKeyUp\",value:function(e){27===e.keyCode&&this.props.onRootClose()}},{key:\"unbindRootCloseHandlers\",value:function(){this._onDocumentClickListener&&this._onDocumentClickListener.remove(),this._onDocumentKeyupListener&&this._onDocumentKeyupListener.remove()}},{key:\"componentDidMount\",value:function(){this.bindRootCloseHandlers()}},{key:\"render\",value:function(){return l.default.Children.only(this.props.children)}},{key:\"componentWillUnmount\",value:function(){this.unbindRootCloseHandlers()}}]),t}(l.default.Component);t.default=h,h.propTypes={onRootClose:l.default.PropTypes.func.isRequired},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"PageHeader\",render:function(){return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,\"page-header\")}),a.default.createElement(\"h1\",null,this.props.children))}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(243),f=r(p),d=a.default.createClass({displayName:\"Pagination\",mixins:[c.default],propTypes:{activePage:a.default.PropTypes.number,items:a.default.PropTypes.number,maxButtons:a.default.PropTypes.number,ellipsis:a.default.PropTypes.bool,first:a.default.PropTypes.bool,last:a.default.PropTypes.bool,prev:a.default.PropTypes.bool,next:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func},getDefaultProps:function(){return{activePage:1,items:1,maxButtons:0,first:!1,last:!1,prev:!1,next:!1,ellipsis:!0,bsClass:\"pagination\"}},renderPageButtons:function(){var e=[],t=void 0,n=void 0,r=void 0,o=this.props,i=o.maxButtons,s=o.activePage,u=o.items,l=o.onSelect,c=o.ellipsis;if(i){var p=s-parseInt(i/2);t=p>1?p:1,r=t+i<=u,r?n=t+i-1:(n=u,t=u-i+1)}else t=1,n=u;for(var d=t;d<=n;d++)e.push(a.default.createElement(f.default,{key:d,eventKey:d,active:d===s,onSelect:l},d));return i&&r&&c&&e.push(a.default.createElement(f.default,{key:\"ellipsis\",disabled:!0},a.default.createElement(\"span\",{\"aria-label\":\"More\"},\"...\"))),e},renderPrev:function(){return this.props.prev?a.default.createElement(f.default,{key:\"prev\",eventKey:this.props.activePage-1,disabled:1===this.props.activePage,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"Previous\"},\"‹\")):null},renderNext:function(){return this.props.next?a.default.createElement(f.default,{key:\"next\",eventKey:this.props.activePage+1,disabled:this.props.activePage===this.props.items,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"Next\"},\"›\")):null},renderFirst:function(){return this.props.first?a.default.createElement(f.default,{key:\"first\",eventKey:1,disabled:1===this.props.activePage,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"First\"},\"«\")):null},renderLast:function(){return this.props.last?a.default.createElement(f.default,{key:\"last\",eventKey:this.props.items,disabled:this.props.activePage===this.props.items,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"Last\"},\"»\")):null},render:function(){return a.default.createElement(\"ul\",o({},this.props,{className:(0,u.default)(this.props.className,this.getBsClassSet())}),this.renderFirst(),this.renderPrev(),this.renderPageButtons(),this.renderNext(),this.renderLast())}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(183),s=r(a),u=n(184),l=r(u),c=n(244),p=r(c),f=i.default.createClass({displayName:\"PaginationButton\",mixins:[l.default],propTypes:{className:i.default.PropTypes.string,eventKey:i.default.PropTypes.oneOfType([i.default.PropTypes.string,i.default.PropTypes.number]),onSelect:i.default.PropTypes.func,disabled:i.default.PropTypes.bool,active:i.default.PropTypes.bool},getDefaultProps:function(){return{active:!1,disabled:!1}},handleClick:function(e){if(e.preventDefault(),this.props.onSelect){var t=(0,p.default)(this.props.eventKey);this.props.onSelect(e,t)}},render:function(){var e=this.getBsClassSet();return e.active=this.props.active,e.disabled=this.props.disabled,i.default.createElement(\"li\",{className:(0,s.default)(this.props.className,e)},i.default.createElement(\"a\",{href:\"#\",onClick:this.handleClick},this.props.children))}});t.default=f,e.exports=t.default},function(e,t){\"use strict\";function n(e){var t=!1;return{eventKey:e,preventSelection:function(){t=!0},isSelectionPrevented:function(){return t}}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(202),f=r(p),d=a.default.createClass({displayName:\"Panel\",mixins:[c.default,f.default],propTypes:{collapsible:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,header:a.default.PropTypes.node,id:a.default.PropTypes.string,footer:a.default.PropTypes.node,eventKey:a.default.PropTypes.any},getDefaultProps:function(){return{bsClass:\"panel\",bsStyle:\"default\"}},handleSelect:function(e){e.selected=!0,this.props.onSelect?this.props.onSelect(e,this.props.eventKey):e.preventDefault(),e.selected&&this.handleToggle()},handleToggle:function(){this.setState({expanded:!this.state.expanded})},getCollapsibleDimensionValue:function(){return a.default.findDOMNode(this.refs.panel).scrollHeight},getCollapsibleDOMNode:function(){return this.isMounted()&&this.refs&&this.refs.panel?a.default.findDOMNode(this.refs.panel):null},render:function(){return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,this.getBsClassSet()),id:this.props.collapsible?null:this.props.id,onSelect:null}),this.renderHeading(),this.props.collapsible?this.renderCollapsibleBody():this.renderBody(),this.renderFooter())},renderCollapsibleBody:function(){var e=this.prefixClass(\"collapse\");return a.default.createElement(\"div\",{className:(0,u.default)(this.getCollapsibleClassSet(e)),id:this.props.id,ref:\"panel\",\"aria-expanded\":this.isExpanded()?\"true\":\"false\"},this.renderBody())},renderBody:function(){function e(){return{key:u.length}}function t(t){u.push((0,i.cloneElement)(t,e()))}function n(t){u.push(a.default.createElement(\"div\",o({className:c},e()),t))}function r(){0!==l.length&&(n(l),l=[])}var s=this.props.children,u=[],l=[],c=this.prefixClass(\"body\");return Array.isArray(s)&&0!==s.length?(s.forEach(function(e){this.shouldRenderFill(e)?(r(),t(e)):l.push(e)}.bind(this)),r()):this.shouldRenderFill(s)?t(s):n(s),u},shouldRenderFill:function(e){return a.default.isValidElement(e)&&null!=e.props.fill},renderHeading:function(){var e=this.props.header;if(!e)return null;if(!a.default.isValidElement(e)||Array.isArray(e))e=this.props.collapsible?this.renderCollapsibleTitle(e):e;else{var t=(0,u.default)(this.prefixClass(\"title\"),e.props.className);e=this.props.collapsible?(0,i.cloneElement)(e,{className:t,children:this.renderAnchor(e.props.children)}):(0,i.cloneElement)(e,{className:t})}return a.default.createElement(\"div\",{className:this.prefixClass(\"heading\")},e)},renderAnchor:function(e){return a.default.createElement(\"a\",{href:\"#\"+(this.props.id||\"\"),\"aria-controls\":this.props.collapsible?this.props.id:null,className:this.isExpanded()?null:\"collapsed\",\"aria-expanded\":this.isExpanded()?\"true\":\"false\",onClick:this.handleSelect},e)},renderCollapsibleTitle:function(e){return a.default.createElement(\"h4\",{className:this.prefixClass(\"title\")},this.renderAnchor(e))},renderFooter:function(){return this.props.footer?a.default.createElement(\"div\",{className:this.prefixClass(\"footer\")},this.props.footer):null}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"PageItem\",propTypes:{href:a.default.PropTypes.string,target:a.default.PropTypes.string,title:a.default.PropTypes.string,disabled:a.default.PropTypes.bool,previous:a.default.PropTypes.bool,next:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,eventKey:a.default.PropTypes.any},getDefaultProps:function(){return{href:\"#\"}},render:function(){var e={disabled:this.props.disabled,previous:this.props.previous,next:this.props.next};return a.default.createElement(\"li\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"a\",{href:this.props.href,title:this.props.title,target:this.props.target,onClick:this.handleSelect,ref:\"anchor\"},this.props.children))},handleSelect:function(e){this.props.onSelect&&(e.preventDefault(),this.props.disabled||this.props.onSelect(this.props.eventKey,this.props.href,this.props.target))}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(187),c=r(l),p=n(204),f=r(p),d=a.default.createClass({displayName:\"Pager\",propTypes:{onSelect:a.default.PropTypes.func},render:function(){return a.default.createElement(\"ul\",o({},this.props,{className:(0,u.default)(this.props.className,\"pager\")}),c.default.map(this.props.children,this.renderPageItem))},renderPageItem:function(e,t){return(0,i.cloneElement)(e,{onSelect:(0,f.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t})}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0})}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(183),l=r(u),c=n(184),p=r(c),f=n(212),d=r(f),h=n(186),v=r(h),m=s.default.createClass({displayName:\"Popover\",mixins:[p.default,d.default],propTypes:{id:v.default.isRequiredForA11y(s.default.PropTypes.string),placement:s.default.PropTypes.oneOf([\"top\",\"right\",\"bottom\",\"left\"]),positionLeft:s.default.PropTypes.number,positionTop:s.default.PropTypes.number,arrowOffsetLeft:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),arrowOffsetTop:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),title:s.default.PropTypes.node,animation:s.default.PropTypes.bool},getDefaultProps:function(){return{placement:\"right\",animation:!0}},render:function(){var e,t=(e={popover:!0},o(e,this.props.placement,!0),o(e,\"in\",!this.props.animation&&(null!=this.props.positionLeft||null!=this.props.positionTop)),o(e,\"fade\",this.props.animation),e),n={left:this.props.positionLeft,top:this.props.positionTop,display:\"block\"},r={left:this.props.arrowOffsetLeft,top:this.props.arrowOffsetTop};return s.default.createElement(\"div\",i({role:\"tooltip\"},this.props,{className:(0,l.default)(this.props.className,t),style:n,title:null}),s.default.createElement(\"div\",{className:\"arrow\",style:r}),this.props.title?this.renderTitle():null,s.default.createElement(\"div\",{className:\"popover-content\"},this.props.children))},renderTitle:function(){return s.default.createElement(\"h3\",{className:\"popover-title\"},this.props.title)}});t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){if(e[t]){var r=function(){var r=void 0,o=void 0;return s.default.Children.forEach(e[t],function(e){e.type!==m&&(o=e.type.displayName?e.type.displayName:e.type,r=new Error(\"Children of \"+n+\" can contain only ProgressBar components. Found \"+o))}),{v:r}}();if(\"object\"==typeof r)return r.v}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(218),l=r(u),c=n(184),p=r(c),f=n(183),d=r(f),h=n(187),v=r(h),m=s.default.createClass({displayName:\"ProgressBar\",propTypes:{min:a.PropTypes.number,now:a.PropTypes.number,max:a.PropTypes.number,label:a.PropTypes.node,srOnly:a.PropTypes.bool,striped:a.PropTypes.bool,active:a.PropTypes.bool,children:o,className:s.default.PropTypes.string,interpolateClass:a.PropTypes.node,isChild:a.PropTypes.bool},mixins:[p.default],getDefaultProps:function(){return{bsClass:\"progress-bar\",min:0,max:100}},getPercentage:function(e,t,n){var r=1e3;return Math.round((e-t)/(n-t)*100*r)/r},render:function(){if(this.props.isChild)return this.renderProgressBar();var e={active:this.props.active,progress:!0,\"progress-striped\":this.props.active||this.props.striped},t=void 0;return t=this.props.children?v.default.map(this.props.children,this.renderChildBar):this.renderProgressBar(),s.default.createElement(\"div\",i({},this.props,{className:(0,d.default)(this.props.className,e)}),t)},renderChildBar:function(e,t){return(0,a.cloneElement)(e,{isChild:!0,key:e.key?e.key:t})},renderProgressBar:function(){var e=this.getPercentage(this.props.now,this.props.min,this.props.max),t=void 0;return t=\"string\"==typeof this.props.label?this.renderLabel(e):this.props.label,this.props.srOnly&&(t=s.default.createElement(\"span\",{className:\"sr-only\"},t)),s.default.createElement(\"div\",i({},this.props,{className:(0,d.default)(this.props.className,this.getBsClassSet()),role:\"progressbar\",style:{width:e+\"%\"},\"aria-valuenow\":this.props.now,\"aria-valuemin\":this.props.min,\"aria-valuemax\":this.props.max}),t)},renderLabel:function(e){var t=this.props.interpolateClass||l.default;return s.default.createElement(t,{now:this.props.now,min:this.props.min,max:this.props.max,percent:e,bsStyle:this.props.bsStyle},this.props.label)}});t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(186),c=r(l),p=a.default.createClass({displayName:\"Row\",propTypes:{componentClass:c.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass;return a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,\"row\")}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(210),f=r(p),d=n(194),h=r(d),v=n(195),m=r(v),y=n(211),g=r(y),b=a.default.createClass({displayName:\"SplitButton\",mixins:[c.default,f.default],propTypes:{pullRight:a.default.PropTypes.bool,title:a.default.PropTypes.node,href:a.default.PropTypes.string,id:a.default.PropTypes.string,target:a.default.PropTypes.string,dropdownTitle:a.default.PropTypes.node,dropup:a.default.PropTypes.bool,onClick:a.default.PropTypes.func,onSelect:a.default.PropTypes.func,disabled:a.default.PropTypes.bool,className:a.default.PropTypes.string,children:a.default.PropTypes.node},getDefaultProps:function(){return{dropdownTitle:\"Toggle dropdown\"}},render:function(){var e={open:this.state.open,dropup:this.props.dropup},t=a.default.createElement(h.default,o({},this.props,{ref:\"button\",onClick:this.handleButtonClick,title:null,id:null}),this.props.title),n=a.default.createElement(h.default,o({},this.props,{ref:\"dropdownButton\",className:(0,u.default)(this.props.className,\"dropdown-toggle\"),onClick:this.handleDropdownClick,title:null,href:null,target:null,id:null}),a.default.createElement(\"span\",{className:\"sr-only\"},this.props.dropdownTitle),a.default.createElement(\"span\",{className:\"caret\"}),a.default.createElement(\"span\",{style:{letterSpacing:\"-.3em\"}},\" \"));return a.default.createElement(m.default,{bsSize:this.props.bsSize,className:(0,u.default)(e),id:this.props.id},t,n,a.default.createElement(g.default,{ref:\"menu\",onSelect:this.handleOptionSelect,\"aria-labelledby\":this.props.id,pullRight:this.props.pullRight},this.props.children))},handleButtonClick:function(e){this.state.open&&this.setDropdownState(!1),this.props.onClick&&this.props.onClick(e,this.props.href,this.props.target)},handleDropdownClick:function(e){e.preventDefault(),this.setDropdownState(!this.state.open)},handleOptionSelect:function(e){this.props.onSelect&&this.props.onSelect(e),this.setDropdownState(!1)}});t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(187),c=r(l),p=n(204),f=r(p),d=n(184),h=r(d),v=a.default.createClass({displayName:\"SubNav\",mixins:[h.default],propTypes:{onSelect:a.default.PropTypes.func,active:a.default.PropTypes.bool,activeHref:a.default.PropTypes.string,activeKey:a.default.PropTypes.any,disabled:a.default.PropTypes.bool,eventKey:a.default.PropTypes.any,href:a.default.PropTypes.string,title:a.default.PropTypes.string,text:a.default.PropTypes.node,target:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"nav\"}},handleClick:function(e){this.props.onSelect&&(e.preventDefault(),this.props.disabled||this.props.onSelect(this.props.eventKey,this.props.href,this.props.target))},isActive:function(){return this.isChildActive(this)},isChildActive:function(e){if(e.props.active)return!0;if(null!=this.props.activeKey&&this.props.activeKey===e.props.eventKey)return!0;if(null!=this.props.activeHref&&this.props.activeHref===e.props.href)return!0;if(e.props.children){var t=!1;return c.default.forEach(e.props.children,function(e){this.isChildActive(e)&&(t=!0)},this),t}return!1},getChildActiveProp:function(e){return!!e.props.active||(null!=this.props.activeKey&&e.props.eventKey===this.props.activeKey||(null!=this.props.activeHref&&e.props.href===this.props.activeHref||e.props.active))},render:function(){var e={active:this.isActive(),disabled:this.props.disabled};return a.default.createElement(\"li\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"a\",{href:this.props.href,title:this.props.title,target:this.props.target,onClick:this.handleClick,ref:\"anchor\"},this.props.text),a.default.createElement(\"ul\",{className:\"nav\"},c.default.map(this.props.children,this.renderNavItem)))},renderNavItem:function(e,t){return(0,i.cloneElement)(e,{active:this.getChildActiveProp(e),onSelect:(0,f.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t})}});t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e){var t=void 0;return f.default.forEach(e,function(e){null==t&&(t=e.props.eventKey)}),t}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(4),u=r(s),l=n(184),c=r(l),p=n(187),f=r(p),d=n(231),h=r(d),v=n(233),m=r(v),y=function(e,t){return t.props.id?t.props.id:e.id&&e.id+\"___panel___\"+t.props.eventKey},g=function(e,t){return t.props.id?t.props.id+\"___tab\":e.id&&e.id+\"___tab___\"+t.props.eventKey},b=u.default.createClass({displayName:\"TabbedArea\",mixins:[c.default],propTypes:{activeKey:u.default.PropTypes.any,defaultActiveKey:u.default.PropTypes.any,bsStyle:u.default.PropTypes.oneOf([\"tabs\",\"pills\"]),animation:u.default.PropTypes.bool,id:u.default.PropTypes.string,onSelect:u.default.PropTypes.func},getDefaultProps:function(){return{bsStyle:\"tabs\",animation:!0}},getInitialState:function(){var e=null!=this.props.defaultActiveKey?this.props.defaultActiveKey:i(this.props.children);return{activeKey:e,previousActiveKey:null}},componentWillReceiveProps:function(e){null!=e.activeKey&&e.activeKey!==this.props.activeKey&&this.setState({previousActiveKey:this.props.activeKey})},handlePaneAnimateOutEnd:function(){this.setState({previousActiveKey:null})},render:function(){function e(e){return null!=e.props.tab?this.renderTab(e):null}var t=this.props,n=t.id,r=o(t,[\"id\"]),i=null!=this.props.activeKey?this.props.activeKey:this.state.activeKey,s=u.default.createElement(h.default,a({},r,{activeKey:i,onSelect:this.handleSelect,ref:\"tabs\"}),f.default.map(this.props.children,e,this));return u.default.createElement(\"div\",null,s,u.default.createElement(\"div\",{id:n,className:\"tab-content\",ref:\"panes\"},f.default.map(this.props.children,this.renderPane)))},getActiveKey:function(){return null!=this.props.activeKey?this.props.activeKey:this.state.activeKey},renderPane:function(e,t){var n=this.getActiveKey(),r=e.props.eventKey===n&&(null==this.state.previousActiveKey||!this.props.animation);return(0,s.cloneElement)(e,{active:r,id:y(this.props,e),\"aria-labelledby\":g(this.props,e),key:e.key?e.key:t,animation:this.props.animation,onAnimateOutEnd:null!=this.state.previousActiveKey&&e.props.eventKey===this.state.previousActiveKey?this.handlePaneAnimateOutEnd:null})},renderTab:function(e){var t=e.props,n=t.eventKey,r=t.className,o=t.tab,i=t.disabled;return u.default.createElement(m.default,{linkId:g(this.props,e),ref:\"tab\"+n,\"aria-controls\":y(this.props,e),eventKey:n,className:r,disabled:i},o)},shouldComponentUpdate:function(){return!this._isChanging},handleSelect:function(e){this.props.onSelect?(this._isChanging=!0,this.props.onSelect(e),this._isChanging=!1):e!==this.getActiveKey()&&this.setState({activeKey:e,previousActiveKey:this.getActiveKey()})}});t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"Table\",propTypes:{striped:a.default.PropTypes.bool,bordered:a.default.PropTypes.bool,condensed:a.default.PropTypes.bool,hover:a.default.PropTypes.bool,responsive:a.default.PropTypes.bool},render:function(){var e={table:!0,\"table-striped\":this.props.striped,\"table-bordered\":this.props.bordered,\"table-condensed\":this.props.condensed,\"table-hover\":this.props.hover},t=a.default.createElement(\"table\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children);return this.props.responsive?a.default.createElement(\"div\",{className:\"table-responsive\"},t):t}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(203),c=r(l),p=a.default.createClass({displayName:\"TabPane\",propTypes:{active:a.default.PropTypes.bool,animation:a.default.PropTypes.bool,onAnimateOutEnd:a.default.PropTypes.func,disabled:a.default.PropTypes.bool},getDefaultProps:function(){return{animation:!0}},getInitialState:function(){return{animateIn:!1,animateOut:!1}},componentWillReceiveProps:function(e){this.props.animation&&(this.state.animateIn||!e.active||this.props.active?this.state.animateOut||e.active||!this.props.active||this.setState({animateOut:!0}):this.setState({animateIn:!0}))},componentDidUpdate:function(){this.state.animateIn&&setTimeout(this.startAnimateIn,0),this.state.animateOut&&c.default.addEndEventListener(a.default.findDOMNode(this),this.stopAnimateOut)},startAnimateIn:function(){this.isMounted()&&this.setState({animateIn:!1})},stopAnimateOut:function(){this.isMounted()&&(this.setState({animateOut:!1}),this.props.onAnimateOutEnd&&this.props.onAnimateOutEnd())},render:function(){var e={\"tab-pane\":!0,fade:!0,active:this.props.active||this.state.animateOut,in:this.props.active&&!this.state.animateIn};return a.default.createElement(\"div\",o({},this.props,{role:\"tabpanel\",\"aria-hidden\":!this.props.active,className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);\n}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Thumbnail\",mixins:[c.default],propTypes:{alt:a.default.PropTypes.string,href:a.default.PropTypes.string,src:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"thumbnail\"}},render:function(){var e=this.getBsClassSet();return this.props.href?a.default.createElement(\"a\",o({},this.props,{href:this.props.href,className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt})):this.props.children?a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt}),a.default.createElement(\"div\",{className:\"caption\"},this.props.children)):a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt}))}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0})}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(183),l=r(u),c=n(184),p=r(c),f=n(212),d=r(f),h=n(186),v=r(h),m=s.default.createClass({displayName:\"Tooltip\",mixins:[p.default,d.default],propTypes:{id:v.default.isRequiredForA11y(s.default.PropTypes.string),placement:s.default.PropTypes.oneOf([\"top\",\"right\",\"bottom\",\"left\"]),positionLeft:s.default.PropTypes.number,positionTop:s.default.PropTypes.number,arrowOffsetLeft:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),arrowOffsetTop:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),title:s.default.PropTypes.node,animation:s.default.PropTypes.bool},getDefaultProps:function(){return{placement:\"right\",animation:!0}},render:function(){var e,t=(e={tooltip:!0},o(e,this.props.placement,!0),o(e,\"in\",!this.props.animation&&(null!=this.props.positionLeft||null!=this.props.positionTop)),o(e,\"fade\",this.props.animation),e),n={left:this.props.positionLeft,top:this.props.positionTop},r={left:this.props.arrowOffsetLeft,top:this.props.arrowOffsetTop};return s.default.createElement(\"div\",i({role:\"tooltip\"},this.props,{className:(0,l.default)(this.props.className,t),style:n}),s.default.createElement(\"div\",{className:\"tooltip-arrow\",style:r}),s.default.createElement(\"div\",{className:\"tooltip-inner\"},this.props.children))}});t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(199),i=r(o),a=n(204),s=r(a),u=n(186),l=r(u),c=n(190),p=r(c),f=n(187),d=r(f);t.default={childrenValueInputValidation:i.default,createChainedFunction:s.default,CustomPropTypes:l.default,domUtils:p.default,ValidComponentChildren:d.default},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Well\",mixins:[c.default],getDefaultProps:function(){return{bsClass:\"well\"}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),n(261);var r=n(160),o=n(1),i=o.FancyWebSocket,a=n(451),s=r.createActions([\"update\",\"reconnect\"]);t.Actions=s;var u=r.createStore({init:function(){this.status=\"offline\",this.listenToMany(s),this.listenTo(a.store,this.onJobListChanged)},getInitialState:function(){return this.status},onJobListChanged:function(e){e.some(function(e){return\"crawling\"==e.status})?(this.status=\"crawling\",this.trigger(this.status)):\"crawling\"==this.status&&(this.status=\"online\",this.trigger(this.status))},onUpdate:function(e){this.status=e,this.trigger(e)},onReconnect:function(){l.reconnect()}});t.store=u;var l=i.instance();l.on(\"open\",function(){s.update(\"online\")}),l.on(\"close\",function(){s.update(\"offline\")})},function(e,t,n){e.exports=n(262)},function(e,t,n){(function(e){\"use strict\";if(n(263),n(450),e._babelPolyfill)throw new Error(\"only one instance of babel/polyfill is allowed\");e._babelPolyfill=!0}).call(t,function(){return this}())},function(e,t,n){n(264),n(297),n(303),n(305),n(307),n(309),n(311),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),n(323),n(324),n(327),n(328),n(329),n(331),n(332),n(333),n(334),n(335),n(336),n(337),n(339),n(340),n(341),n(343),n(344),n(345),n(347),n(348),n(349),n(350),n(351),n(352),n(353),n(354),n(355),n(356),n(357),n(358),n(359),n(360),n(365),n(366),n(370),n(371),n(373),n(374),n(379),n(380),n(383),n(385),n(387),n(389),n(390),n(391),n(393),n(394),n(396),n(397),n(398),n(399),n(406),n(409),n(410),n(412),n(413),n(414),n(415),n(416),n(417),n(418),n(419),n(420),n(421),n(422),n(423),n(425),n(426),n(427),n(428),n(429),n(430),n(432),n(433),n(434),n(435),n(437),n(438),n(440),n(441),n(443),n(444),n(445),n(448),n(449),e.exports=n(268)},function(e,t,n){\"use strict\";var r,o=n(265),i=n(266),a=n(271),s=n(270),u=n(277),l=n(278),c=n(280),p=n(281),f=n(282),d=n(272),h=n(283),v=n(276),m=n(279),y=n(284),g=n(286),b=n(288),E=n(289),_=n(290),O=n(287),N=n(274)(\"__proto__\"),w=n(291),C=n(296)(!1),P=Object.prototype,x=Array.prototype,T=x.slice,D=x.join,M=o.setDesc,S=o.getDesc,k=o.setDescs,I={};a||(r=!d(function(){return 7!=M(l(\"div\"),\"a\",{get:function(){return 7}}).a}),o.setDesc=function(e,t,n){if(r)try{return M(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported!\");return\"value\"in n&&(h(e)[t]=n.value),e},o.getDesc=function(e,t){if(r)try{return S(e,t)}catch(e){}if(c(e,t))return s(!P.propertyIsEnumerable.call(e,t),e[t])},o.setDescs=k=function(e,t){h(e);for(var n,r=o.getKeys(t),i=r.length,a=0;i>a;)o.setDesc(e,n=r[a++],t[n]);return e}),i(i.S+i.F*!a,\"Object\",{getOwnPropertyDescriptor:o.getDesc,defineProperty:o.setDesc,defineProperties:k});var R=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\"),A=R.concat(\"length\",\"prototype\"),j=R.length,L=function(){var e,t=l(\"iframe\"),n=j,r=\">\";for(t.style.display=\"none\",u.appendChild(t),t.src=\"javascript:\",e=t.contentWindow.document,e.open(),e.write(\"<script>document.F=Object</script\"+r),e.close(),L=e.F;n--;)delete L.prototype[R[n]];return L()},V=function(e,t){return function(n){var r,o=g(n),i=0,a=[];for(r in o)r!=N&&c(o,r)&&a.push(r);for(;t>i;)c(o,r=e[i++])&&(~C(a,r)||a.push(r));return a}},F=function(){};i(i.S,\"Object\",{getPrototypeOf:o.getProto=o.getProto||function(e){return e=y(e),c(e,N)?e[N]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?P:null},getOwnPropertyNames:o.getNames=o.getNames||V(A,A.length,!0),create:o.create=o.create||function(e,t){var n;return null!==e?(F.prototype=h(e),n=new F,F.prototype=null,n[N]=e):n=L(),void 0===t?n:k(n,t)},keys:o.getKeys=o.getKeys||V(R,j,!1)});var U=function(e,t,n){if(!(t in I)){for(var r=[],o=0;o<t;o++)r[o]=\"a[\"+o+\"]\";I[t]=Function(\"F,a\",\"return new F(\"+r.join(\",\")+\")\")}return I[t](e,n)};i(i.P,\"Function\",{bind:function(e){var t=v(this),n=T.call(arguments,1),r=function(){var o=n.concat(T.call(arguments));return this instanceof r?U(t,o.length,o):f(t,o,e)};return m(t.prototype)&&(r.prototype=t.prototype),r}}),i(i.P+i.F*d(function(){u&&T.call(u)}),\"Array\",{slice:function(e,t){var n=_(this.length),r=p(this);if(t=void 0===t?n:t,\"Array\"==r)return T.call(this,e,t);for(var o=E(e,n),i=E(t,n),a=_(i-o),s=Array(a),u=0;u<a;u++)s[u]=\"String\"==r?this.charAt(o+u):this[o+u];return s}}),i(i.P+i.F*(O!=Object),\"Array\",{join:function(e){return D.call(O(this),void 0===e?\",\":e)}}),i(i.S,\"Array\",{isArray:n(293)});var B=function(e){return function(t,n){v(t);var r=O(this),o=_(r.length),i=e?o-1:0,a=e?-1:1;if(arguments.length<2)for(;;){if(i in r){n=r[i],i+=a;break}if(i+=a,e?i<0:o<=i)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?i>=0:o>i;i+=a)i in r&&(n=t(n,r[i],i,this));return n}},K=function(e){return function(t){return e(this,t,arguments[1])}};i(i.P,\"Array\",{forEach:o.each=o.each||K(w(0)),map:K(w(1)),filter:K(w(2)),some:K(w(3)),every:K(w(4)),reduce:B(!1),reduceRight:B(!0),indexOf:K(C),lastIndexOf:function(e,t){var n=g(this),r=_(n.length),o=r-1;for(arguments.length>1&&(o=Math.min(o,b(t))),o<0&&(o=_(r+o));o>=0;o--)if(o in n&&n[o]===e)return o;return-1}}),i(i.S,\"Date\",{now:function(){return+new Date}});var W=function(e){return e>9?e:\"0\"+e};i(i.P+i.F*(d(function(){return\"0385-07-25T07:06:39.999Z\"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),\"Date\",{toISOString:function(){if(!isFinite(this))throw RangeError(\"Invalid time value\");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),r=t<0?\"-\":t>9999?\"+\":\"\";return r+(\"00000\"+Math.abs(t)).slice(r?-6:-4)+\"-\"+W(e.getUTCMonth()+1)+\"-\"+W(e.getUTCDate())+\"T\"+W(e.getUTCHours())+\":\"+W(e.getUTCMinutes())+\":\"+W(e.getUTCSeconds())+\".\"+(n>99?n:\"0\"+W(n))+\"Z\"}})},function(e,t){var n=Object;e.exports={create:n.create,getProto:n.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:n.getOwnPropertyDescriptor,setDesc:n.defineProperty,setDescs:n.defineProperties,getKeys:n.keys,getNames:n.getOwnPropertyNames,getSymbols:n.getOwnPropertySymbols,each:[].forEach}},function(e,t,n){var r=n(267),o=n(268),i=n(269),a=n(273),s=n(275),u=\"prototype\",l=function(e,t,n){var c,p,f,d,h=e&l.F,v=e&l.G,m=e&l.S,y=e&l.P,g=e&l.B,b=v?r:m?r[t]||(r[t]={}):(r[t]||{})[u],E=v?o:o[t]||(o[t]={}),_=E[u]||(E[u]={});v&&(n=t);for(c in n)p=!h&&b&&c in b,f=(p?b:n)[c],d=g&&p?s(f,r):y&&\"function\"==typeof f?s(Function.call,f):f,b&&!p&&a(b,c,f),E[c]!=f&&i(E,c,d),y&&_[c]!=f&&(_[c]=f)};r.core=o,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,e.exports=l},function(e,t){var n=e.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=n)},function(e,t){var n=e.exports={version:\"1.2.6\"};\"number\"==typeof __e&&(__e=n)},function(e,t,n){var r=n(265),o=n(270);e.exports=n(271)?function(e,t,n){return r.setDesc(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){e.exports=!n(272)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(267),o=n(269),i=n(274)(\"src\"),a=\"toString\",s=Function[a],u=(\"\"+s).split(a);n(268).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,a){\"function\"==typeof n&&(n.hasOwnProperty(i)||o(n,i,e[t]?\"\"+e[t]:u.join(String(t))),n.hasOwnProperty(\"name\")||o(n,\"name\",t)),e===r?e[t]=n:(a||delete e[t],o(e,t,n))})(Function.prototype,a,function(){return\"function\"==typeof this&&this[i]||s.call(this)})},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\".concat(void 0===e?\"\":e,\")_\",(++n+r).toString(36))}},function(e,t,n){var r=n(276);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function!\");return e}},function(e,t,n){e.exports=n(267).document&&document.documentElement},function(e,t,n){var r=n(279),o=n(267).document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)}},function(e,t,n){var r=n(279);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},function(e,t,n){var r=n(285);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError(\"Can't call method on  \"+e);return e}},function(e,t,n){var r=n(287),o=n(285);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(281);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==r(e)?e.split(\"\"):Object(e)}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(288),o=Math.max,i=Math.min;e.exports=function(e,t){return e=r(e),e<0?o(e+t,0):i(e,t)}},function(e,t,n){var r=n(288),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){var r=n(275),o=n(287),i=n(284),a=n(290),s=n(292);e.exports=function(e){var t=1==e,n=2==e,u=3==e,l=4==e,c=6==e,p=5==e||c;return function(f,d,h){for(var v,m,y=i(f),g=o(y),b=r(d,h,3),E=a(g.length),_=0,O=t?s(f,E):n?s(f,0):void 0;E>_;_++)if((p||_ in g)&&(v=g[_],m=b(v,_,y),e))if(t)O[_]=m;else if(m)switch(e){case 3:return!0;case 5:return v;case 6:return _;case 2:O.push(v)}else if(l)return!1;return c?-1:u||l?l:O}}},function(e,t,n){var r=n(279),o=n(293),i=n(294)(\"species\");e.exports=function(e,t){var n;return o(e)&&(n=e.constructor,\"function\"!=typeof n||n!==Array&&!o(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(t)}},function(e,t,n){var r=n(281);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){var r=n(295)(\"wks\"),o=n(274),i=n(267).Symbol;e.exports=function(e){return r[e]||(r[e]=i&&i[e]||(i||o)(\"Symbol.\"+e))}},function(e,t,n){var r=n(267),o=\"__core-js_shared__\",i=r[o]||(r[o]={});e.exports=function(e){return i[e]||(i[e]={})}},function(e,t,n){var r=n(286),o=n(290),i=n(289);e.exports=function(e){return function(t,n,a){var s,u=r(t),l=o(u.length),c=i(a,l);if(e&&n!=n){for(;l>c;)if(s=u[c++],s!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===n)return e||c;return!e&&-1}}},function(e,t,n){\"use strict\";var r=n(265),o=n(267),i=n(280),a=n(271),s=n(266),u=n(273),l=n(272),c=n(295),p=n(298),f=n(274),d=n(294),h=n(299),v=n(300),m=n(301),y=n(293),g=n(283),b=n(286),E=n(270),_=r.getDesc,O=r.setDesc,N=r.create,w=v.get,C=o.Symbol,P=o.JSON,x=P&&P.stringify,T=!1,D=d(\"_hidden\"),M=r.isEnum,S=c(\"symbol-registry\"),k=c(\"symbols\"),I=\"function\"==typeof C,R=Object.prototype,A=a&&l(function(){return 7!=N(O({},\"a\",{get:function(){return O(this,\"a\",{value:7}).a}})).a})?function(e,t,n){var r=_(R,t);r&&delete R[t],O(e,t,n),r&&e!==R&&O(R,t,r)}:O,j=function(e){var t=k[e]=N(C.prototype);return t._k=e,a&&T&&A(R,e,{configurable:!0,set:function(t){i(this,D)&&i(this[D],e)&&(this[D][e]=!1),A(this,e,E(1,t))}}),t},L=function(e){return\"symbol\"==typeof e},V=function(e,t,n){return n&&i(k,t)?(n.enumerable?(i(e,D)&&e[D][t]&&(e[D][t]=!1),n=N(n,{enumerable:E(0,!1)})):(i(e,D)||O(e,D,E(1,{})),e[D][t]=!0),A(e,t,n)):O(e,t,n)},F=function(e,t){g(e);for(var n,r=m(t=b(t)),o=0,i=r.length;i>o;)V(e,n=r[o++],t[n]);return e},U=function(e,t){return void 0===t?N(e):F(N(e),t)},B=function(e){var t=M.call(this,e);return!(t||!i(this,e)||!i(k,e)||i(this,D)&&this[D][e])||t},K=function(e,t){var n=_(e=b(e),t);return!n||!i(k,t)||i(e,D)&&e[D][t]||(n.enumerable=!0),n},W=function(e){for(var t,n=w(b(e)),r=[],o=0;n.length>o;)i(k,t=n[o++])||t==D||r.push(t);return r},H=function(e){for(var t,n=w(b(e)),r=[],o=0;n.length>o;)i(k,t=n[o++])&&r.push(k[t]);return r},q=function(e){if(void 0!==e&&!L(e)){for(var t,n,r=[e],o=1,i=arguments;i.length>o;)r.push(i[o++]);return t=r[1],\"function\"==typeof t&&(n=t),!n&&y(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!L(t))return t}),r[1]=t,x.apply(P,r)}},z=l(function(){var e=C();return\"[null]\"!=x([e])||\"{}\"!=x({a:e})||\"{}\"!=x(Object(e))});I||(C=function(){if(L(this))throw TypeError(\"Symbol is not a constructor\");return j(f(arguments.length>0?arguments[0]:void 0))},u(C.prototype,\"toString\",function(){return this._k}),L=function(e){return e instanceof C},r.create=U,r.isEnum=B,r.getDesc=K,r.setDesc=V,r.setDescs=F,r.getNames=v.get=W,r.getSymbols=H,a&&!n(302)&&u(R,\"propertyIsEnumerable\",B,!0));var Y={for:function(e){return i(S,e+=\"\")?S[e]:S[e]=C(e)},keyFor:function(e){return h(S,e)},useSetter:function(){T=!0},useSimple:function(){T=!1}};r.each.call(\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),function(e){var t=d(e);Y[e]=I?t:j(t)}),T=!0,s(s.G+s.W,{Symbol:C}),s(s.S,\"Symbol\",Y),s(s.S+s.F*!I,\"Object\",{create:U,defineProperty:V,defineProperties:F,getOwnPropertyDescriptor:K,getOwnPropertyNames:W,getOwnPropertySymbols:H}),P&&s(s.S+s.F*(!I||z),\"JSON\",{stringify:q}),p(C,\"Symbol\"),p(Math,\"Math\",!0),p(o.JSON,\"JSON\",!0)},function(e,t,n){var r=n(265).setDesc,o=n(280),i=n(294)(\"toStringTag\");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(265),o=n(286);e.exports=function(e,t){for(var n,i=o(e),a=r.getKeys(i),s=a.length,u=0;s>u;)if(i[n=a[u++]]===t)return n}},function(e,t,n){var r=n(286),o=n(265).getNames,i={}.toString,a=\"object\"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return o(e)}catch(e){return a.slice()}};e.exports.get=function(e){return a&&\"[object Window]\"==i.call(e)?s(e):o(r(e))}},function(e,t,n){var r=n(265);e.exports=function(e){var t=r.getKeys(e),n=r.getSymbols;if(n)for(var o,i=n(e),a=r.isEnum,s=0;i.length>s;)a.call(e,o=i[s++])&&t.push(o);return t}},function(e,t){e.exports=!1},function(e,t,n){var r=n(266);r(r.S+r.F,\"Object\",{assign:n(304)})},function(e,t,n){var r=n(265),o=n(284),i=n(287);e.exports=n(272)(function(){var e=Object.assign,t={},n={},r=Symbol(),o=\"abcdefghijklmnopqrst\";return t[r]=7,o.split(\"\").forEach(function(e){n[e]=e}),7!=e({},t)[r]||Object.keys(e({},n)).join(\"\")!=o})?function(e,t){for(var n=o(e),a=arguments,s=a.length,u=1,l=r.getKeys,c=r.getSymbols,p=r.isEnum;s>u;)for(var f,d=i(a[u++]),h=c?l(d).concat(c(d)):l(d),v=h.length,m=0;v>m;)p.call(d,f=h[m++])&&(n[f]=d[f]);return n}:Object.assign},function(e,t,n){var r=n(266);r(r.S,\"Object\",{is:n(306)})},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e===1/t:e!=e&&t!=t}},function(e,t,n){var r=n(266);r(r.S,\"Object\",{setPrototypeOf:n(308).set})},function(e,t,n){var r=n(265).getDesc,o=n(279),i=n(283),a=function(e,t){if(i(e),!o(t)&&null!==t)throw TypeError(t+\": can't set as prototype!\")};e.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(e,t,o){try{o=n(275)(Function.call,r(Object.prototype,\"__proto__\").set,2),o(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:o(e,n),e}}({},!1):void 0),check:a}},function(e,t,n){\"use strict\";var r=n(310),o={};o[n(294)(\"toStringTag\")]=\"z\",o+\"\"!=\"[object z]\"&&n(273)(Object.prototype,\"toString\",function(){return\"[object \"+r(this)+\"]\"},!0)},function(e,t,n){var r=n(281),o=n(294)(\"toStringTag\"),i=\"Arguments\"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=(t=Object(e))[o])?n:i?r(t):\"Object\"==(a=r(t))&&\"function\"==typeof t.callee?\"Arguments\":a}},function(e,t,n){var r=n(279);n(312)(\"freeze\",function(e){return function(t){return e&&r(t)?e(t):t}})},function(e,t,n){var r=n(266),o=n(268),i=n(272);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*i(function(){n(1)}),\"Object\",a)}},function(e,t,n){var r=n(279);n(312)(\"seal\",function(e){return function(t){return e&&r(t)?e(t):t}})},function(e,t,n){var r=n(279);n(312)(\"preventExtensions\",function(e){return function(t){return e&&r(t)?e(t):t}})},function(e,t,n){var r=n(279);n(312)(\"isFrozen\",function(e){return function(t){return!r(t)||!!e&&e(t)}})},function(e,t,n){var r=n(279);n(312)(\"isSealed\",function(e){return function(t){return!r(t)||!!e&&e(t)}})},function(e,t,n){var r=n(279);n(312)(\"isExtensible\",function(e){return function(t){return!!r(t)&&(!e||e(t))}})},function(e,t,n){var r=n(286);n(312)(\"getOwnPropertyDescriptor\",function(e){return function(t,n){return e(r(t),n)}})},function(e,t,n){var r=n(284);n(312)(\"getPrototypeOf\",function(e){return function(t){return e(r(t))}})},function(e,t,n){var r=n(284);n(312)(\"keys\",function(e){return function(t){return e(r(t))}})},function(e,t,n){n(312)(\"getOwnPropertyNames\",function(){return n(300).get})},function(e,t,n){var r=n(265).setDesc,o=n(270),i=n(280),a=Function.prototype,s=/^\\s*function ([^ (]*)/,u=\"name\";u in a||n(271)&&r(a,u,{configurable:!0,get:function(){var e=(\"\"+this).match(s),t=e?e[1]:\"\";return i(this,u)||r(this,u,o(5,t)),t}})},function(e,t,n){\"use strict\";var r=n(265),o=n(279),i=n(294)(\"hasInstance\"),a=Function.prototype;i in a||r.setDesc(a,i,{value:function(e){if(\"function\"!=typeof this||!o(e))return!1;if(!o(this.prototype))return e instanceof this;for(;e=r.getProto(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){\"use strict\";var r=n(265),o=n(267),i=n(280),a=n(281),s=n(325),u=n(272),l=n(326).trim,c=\"Number\",p=o[c],f=p,d=p.prototype,h=a(r.create(d))==c,v=\"trim\"in String.prototype,m=function(e){var t=s(e,!1);if(\"string\"==typeof t&&t.length>2){t=v?t.trim():l(t,3);var n,r,o,i=t.charCodeAt(0);if(43===i||45===i){if(n=t.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(t.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+t}for(var a,u=t.slice(2),c=0,p=u.length;c<p;c++)if(a=u.charCodeAt(c),a<48||a>o)return NaN;return parseInt(u,r)}}return+t};p(\" 0o1\")&&p(\"0b1\")&&!p(\"+0x1\")||(p=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof p&&(h?u(function(){d.valueOf.call(n)}):a(n)!=c)?new f(m(t)):m(t)},r.each.call(n(271)?r.getNames(f):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger\".split(\",\"),function(e){i(f,e)&&!i(p,e)&&r.setDesc(p,e,r.getDesc(f,e))}),p.prototype=d,d.constructor=p,n(273)(o,c,p))},function(e,t,n){var r=n(279);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if(\"function\"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t,n){var r=n(266),o=n(285),i=n(272),a=\"\\t\\n\\v\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\",s=\"[\"+a+\"]\",u=\"​\",l=RegExp(\"^\"+s+s+\"*\"),c=RegExp(s+s+\"*$\"),p=function(e,t){var n={};n[e]=t(f),r(r.P+r.F*i(function(){return!!a[e]()||u[e]()!=u}),\"String\",n)},f=p.trim=function(e,t){return e=String(o(e)),1&t&&(e=e.replace(l,\"\")),2&t&&(e=e.replace(c,\"\")),e};e.exports=p},function(e,t,n){var r=n(266);r(r.S,\"Number\",{EPSILON:Math.pow(2,-52)})},function(e,t,n){var r=n(266),o=n(267).isFinite;r(r.S,\"Number\",{isFinite:function(e){return\"number\"==typeof e&&o(e)}})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{isInteger:n(330)})},function(e,t,n){var r=n(279),o=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&o(e)===e}},function(e,t,n){var r=n(266);r(r.S,\"Number\",{isNaN:function(e){return e!=e}})},function(e,t,n){var r=n(266),o=n(330),i=Math.abs;r(r.S,\"Number\",{isSafeInteger:function(e){return o(e)&&i(e)<=9007199254740991}})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{parseFloat:parseFloat})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{parseInt:parseInt})},function(e,t,n){var r=n(266),o=n(338),i=Math.sqrt,a=Math.acosh;r(r.S+r.F*!(a&&710==Math.floor(a(Number.MAX_VALUE))),\"Math\",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:o(e-1+i(e-1)*i(e+1))}})},function(e,t){e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,n){function r(e){return isFinite(e=+e)&&0!=e?e<0?-r(-e):Math.log(e+Math.sqrt(e*e+1)):e}var o=n(266);o(o.S,\"Math\",{asinh:r})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,n){var r=n(266),o=n(342);r(r.S,\"Math\",{cbrt:function(e){return o(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t,n){var r=n(266);r(r.S,\"Math\",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,n){var r=n(266),o=Math.exp;r(r.S,\"Math\",{cosh:function(e){return(o(e=+e)+o(-e))/2}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{expm1:n(346)})},function(e,t){e.exports=Math.expm1||function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}},function(e,t,n){var r=n(266),o=n(342),i=Math.pow,a=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),l=i(2,-126),c=function(e){return e+1/a-1/a};r(r.S,\"Math\",{fround:function(e){var t,n,r=Math.abs(e),i=o(e);return r<l?i*c(r/l/s)*l*s:(t=(1+s/a)*r,n=t-(t-r),n>u||n!=n?i*(1/0):i*n)}})},function(e,t,n){var r=n(266),o=Math.abs;r(r.S,\"Math\",{hypot:function(e,t){for(var n,r,i=0,a=0,s=arguments,u=s.length,l=0;a<u;)n=o(s[a++]),l<n?(r=l/n,i=i*r*r+1,l=n):n>0?(r=n/l,i+=r*r):i+=n;return l===1/0?1/0:l*Math.sqrt(i)}})},function(e,t,n){var r=n(266),o=Math.imul;r(r.S+r.F*n(272)(function(){return o(4294967295,5)!=-5||2!=o.length}),\"Math\",{imul:function(e,t){var n=65535,r=+e,o=+t,i=n&r,a=n&o;return 0|i*a+((n&r>>>16)*a+i*(n&o>>>16)<<16>>>0)}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{log10:function(e){return Math.log(e)/Math.LN10}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{log1p:n(338)})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{sign:n(342)})},function(e,t,n){var r=n(266),o=n(346),i=Math.exp;r(r.S+r.F*n(272)(function(){return!Math.sinh(-2e-17)!=-2e-17}),\"Math\",{sinh:function(e){return Math.abs(e=+e)<1?(o(e)-o(-e))/2:(i(e-1)-i(-e-1))*(Math.E/2)}})},function(e,t,n){var r=n(266),o=n(346),i=Math.exp;r(r.S,\"Math\",{tanh:function(e){var t=o(e=+e),n=o(-e);return t==1/0?1:n==1/0?-1:(t-n)/(i(e)+i(-e))}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,n){var r=n(266),o=n(289),i=String.fromCharCode,a=String.fromCodePoint;r(r.S+r.F*(!!a&&1!=a.length),\"String\",{fromCodePoint:function(e){for(var t,n=[],r=arguments,a=r.length,s=0;a>s;){if(t=+r[s++],o(t,1114111)!==t)throw RangeError(t+\" is not a valid code point\");n.push(t<65536?i(t):i(((t-=65536)>>10)+55296,t%1024+56320))}return n.join(\"\")}})},function(e,t,n){var r=n(266),o=n(286),i=n(290);r(r.S,\"String\",{raw:function(e){for(var t=o(e.raw),n=i(t.length),r=arguments,a=r.length,s=[],u=0;n>u;)s.push(String(t[u++])),u<a&&s.push(String(r[u]));return s.join(\"\")}})},function(e,t,n){\"use strict\";n(326)(\"trim\",function(e){return function(){return e(this,3)}})},function(e,t,n){\"use strict\";var r=n(361)(!0);n(362)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(288),o=n(285);e.exports=function(e){return function(t,n){var i,a,s=String(o(t)),u=r(n),l=s.length;return u<0||u>=l?e?\"\":void 0:(i=s.charCodeAt(u),i<55296||i>56319||u+1===l||(a=s.charCodeAt(u+1))<56320||a>57343?e?s.charAt(u):i:e?s.slice(u,u+2):(i-55296<<10)+(a-56320)+65536)}}},function(e,t,n){\"use strict\";var r=n(302),o=n(266),i=n(273),a=n(269),s=n(280),u=n(363),l=n(364),c=n(298),p=n(265).getProto,f=n(294)(\"iterator\"),d=!([].keys&&\"next\"in[].keys()),h=\"@@iterator\",v=\"keys\",m=\"values\",y=function(){return this};e.exports=function(e,t,n,g,b,E,_){l(n,t,g);var O,N,w=function(e){if(!d&&e in T)return T[e];switch(e){case v:return function(){return new n(this,e)};case m:return function(){return new n(this,e)}}return function(){return new n(this,e)}},C=t+\" Iterator\",P=b==m,x=!1,T=e.prototype,D=T[f]||T[h]||b&&T[b],M=D||w(b);if(D){var S=p(M.call(new e));c(S,C,!0),!r&&s(T,h)&&a(S,f,y),P&&D.name!==m&&(x=!0,M=function(){return D.call(this)})}if(r&&!_||!d&&!x&&T[f]||a(T,f,M),u[t]=M,u[C]=y,b)if(O={values:P?M:w(m),keys:E?M:w(v),entries:P?w(\"entries\"):M},_)for(N in O)N in T||i(T,N,O[N]);else o(o.P+o.F*(d||x),t,O);return O}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(265),o=n(270),i=n(298),a={};n(269)(a,n(294)(\"iterator\"),function(){return this}),e.exports=function(e,t,n){e.prototype=r.create(a,{next:o(1,n)}),i(e,t+\" Iterator\")}},function(e,t,n){\"use strict\";var r=n(266),o=n(361)(!1);r(r.P,\"String\",{codePointAt:function(e){return o(this,e)}})},function(e,t,n){\"use strict\";var r=n(266),o=n(290),i=n(367),a=\"endsWith\",s=\"\"[a];r(r.P+r.F*n(369)(a),\"String\",{endsWith:function(e){var t=i(this,e,a),n=arguments,r=n.length>1?n[1]:void 0,u=o(t.length),l=void 0===r?u:Math.min(o(r),u),c=String(e);return s?s.call(t,c,l):t.slice(l-c.length,l)===c}})},function(e,t,n){var r=n(368),o=n(285);e.exports=function(e,t,n){if(r(t))throw TypeError(\"String#\"+n+\" doesn't accept regex!\");return String(o(e))}},function(e,t,n){var r=n(279),o=n(281),i=n(294)(\"match\");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:\"RegExp\"==o(e))}},function(e,t,n){var r=n(294)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[r]=!1,!\"/./\"[e](t)}catch(e){}}return!0}},function(e,t,n){\"use strict\";var r=n(266),o=n(367),i=\"includes\";r(r.P+r.F*n(369)(i),\"String\",{includes:function(e){return!!~o(this,e,i).indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(266);r(r.P,\"String\",{repeat:n(372)})},function(e,t,n){\"use strict\";var r=n(288),o=n(285);e.exports=function(e){var t=String(o(this)),n=\"\",i=r(e);if(i<0||i==1/0)throw RangeError(\"Count can't be negative\");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t,n){\"use strict\";var r=n(266),o=n(290),i=n(367),a=\"startsWith\",s=\"\"[a];r(r.P+r.F*n(369)(a),\"String\",{startsWith:function(e){var t=i(this,e,a),n=arguments,r=o(Math.min(n.length>1?n[1]:void 0,t.length)),u=String(e);return s?s.call(t,u,r):t.slice(r,r+u.length)===u}})},function(e,t,n){\"use strict\";var r=n(275),o=n(266),i=n(284),a=n(375),s=n(376),u=n(290),l=n(377);o(o.S+o.F*!n(378)(function(e){Array.from(e)}),\"Array\",{from:function(e){var t,n,o,c,p=i(e),f=\"function\"==typeof this?this:Array,d=arguments,h=d.length,v=h>1?d[1]:void 0,m=void 0!==v,y=0,g=l(p);if(m&&(v=r(v,h>2?d[2]:void 0,2)),void 0==g||f==Array&&s(g))for(t=u(p.length),n=new f(t);t>y;y++)n[y]=m?v(p[y],y):p[y];else for(c=g.call(p),n=new f;!(o=c.next()).done;y++)n[y]=m?a(c,v,[o.value,y],!0):o.value;return n.length=y,n}})},function(e,t,n){var r=n(283);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},function(e,t,n){var r=n(363),o=n(294)(\"iterator\"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},function(e,t,n){var r=n(310),o=n(294)(\"iterator\"),i=n(363);e.exports=n(268).getIteratorMethod=function(e){if(void 0!=e)return e[o]||e[\"@@iterator\"]||i[r(e)]}},function(e,t,n){var r=n(294)(\"iterator\"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}\ne.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},function(e,t,n){\"use strict\";var r=n(266);r(r.S+r.F*n(272)(function(){function e(){}return!(Array.of.call(e)instanceof e)}),\"Array\",{of:function(){for(var e=0,t=arguments,n=t.length,r=new(\"function\"==typeof this?this:Array)(n);n>e;)r[e]=t[e++];return r.length=n,r}})},function(e,t,n){\"use strict\";var r=n(381),o=n(382),i=n(363),a=n(286);e.exports=n(362)(Array,\"Array\",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):\"keys\"==t?o(0,n):\"values\"==t?o(0,e[n]):o(0,[n,e[n]])},\"values\"),i.Arguments=i.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(e,t,n){var r=n(294)(\"unscopables\"),o=Array.prototype;void 0==o[r]&&n(269)(o,r,{}),e.exports=function(e){o[r][e]=!0}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){n(384)(\"Array\")},function(e,t,n){\"use strict\";var r=n(267),o=n(265),i=n(271),a=n(294)(\"species\");e.exports=function(e){var t=r[e];i&&t&&!t[a]&&o.setDesc(t,a,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(266);r(r.P,\"Array\",{copyWithin:n(386)}),n(381)(\"copyWithin\")},function(e,t,n){\"use strict\";var r=n(284),o=n(289),i=n(290);e.exports=[].copyWithin||function(e,t){var n=r(this),a=i(n.length),s=o(e,a),u=o(t,a),l=arguments,c=l.length>2?l[2]:void 0,p=Math.min((void 0===c?a:o(c,a))-u,a-s),f=1;for(u<s&&s<u+p&&(f=-1,u+=p-1,s+=p-1);p-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},function(e,t,n){var r=n(266);r(r.P,\"Array\",{fill:n(388)}),n(381)(\"fill\")},function(e,t,n){\"use strict\";var r=n(284),o=n(289),i=n(290);e.exports=[].fill||function(e){for(var t=r(this),n=i(t.length),a=arguments,s=a.length,u=o(s>1?a[1]:void 0,n),l=s>2?a[2]:void 0,c=void 0===l?n:o(l,n);c>u;)t[u++]=e;return t}},function(e,t,n){\"use strict\";var r=n(266),o=n(291)(5),i=\"find\",a=!0;i in[]&&Array(1)[i](function(){a=!1}),r(r.P+r.F*a,\"Array\",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(381)(i)},function(e,t,n){\"use strict\";var r=n(266),o=n(291)(6),i=\"findIndex\",a=!0;i in[]&&Array(1)[i](function(){a=!1}),r(r.P+r.F*a,\"Array\",{findIndex:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(381)(i)},function(e,t,n){var r=n(265),o=n(267),i=n(368),a=n(392),s=o.RegExp,u=s,l=s.prototype,c=/a/g,p=/a/g,f=new s(c)!==c;!n(271)||f&&!n(272)(function(){return p[n(294)(\"match\")]=!1,s(c)!=c||s(p)==p||\"/a/i\"!=s(c,\"i\")})||(s=function(e,t){var n=i(e),r=void 0===t;return this instanceof s||!n||e.constructor!==s||!r?f?new u(n&&!r?e.source:e,t):u((n=e instanceof s)?e.source:e,n&&r?a.call(e):t):e},r.each.call(r.getNames(u),function(e){e in s||r.setDesc(s,e,{configurable:!0,get:function(){return u[e]},set:function(t){u[e]=t}})}),l.constructor=s,s.prototype=l,n(273)(o,\"RegExp\",s)),n(384)(\"RegExp\")},function(e,t,n){\"use strict\";var r=n(283);e.exports=function(){var e=r(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t}},function(e,t,n){var r=n(265);n(271)&&\"g\"!=/./g.flags&&r.setDesc(RegExp.prototype,\"flags\",{configurable:!0,get:n(392)})},function(e,t,n){n(395)(\"match\",1,function(e,t){return function(n){\"use strict\";var r=e(this),o=void 0==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))}})},function(e,t,n){\"use strict\";var r=n(269),o=n(273),i=n(272),a=n(285),s=n(294);e.exports=function(e,t,n){var u=s(e),l=\"\"[e];i(function(){var t={};return t[u]=function(){return 7},7!=\"\"[e](t)})&&(o(String.prototype,e,n(a,u,l)),r(RegExp.prototype,u,2==t?function(e,t){return l.call(e,this,t)}:function(e){return l.call(e,this)}))}},function(e,t,n){n(395)(\"replace\",2,function(e,t,n){return function(r,o){\"use strict\";var i=e(this),a=void 0==r?void 0:r[t];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)}})},function(e,t,n){n(395)(\"search\",1,function(e,t){return function(n){\"use strict\";var r=e(this),o=void 0==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))}})},function(e,t,n){n(395)(\"split\",2,function(e,t,n){return function(r,o){\"use strict\";var i=e(this),a=void 0==r?void 0:r[t];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)}})},function(e,t,n){\"use strict\";var r,o=n(265),i=n(302),a=n(267),s=n(275),u=n(310),l=n(266),c=n(279),p=n(283),f=n(276),d=n(400),h=n(401),v=n(308).set,m=n(306),y=n(294)(\"species\"),g=n(402),b=n(403),E=\"Promise\",_=a.process,O=\"process\"==u(_),N=a[E],w=function(){},C=function(e){var t,n=new N(w);return e&&(n.constructor=function(e){e(w,w)}),(t=N.resolve(n)).catch(w),t===n},P=function(){function e(t){var n=new N(t);return v(n,e.prototype),n}var t=!1;try{if(t=N&&N.resolve&&C(),v(e,N),e.prototype=o.create(N.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(t=!1),t&&n(271)){var r=!1;N.resolve(o.setDesc({},\"then\",{get:function(){r=!0}})),t=r}}catch(e){t=!1}return t}(),x=function(e,t){return!(!i||e!==N||t!==r)||m(e,t)},T=function(e){var t=p(e)[y];return void 0!=t?t:e},D=function(e){var t;return!(!c(e)||\"function\"!=typeof(t=e.then))&&t},M=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r}),this.resolve=f(t),this.reject=f(n)},S=function(e){try{e()}catch(e){return{error:e}}},k=function(e,t){if(!e.n){e.n=!0;var n=e.c;b(function(){for(var r=e.v,o=1==e.s,i=0,s=function(t){var n,i,a=o?t.ok:t.fail,s=t.resolve,u=t.reject;try{a?(o||(e.h=!0),n=a===!0?r:a(r),n===t.promise?u(TypeError(\"Promise-chain cycle\")):(i=D(n))?i.call(n,s,u):s(n)):u(r)}catch(e){u(e)}};n.length>i;)s(n[i++]);n.length=0,e.n=!1,t&&setTimeout(function(){var t,n,o=e.p;I(o)&&(O?_.emit(\"unhandledRejection\",r,o):(t=a.onunhandledrejection)?t({promise:o,reason:r}):(n=a.console)&&n.error&&n.error(\"Unhandled promise rejection\",r)),e.a=void 0},1)})}},I=function(e){var t,n=e._d,r=n.a||n.c,o=0;if(n.h)return!1;for(;r.length>o;)if(t=r[o++],t.fail||!I(t.promise))return!1;return!0},R=function(e){var t=this;t.d||(t.d=!0,t=t.r||t,t.v=e,t.s=2,t.a=t.c.slice(),k(t,!0))},A=function(e){var t,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===e)throw TypeError(\"Promise can't be resolved itself\");(t=D(e))?b(function(){var r={r:n,d:!1};try{t.call(e,s(A,r,1),s(R,r,1))}catch(e){R.call(r,e)}}):(n.v=e,n.s=1,k(n,!1))}catch(e){R.call({r:n,d:!1},e)}}};P||(N=function(e){f(e);var t=this._d={p:d(this,N,E),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{e(s(A,t,1),s(R,t,1))}catch(e){R.call(t,e)}},n(405)(N.prototype,{then:function(e,t){var n=new M(g(this,N)),r=n.promise,o=this._d;return n.ok=\"function\"!=typeof e||e,n.fail=\"function\"==typeof t&&t,o.c.push(n),o.a&&o.a.push(n),o.s&&k(o,!1),r},catch:function(e){return this.then(void 0,e)}})),l(l.G+l.W+l.F*!P,{Promise:N}),n(298)(N,E),n(384)(E),r=n(268)[E],l(l.S+l.F*!P,E,{reject:function(e){var t=new M(this),n=t.reject;return n(e),t.promise}}),l(l.S+l.F*(!P||C(!0)),E,{resolve:function(e){if(e instanceof N&&x(e.constructor,this))return e;var t=new M(this),n=t.resolve;return n(e),t.promise}}),l(l.S+l.F*!(P&&n(378)(function(e){N.all(e).catch(function(){})})),E,{all:function(e){var t=T(this),n=new M(t),r=n.resolve,i=n.reject,a=[],s=S(function(){h(e,!1,a.push,a);var n=a.length,s=Array(n);n?o.each.call(a,function(e,o){var a=!1;t.resolve(e).then(function(e){a||(a=!0,s[o]=e,--n||r(s))},i)}):r(s)});return s&&i(s.error),n.promise},race:function(e){var t=T(this),n=new M(t),r=n.reject,o=S(function(){h(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o&&r(o.error),n.promise}})},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(n+\": use the 'new' operator!\");return e}},function(e,t,n){var r=n(275),o=n(375),i=n(376),a=n(283),s=n(290),u=n(377);e.exports=function(e,t,n,l){var c,p,f,d=u(e),h=r(n,l,t?2:1),v=0;if(\"function\"!=typeof d)throw TypeError(e+\" is not iterable!\");if(i(d))for(c=s(e.length);c>v;v++)t?h(a(p=e[v])[0],p[1]):h(e[v]);else for(f=d.call(e);!(p=f.next()).done;)o(f,h,p.value,t)}},function(e,t,n){var r=n(283),o=n(276),i=n(294)(\"species\");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[i])?t:o(n)}},function(e,t,n){var r,o,i,a=n(267),s=n(404).set,u=a.MutationObserver||a.WebKitMutationObserver,l=a.process,c=a.Promise,p=\"process\"==n(281)(l),f=function(){var e,t,n;for(p&&(e=l.domain)&&(l.domain=null,e.exit());r;)t=r.domain,n=r.fn,t&&t.enter(),n(),t&&t.exit(),r=r.next;o=void 0,e&&e.enter()};if(p)i=function(){l.nextTick(f)};else if(u){var d=1,h=document.createTextNode(\"\");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(a,f)};e.exports=function(e){var t={fn:e,next:void 0,domain:p&&l.domain};o&&(o.next=t),r||(r=t,i()),o=t}},function(e,t,n){var r,o,i,a=n(275),s=n(282),u=n(277),l=n(278),c=n(267),p=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,v=0,m={},y=\"onreadystatechange\",g=function(){var e=+this;if(m.hasOwnProperty(e)){var t=m[e];delete m[e],t()}},b=function(e){g.call(e.data)};f&&d||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return m[++v]=function(){s(\"function\"==typeof e?e:Function(e),t)},r(v),v},d=function(e){delete m[e]},\"process\"==n(281)(p)?r=function(e){p.nextTick(a(g,e,1))}:h?(o=new h,i=o.port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):c.addEventListener&&\"function\"==typeof postMessage&&!c.importScripts?(r=function(e){c.postMessage(e+\"\",\"*\")},c.addEventListener(\"message\",b,!1)):r=y in l(\"script\")?function(e){u.appendChild(l(\"script\"))[y]=function(){u.removeChild(this),g.call(e)}}:function(e){setTimeout(a(g,e,1),0)}),e.exports={set:f,clear:d}},function(e,t,n){var r=n(273);e.exports=function(e,t){for(var n in t)r(e,n,t[n]);return e}},function(e,t,n){\"use strict\";var r=n(407);n(408)(\"Map\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=r.getEntry(this,e);return t&&t.v},set:function(e,t){return r.def(this,0===e?0:e,t)}},r,!0)},function(e,t,n){\"use strict\";var r=n(265),o=n(269),i=n(405),a=n(275),s=n(400),u=n(285),l=n(401),c=n(362),p=n(382),f=n(274)(\"id\"),d=n(280),h=n(279),v=n(384),m=n(271),y=Object.isExtensible||h,g=m?\"_s\":\"size\",b=0,E=function(e,t){if(!h(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!d(e,f)){if(!y(e))return\"F\";if(!t)return\"E\";o(e,f,++b)}return\"O\"+e[f]},_=function(e,t){var n,r=E(t);if(\"F\"!==r)return e._i[r];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,o){var c=e(function(e,i){s(e,c,t),e._i=r.create(null),e._f=void 0,e._l=void 0,e[g]=0,void 0!=i&&l(i,n,e[o],e)});return i(c.prototype,{clear:function(){for(var e=this,t=e._i,n=e._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete t[n.i];e._f=e._l=void 0,e[g]=0},delete:function(e){var t=this,n=_(t,e);if(n){var r=n.n,o=n.p;delete t._i[n.i],n.r=!0,o&&(o.n=r),r&&(r.p=o),t._f==n&&(t._f=r),t._l==n&&(t._l=o),t[g]--}return!!n},forEach:function(e){for(var t,n=a(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(n(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!_(this,e)}}),m&&r.setDesc(c.prototype,\"size\",{get:function(){return u(this[g])}}),c},def:function(e,t,n){var r,o,i=_(e,t);return i?i.v=n:(e._l=i={i:o=E(t,!0),k:t,v:n,p:r=e._l,n:void 0,r:!1},e._f||(e._f=i),r&&(r.n=i),e[g]++,\"F\"!==o&&(e._i[o]=i)),e},getEntry:_,setStrong:function(e,t,n){c(e,t,function(e,t){this._t=e,this._k=t,this._l=void 0},function(){for(var e=this,t=e._k,n=e._l;n&&n.r;)n=n.p;return e._t&&(e._l=n=n?n.n:e._t._f)?\"keys\"==t?p(0,n.k):\"values\"==t?p(0,n.v):p(0,[n.k,n.v]):(e._t=void 0,p(1))},n?\"entries\":\"values\",!n,!0),v(t)}}},function(e,t,n){\"use strict\";var r=n(267),o=n(266),i=n(273),a=n(405),s=n(401),u=n(400),l=n(279),c=n(272),p=n(378),f=n(298);e.exports=function(e,t,n,d,h,v){var m=r[e],y=m,g=h?\"set\":\"add\",b=y&&y.prototype,E={},_=function(e){var t=b[e];i(b,e,\"delete\"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:\"has\"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:\"get\"==e?function(e){return v&&!l(e)?void 0:t.call(this,0===e?0:e)}:\"add\"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(\"function\"==typeof y&&(v||b.forEach&&!c(function(){(new y).entries().next()}))){var O,N=new y,w=N[g](v?{}:-0,1)!=N,C=c(function(){N.has(1)}),P=p(function(e){new y(e)});P||(y=t(function(t,n){u(t,y,e);var r=new m;return void 0!=n&&s(n,h,r[g],r),r}),y.prototype=b,b.constructor=y),v||N.forEach(function(e,t){O=1/t===-(1/0)}),(C||O)&&(_(\"delete\"),_(\"has\"),h&&_(\"get\")),(O||w)&&_(g),v&&b.clear&&delete b.clear}else y=d.getConstructor(t,e,h,g),a(y.prototype,n);return f(y,e),E[e]=y,o(o.G+o.W+o.F*(y!=m),E),v||d.setStrong(y,e,h),y}},function(e,t,n){\"use strict\";var r=n(407);n(408)(\"Set\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(this,e=0===e?0:e,e)}},r)},function(e,t,n){\"use strict\";var r=n(265),o=n(273),i=n(411),a=n(279),s=n(280),u=i.frozenStore,l=i.WEAK,c=Object.isExtensible||a,p={},f=n(408)(\"WeakMap\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){if(a(e)){if(!c(e))return u(this).get(e);if(s(e,l))return e[l][this._i]}},set:function(e,t){return i.def(this,e,t)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(p),7).get(p)&&r.each.call([\"delete\",\"has\",\"get\",\"set\"],function(e){var t=f.prototype,n=t[e];o(t,e,function(t,r){if(a(t)&&!c(t)){var o=u(this)[e](t,r);return\"set\"==e?this:o}return n.call(this,t,r)})})},function(e,t,n){\"use strict\";var r=n(269),o=n(405),i=n(283),a=n(279),s=n(400),u=n(401),l=n(291),c=n(280),p=n(274)(\"weak\"),f=Object.isExtensible||a,d=l(5),h=l(6),v=0,m=function(e){return e._l||(e._l=new y)},y=function(){this.a=[]},g=function(e,t){return d(e.a,function(e){return e[0]===t})};y.prototype={get:function(e){var t=g(this,e);if(t)return t[1]},has:function(e){return!!g(this,e)},set:function(e,t){var n=g(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=h(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,r){var i=e(function(e,o){s(e,i,t),e._i=v++,e._l=void 0,void 0!=o&&u(o,n,e[r],e)});return o(i.prototype,{delete:function(e){return!!a(e)&&(f(e)?c(e,p)&&c(e[p],this._i)&&delete e[p][this._i]:m(this).delete(e))},has:function(e){return!!a(e)&&(f(e)?c(e,p)&&c(e[p],this._i):m(this).has(e))}}),i},def:function(e,t,n){return f(i(t))?(c(t,p)||r(t,p,{}),t[p][e._i]=n):m(e).set(t,n),e},frozenStore:m,WEAK:p}},function(e,t,n){\"use strict\";var r=n(411);n(408)(\"WeakSet\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(this,e,!0)}},r,!1,!0)},function(e,t,n){var r=n(266),o=Function.apply,i=n(283);r(r.S,\"Reflect\",{apply:function(e,t,n){return o.call(e,t,i(n))}})},function(e,t,n){var r=n(265),o=n(266),i=n(276),a=n(283),s=n(279),u=Function.bind||n(268).Function.prototype.bind;o(o.S+o.F*n(272)(function(){function e(){}return!(Reflect.construct(function(){},[],e)instanceof e)}),\"Reflect\",{construct:function(e,t){i(e),a(t);var n=arguments.length<3?e:i(arguments[2]);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var o=[null];return o.push.apply(o,t),new(u.apply(e,o))}var l=n.prototype,c=r.create(s(l)?l:Object.prototype),p=Function.apply.call(e,c,t);return s(p)?p:c}})},function(e,t,n){var r=n(265),o=n(266),i=n(283);o(o.S+o.F*n(272)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),\"Reflect\",{defineProperty:function(e,t,n){i(e);try{return r.setDesc(e,t,n),!0}catch(e){return!1}}})},function(e,t,n){var r=n(266),o=n(265).getDesc,i=n(283);r(r.S,\"Reflect\",{deleteProperty:function(e,t){var n=o(i(e),t);return!(n&&!n.configurable)&&delete e[t]}})},function(e,t,n){\"use strict\";var r=n(266),o=n(283),i=function(e){this._t=o(e),this._i=0;var t,n=this._k=[];for(t in e)n.push(t)};n(364)(i,\"Object\",function(){var e,t=this,n=t._k;do if(t._i>=n.length)return{value:void 0,done:!0};while(!((e=n[t._i++])in t._t));return{value:e,done:!1}}),r(r.S,\"Reflect\",{enumerate:function(e){return new i(e)}})},function(e,t,n){function r(e,t){var n,a,l=arguments.length<3?e:arguments[2];return u(e)===l?e[t]:(n=o.getDesc(e,t))?i(n,\"value\")?n.value:void 0!==n.get?n.get.call(l):void 0:s(a=o.getProto(e))?r(a,t,l):void 0}var o=n(265),i=n(280),a=n(266),s=n(279),u=n(283);a(a.S,\"Reflect\",{get:r})},function(e,t,n){var r=n(265),o=n(266),i=n(283);o(o.S,\"Reflect\",{getOwnPropertyDescriptor:function(e,t){return r.getDesc(i(e),t)}})},function(e,t,n){var r=n(266),o=n(265).getProto,i=n(283);r(r.S,\"Reflect\",{getPrototypeOf:function(e){return o(i(e))}})},function(e,t,n){var r=n(266);r(r.S,\"Reflect\",{has:function(e,t){return t in e}})},function(e,t,n){var r=n(266),o=n(283),i=Object.isExtensible;r(r.S,\"Reflect\",{isExtensible:function(e){return o(e),!i||i(e)}})},function(e,t,n){var r=n(266);r(r.S,\"Reflect\",{ownKeys:n(424)})},function(e,t,n){var r=n(265),o=n(283),i=n(267).Reflect;e.exports=i&&i.ownKeys||function(e){var t=r.getNames(o(e)),n=r.getSymbols;return n?t.concat(n(e)):t}},function(e,t,n){var r=n(266),o=n(283),i=Object.preventExtensions;r(r.S,\"Reflect\",{preventExtensions:function(e){o(e);try{return i&&i(e),!0}catch(e){return!1}}})},function(e,t,n){function r(e,t,n){var a,c,p=arguments.length<4?e:arguments[3],f=o.getDesc(u(e),t);if(!f){if(l(c=o.getProto(e)))return r(c,t,n,p);f=s(0)}return i(f,\"value\")?!(f.writable===!1||!l(p))&&(a=o.getDesc(p,t)||s(0),a.value=n,o.setDesc(p,t,a),!0):void 0!==f.set&&(f.set.call(p,n),!0)}var o=n(265),i=n(280),a=n(266),s=n(270),u=n(283),l=n(279);a(a.S,\"Reflect\",{set:r})},function(e,t,n){var r=n(266),o=n(308);o&&r(r.S,\"Reflect\",{setPrototypeOf:function(e,t){o.check(e,t);try{return o.set(e,t),!0}catch(e){return!1}}})},function(e,t,n){\"use strict\";var r=n(266),o=n(296)(!0);r(r.P,\"Array\",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(381)(\"includes\")},function(e,t,n){\"use strict\";var r=n(266),o=n(361)(!0);r(r.P,\"String\",{at:function(e){return o(this,e)}})},function(e,t,n){\"use strict\";var r=n(266),o=n(431);r(r.P,\"String\",{padLeft:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,n){var r=n(290),o=n(372),i=n(285);e.exports=function(e,t,n,a){var s=String(i(e)),u=s.length,l=void 0===n?\" \":String(n),c=r(t);if(c<=u)return s;\"\"==l&&(l=\" \");var p=c-u,f=o.call(l,Math.ceil(p/l.length));return f.length>p&&(f=f.slice(0,p)),a?f+s:s+f}},function(e,t,n){\"use strict\";var r=n(266),o=n(431);r(r.P,\"String\",{padRight:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,n){\"use strict\";n(326)(\"trimLeft\",function(e){return function(){return e(this,1)}})},function(e,t,n){\"use strict\";n(326)(\"trimRight\",function(e){return function(){return e(this,2)}})},function(e,t,n){var r=n(266),o=n(436)(/[\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\");r(r.S,\"RegExp\",{escape:function(e){return o(e)}})},function(e,t){e.exports=function(e,t){var n=t===Object(t)?function(e){return t[e]}:t;return function(t){return String(t).replace(e,n)}}},function(e,t,n){var r=n(265),o=n(266),i=n(424),a=n(286),s=n(270);o(o.S,\"Object\",{getOwnPropertyDescriptors:function(e){for(var t,n,o=a(e),u=r.setDesc,l=r.getDesc,c=i(o),p={},f=0;c.length>f;)n=l(o,t=c[f++]),t in p?u(p,t,s(0,n)):p[t]=n;return p}})},function(e,t,n){var r=n(266),o=n(439)(!1);r(r.S,\"Object\",{values:function(e){return o(e)}})},function(e,t,n){var r=n(265),o=n(286),i=r.isEnum;e.exports=function(e){return function(t){for(var n,a=o(t),s=r.getKeys(a),u=s.length,l=0,c=[];u>l;)i.call(a,n=s[l++])&&c.push(e?[n,a[n]]:a[n]);return c}}},function(e,t,n){var r=n(266),o=n(439)(!0);r(r.S,\"Object\",{entries:function(e){return o(e)}})},function(e,t,n){var r=n(266);r(r.P,\"Map\",{toJSON:n(442)(\"Map\")})},function(e,t,n){var r=n(401),o=n(310);e.exports=function(e){return function(){if(o(this)!=e)throw TypeError(e+\"#toJSON isn't generic\");var t=[];return r(this,!1,t.push,t),t}}},function(e,t,n){var r=n(266);r(r.P,\"Set\",{toJSON:n(442)(\"Set\")})},function(e,t,n){var r=n(265),o=n(266),i=n(275),a=n(268).Array||Array,s={},u=function(e,t){r.each.call(e.split(\",\"),function(e){void 0==t&&e in a?s[e]=a[e]:e in[]&&(s[e]=i(Function.call,[][e],t))})};u(\"pop,reverse,shift,keys,values,entries\",1),u(\"indexOf,every,some,forEach,map,filter,find,findIndex,includes\",3),u(\"join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\"),o(o.S,\"Array\",s)},function(e,t,n){var r=n(267),o=n(266),i=n(282),a=n(446),s=r.navigator,u=!!s&&/MSIE .\\./.test(s.userAgent),l=function(e){return u?function(t,n){return e(i(a,[].slice.call(arguments,2),\"function\"==typeof t?t:Function(t)),n)}:e};o(o.G+o.B+o.F*u,{setTimeout:l(r.setTimeout),setInterval:l(r.setInterval)})},function(e,t,n){\"use strict\";var r=n(447),o=n(282),i=n(276);e.exports=function(){for(var e=i(this),t=arguments.length,n=Array(t),a=0,s=r._,u=!1;t>a;)(n[a]=arguments[a++])===s&&(u=!0);return function(){var r,i=this,a=arguments,l=a.length,c=0,p=0;if(!u&&!l)return o(e,n,i);if(r=n.slice(),u)for(;t>c;c++)r[c]===s&&(r[c]=a[p++]);for(;l>p;)r.push(a[p++]);return o(e,r,i)}}},function(e,t,n){e.exports=n(267)},function(e,t,n){var r=n(266),o=n(404);r(r.G+r.B,{setImmediate:o.set,clearImmediate:o.clear})},function(e,t,n){n(380);var r=n(267),o=n(269),i=n(363),a=n(294)(\"iterator\"),s=r.NodeList,u=r.HTMLCollection,l=s&&s.prototype,c=u&&u.prototype,p=i.NodeList=i.HTMLCollection=i.Array;l&&!l[a]&&o(l,a,p),c&&!c[a]&&o(c,a,p)},function(e,t,n){(function(t,n){!function(t){\"use strict\";function r(e,t,n,r){var o=Object.create((t||i).prototype),a=new h(r||[]);return o._invoke=p(e,n,a),o}function o(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}function i(){}function a(){}function s(){}function u(e){[\"next\",\"throw\",\"return\"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function l(e){this.arg=e}function c(e){function t(t,n){var r=e[t](n),o=r.value;return o instanceof l?Promise.resolve(o.arg).then(i,a):Promise.resolve(o).then(function(e){return r.value=e,r})}function r(e,n){function r(){return t(e,n)}return o=o?o.then(r,r):new Promise(function(e){e(r())})}\"object\"==typeof n&&n.domain&&(t=n.domain.bind(t));var o,i=t.bind(e,\"next\"),a=t.bind(e,\"throw\");t.bind(e,\"return\");this._invoke=r}function p(e,t,n){var r=O;return function(i,a){if(r===w)throw new Error(\"Generator is already running\");if(r===C){if(\"throw\"===i)throw a;return m()}for(;;){var s=n.delegate;if(s){if(\"return\"===i||\"throw\"===i&&s.iterator[i]===y){n.delegate=null;var u=s.iterator.return;if(u){var l=o(u,s.iterator,a);if(\"throw\"===l.type){i=\"throw\",a=l.arg;continue}}if(\"return\"===i)continue}var l=o(s.iterator[i],s.iterator,a);if(\"throw\"===l.type){n.delegate=null,i=\"throw\",a=l.arg;continue}i=\"next\",a=y;var c=l.arg;if(!c.done)return r=N,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if(\"next\"===i)r===N?n.sent=a:n.sent=y;else if(\"throw\"===i){if(r===O)throw r=C,a;n.dispatchException(a)&&(i=\"next\",a=y)}else\"return\"===i&&n.abrupt(\"return\",a);r=w;var l=o(e,t,n);if(\"normal\"===l.type){r=n.done?C:N;var c={value:l.arg,done:n.done};if(l.arg!==P)return c;n.delegate&&\"next\"===i&&(a=y)}else\"throw\"===l.type&&(r=C,i=\"throw\",a=l.arg)}}}function f(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function h(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(f,this),this.reset(!0)}function v(e){if(e){var t=e[b];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(g.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=y,t.done=!0,t};return r.next=r}}return{next:m}}function m(){return{value:y,done:!0}}var y,g=Object.prototype.hasOwnProperty,b=\"function\"==typeof Symbol&&Symbol.iterator||\"@@iterator\",E=\"object\"==typeof e,_=t.regeneratorRuntime;if(_)return void(E&&(e.exports=_));_=t.regeneratorRuntime=E?e.exports:{},_.wrap=r;var O=\"suspendedStart\",N=\"suspendedYield\",w=\"executing\",C=\"completed\",P={},x=s.prototype=i.prototype;a.prototype=x.constructor=s,s.constructor=a,a.displayName=\"GeneratorFunction\",_.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===a||\"GeneratorFunction\"===(t.displayName||t.name))},_.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):e.__proto__=s,e.prototype=Object.create(x),e},_.awrap=function(e){return new l(e)},u(c.prototype),_.async=function(e,t,n,o){var i=new c(r(e,t,n,o));return _.isGeneratorFunction(t)?i:i.next().then(function(e){return e.done?e.value:i.next()})},u(x),x[b]=function(){return this},x.toString=function(){return\"[object Generator]\"},_.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},_.values=v,h.prototype={constructor:h,reset:function(e){if(this.prev=0,this.next=0,this.sent=y,this.done=!1,this.delegate=null,this.tryEntries.forEach(d),!e)for(var t in this)\"t\"===t.charAt(0)&&g.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=y)},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,r){return i.type=\"throw\",i.arg=e,n.next=t,!!r}if(this.done)throw e;for(var n=this,r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r],i=o.completion;if(\"root\"===o.tryLoc)return t(\"end\");if(o.tryLoc<=this.prev){var a=g.call(o,\"catchLoc\"),s=g.call(o,\"finallyLoc\");if(a&&s){if(this.prev<o.catchLoc)return t(o.catchLoc,!0);if(this.prev<o.finallyLoc)return t(o.finallyLoc)}else if(a){if(this.prev<o.catchLoc)return t(o.catchLoc,!0)}else{if(!s)throw new Error(\"try statement without catch or finally\");if(this.prev<o.finallyLoc)return t(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&g.call(r,\"finallyLoc\")&&this.prev<r.finallyLoc){var o=r;break}}o&&(\"break\"===e||\"continue\"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var i=o?o.completion:{};return i.type=e,i.arg=t,o?this.next=o.finallyLoc:this.complete(i),P},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=e.arg,this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t)},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),d(n),P}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;d(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:v(e),resultName:t,nextLoc:n},P}}}(\"object\"==typeof t?t:\"object\"==typeof window?window:\"object\"==typeof self?self:this)}).call(t,function(){return this}(),n(6))},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}();n(261);var o=n(160),i=n(452),a=n(1),s=a.FancyWebSocket,u=n(453),l=o.createActions([\"setAll\",\"updateStats\",\"startCrawl\",\"stopCrawl\",\"pauseCrawl\",\"resumeCrawl\"]);t.Actions=l;var c=o.createStore({init:function(){this.jobs=[],this.listenToMany(l),this.triggerDebounced=i(this.trigger,200)},getInitialState:function(){return this.jobs},onSetAll:function(e){this.jobs=e,this.triggerDebounced(e)},onUpdateStats:function(e,t){this.jobs.filter(function(t){return t.id==e}).forEach(function(e){e.stats=Object.assign(e.stats||{},t)}),this.trigger(this.jobs)},onStartCrawl:function(e,t){u.startCrawl(e,t)},onStopCrawl:function(e){u.stopCrawl(e)},onPauseCrawl:function(e){u.pauseCrawl(e)},onResumeCrawl:function(e){u.resumeCrawl(e)}});t.store=c;var p=s.instance();p.on(\"jobs:state\",function(e){l.setAll(e)}),p.on(\"stats:changed\",function(e){var t=r(e,2),n=t[0],o=t[1];l.updateStats(n,o)}),l.setAll(window.INITIAL_DATA.jobs)},function(e,t){e.exports=function(e,t,n){function r(){var l=Date.now()-s;l<t&&l>=0?o=setTimeout(r,t-l):(o=null,n||(u=e.apply(a,i),a=i=null))}var o,i,a,s,u;null==t&&(t=100);var l=function(){a=this,i=arguments,s=Date.now();var l=n&&!o;return o||(o=setTimeout(r,t)),l&&(u=e.apply(a,i),a=i=null),u};return l.clear=function(){o&&(clearTimeout(o),o=null)},l.flush=function(){o&&(u=e.apply(a,i),a=i=null,clearTimeout(o),o=null)},l}},function(e,t){\"use strict\";function n(e,t){var n=window.START_CRAWL_URL,r={domain:e,options:t};$.post(n,r)}function r(e){$.post(window.STOP_CRAWL_URL,{job_id:e})}function o(e){$.post(window.PAUSE_CRAWL_URL,{job_id:e})}function i(e){$.post(window.RESUME_CRAWL_URL,{job_id:e})}Object.defineProperty(t,\"__esModule\",{value:!0}),t.startCrawl=n,t.stopCrawl=r,t.pauseCrawl=o,t.resumeCrawl=i},function(e,t,n){\"use strict\";function r(e){return a(1e3*e||0,{compact:!1})}function o(e){s.render(s.createElement(h,null),document.getElementById(e))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.installHeader=o;var i=n(455),a=n(456),s=n(4),u=n(160),l=n(180),c=(l.Table,n(461)),p=n(260),f=n(462),d=f.KeyValueTable,h=s.createClass({displayName:\"HeaderProcessStats\",mixins:[u.connect(c.store,\"stats\"),u.connect(p.store,\"connectionStatus\")],render:function(){if(\"offline\"==this.state.connectionStatus)return s.createElement(\"span\",null);var e=this.state.stats,t={marginTop:15};return s.createElement(\"div\",{className:\"navbar-text\",style:t},i(e.ram_rss||0),\", CPU: \",(e.cpu_percent||0).toFixed(1),\"%\")}});t.HeaderProcessStats=h;var v=s.createClass({displayName:\"ProcessStatsTable\",mixins:[u.connect(c.store,\"stats\")],render:function(){var e=this.state.stats,t=[[\"CPU %\",(e.cpu_percent||0).toFixed(1)],[\"User Time\",r(e.cpu_time_user)],[\"System Time\",r(e.cpu_time_system)],[\"RSS\",i(e.ram_rss||0,{round:1})],[\"VMS\",i(e.ram_vms||0)],[\"RAM %\",(e.ram_percent||0).toFixed(2)],[\"File Descriptors\",e.num_fds],[\"Threads\",e.num_threads]],n=this.props.fill,o=t.map(function(e){return s.createElement(\"tr\",{key:e[0]},s.createElement(\"td\",null,e[0]),s.createElement(\"td\",null,e[1]))});return s.createElement(d,{noheader:n},o)}});t.ProcessStatsTable=v},function(e,t,n){(function(t){\"use strict\";/**\n\t * filesize\n\t *\n\t * @copyright 2017 Jason Mulligan <jason.mulligan@avoidwork.com>\n\t * @license BSD-3-Clause\n\t * @version 3.5.11\n\t */\n!function(t){function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],a=0,s=void 0,u=void 0,l=void 0,c=void 0,p=void 0,f=void 0,d=void 0,h=void 0,v=void 0,m=void 0,y=void 0,g=void 0,b=void 0,E=void 0;if(isNaN(e))throw new Error(\"Invalid arguments\");return l=t.bits===!0,y=t.unix===!0,u=t.base||2,m=void 0!==t.round?t.round:y?1:2,g=void 0!==t.spacer?t.spacer:y?\"\":\" \",E=t.symbols||t.suffixes||{},b=2===u?t.standard||\"jedec\":\"jedec\",v=t.output||\"string\",p=t.fullform===!0,f=t.fullforms instanceof Array?t.fullforms:[],s=void 0!==t.exponent?t.exponent:-1,h=Number(e),d=h<0,c=u>2?1e3:1024,d&&(h=-h),(s===-1||isNaN(s))&&(s=Math.floor(Math.log(h)/Math.log(c)),s<0&&(s=0)),s>8&&(s=8),0===h?(n[0]=0,n[1]=y?\"\":o[b][l?\"bits\":\"bytes\"][s]):(a=h/(2===u?Math.pow(2,10*s):Math.pow(1e3,s)),l&&(a*=8,a>=c&&s<8&&(a/=c,s++)),n[0]=Number(a.toFixed(s>0?m:0)),n[1]=10===u&&1===s?l?\"kb\":\"kB\":o[b][l?\"bits\":\"bytes\"][s],y&&(n[1]=\"jedec\"===b?n[1].charAt(0):s>0?n[1].replace(/B$/,\"\"):n[1],r.test(n[1])&&(n[0]=Math.floor(n[0]),n[1]=\"\"))),d&&(n[0]=-n[0]),n[1]=E[n[1]]||n[1],\"array\"===v?n:\"exponent\"===v?s:\"object\"===v?{value:n[0],suffix:n[1],symbol:n[1]}:(p&&(n[1]=f[s]?f[s]:i[b][s]+(l?\"bit\":\"byte\")+(1===n[0]?\"\":\"s\")),n.join(g))}var r=/^(b|B)$/,o={iec:{bits:[\"b\",\"Kib\",\"Mib\",\"Gib\",\"Tib\",\"Pib\",\"Eib\",\"Zib\",\"Yib\"],bytes:[\"B\",\"KiB\",\"MiB\",\"GiB\",\"TiB\",\"PiB\",\"EiB\",\"ZiB\",\"YiB\"]},jedec:{bits:[\"b\",\"Kb\",\"Mb\",\"Gb\",\"Tb\",\"Pb\",\"Eb\",\"Zb\",\"Yb\"],bytes:[\"B\",\"KB\",\"MB\",\"GB\",\"TB\",\"PB\",\"EB\",\"ZB\",\"YB\"]}},i={iec:[\"\",\"kibi\",\"mebi\",\"gibi\",\"tebi\",\"pebi\",\"exbi\",\"zebi\",\"yobi\"],jedec:[\"\",\"kilo\",\"mega\",\"giga\",\"tera\",\"peta\",\"exa\",\"zetta\",\"yotta\"]};n.partial=function(e){return function(t){return n(t,e)}},e.exports=n}(\"undefined\"!=typeof window?window:t)}).call(t,function(){return this}())},function(e,t,n){\"use strict\";var r=n(457),o=n(458),i=n(459);e.exports=function(e,t){if(!i(e))throw new TypeError(\"Expected a finite number\");if(t=t||{},e<1e3)return Math.ceil(e)+(t.verbose?\" \"+o(\"millisecond\",Math.ceil(e)):\"ms\");var n=[],a=function(e,r,i,a){if(0!==e){var s=t.verbose?\" \"+o(r,e):i;n.push((a||e)+s)}},s=r(e);if(a(s.days,\"day\",\"d\"),a(s.hours,\"hour\",\"h\"),a(s.minutes,\"minute\",\"m\"),t.compact)return a(s.seconds,\"second\",\"s\"),\"~\"+n[0];var u=e/1e3%60,l=\"number\"==typeof t.secDecimalDigits?t.secDecimalDigits:1,c=u.toFixed(l).replace(/\\.0$/,\"\");return a(u,\"second\",\"s\",c),n.join(\" \")}},function(e,t){\"use strict\";e.exports=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Expected a number\");var t=e>0?Math.floor:Math.ceil;return{days:t(e/864e5),hours:t(e/36e5)%24,minutes:t(e/6e4)%60,seconds:t(e/1e3)%60,milliseconds:t(e)%1e3}}},function(e,t){\"use strict\";e.exports=function(e,t,n){return\"number\"==typeof t&&(n=t,t=e+\"s\"),1===n?e:t}},function(e,t,n){\"use strict\";var r=n(460);e.exports=Number.isFinite||function(e){return!(\"number\"!=typeof e||r(e)||e===1/0||e===-(1/0))}},function(e,t){\"use strict\";e.exports=Number.isNaN||function(e){return e!==e}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(160),o=n(1),i=o.FancyWebSocket;n(261);var a=r.createActions([\"update\"]);t.Actions=a;var s=r.createStore({init:function(){this.stats={},this.listenTo(a.update,this.onUpdate)},getInitialState:function(){return this.stats},onUpdate:function(e){this.stats=e,e.server_time&&(this.stats.serverTime=new Date(e.server_time)),this.trigger(this.stats)}});t.store=s;var u=i.instance();u.on(\"process:stats\",function(e){a.update(e)}),window.INITIAL_PROCESS_STATS&&a.update(window.INITIAL_PROCESS_STATS)},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(4),o=n(180),i=o.Table,a=r.createClass({displayName:\"KeyValueTable\",render:function(){if(this.props.noheader)var e=r.createElement(\"thead\",null);else var e=r.createElement(\"thead\",null,r.createElement(\"th\",null,\"Name\"),r.createElement(\"th\",{className:\"col-md-3\"},\"Value\"));return r.createElement(i,{condensed:!0},e,r.createElement(\"tbody\",null,this.props.children))}});t.KeyValueTable=a},function(e,t,n){\"use strict\";t.DefaultRoute=n(464),t.Link=n(479),t.NotFoundRoute=n(480),t.Redirect=n(481),t.Route=n(478),t.ActiveHandler=n(476),t.RouteHandler=t.ActiveHandler,t.HashLocation=n(482),t.HistoryLocation=n(486),t.RefreshLocation=n(487),t.StaticLocation=n(488),t.TestLocation=n(489),t.ImitateBrowserBehavior=n(490),t.ScrollToTopBehavior=n(491),t.History=n(484),t.Navigation=n(492),t.State=n(493),t.createRoute=n(467).createRoute,t.createDefaultRoute=n(467).createDefaultRoute,t.createNotFoundRoute=n(467).createNotFoundRoute,t.createRedirect=n(467).createRedirect,t.createRoutesFromReactChildren=n(494),t.create=n(495),t.run=n(504)},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},a=n(465),s=n(476),u=n(478),l=function(e){function t(){r(this,t),i(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),t}(u);l.propTypes={name:a.string,path:a.falsy,children:a.falsy,handler:a.func.isRequired},l.defaultProps={handler:s},e.exports=l},function(e,t,n){\"use strict\";var r=n(466),o=n(4).PropTypes,i=n(467),a=r({},o,{falsy:function(e,t,n){if(e[t])return new Error(\"<\"+n+'> should not have a \"'+t+'\" prop')},route:o.instanceOf(i),router:o.func});e.exports=a},function(e,t){\"use strict\";function n(e){if(null==e)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(e)}e.exports=Object.assign||function(e,t){for(var r,o,i=n(e),a=1;a<arguments.length;a++){r=arguments[a],o=Object.keys(Object(r));for(var s=0;s<o.length;s++)i[o[s]]=r[o[s]]}return i}},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var o,i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(466),s=n(468),u=n(469),l=n(470),c=function(){function e(t,n,o,i,a,s,u,c){r(this,e),this.name=t,this.path=n,this.paramNames=l.extractParamNames(this.path),this.ignoreScrollBehavior=!!o,this.isDefault=!!i,this.isNotFound=!!a,this.onEnter=s,this.onLeave=u,this.handler=c}return i(e,null,[{key:\"createRoute\",value:function(t,n){t=t||{},\"string\"==typeof t&&(t={path:t});var r=o;r?u(null==t.parentRoute||t.parentRoute===r,\"You should not use parentRoute with createRoute inside another route's child callback; it is ignored\"):r=t.parentRoute;var i=t.name,a=t.path||i;!a||t.isDefault||t.isNotFound?a=r?r.path:\"/\":l.isAbsolute(a)?r&&s(a===r.path||0===r.paramNames.length,'You cannot nest path \"%s\" inside \"%s\"; the parent requires URL parameters',a,r.path):a=r?l.join(r.path,a):\"/\"+a,t.isNotFound&&!/\\*$/.test(a)&&(a+=\"*\");var c=new e(i,a,t.ignoreScrollBehavior,t.isDefault,t.isNotFound,t.onEnter,t.onLeave,t.handler);if(r&&(c.isDefault?(s(null==r.defaultRoute,\"%s may not have more than one default route\",r),r.defaultRoute=c):c.isNotFound&&(s(null==r.notFoundRoute,\"%s may not have more than one not found route\",r),r.notFoundRoute=c),r.appendChild(c)),\"function\"==typeof n){var p=o;o=c,n.call(c,c),o=p}return c}},{key:\"createDefaultRoute\",value:function(t){return e.createRoute(a({},t,{isDefault:!0}))}},{key:\"createNotFoundRoute\",value:function(t){return e.createRoute(a({},t,{isNotFound:!0}))}},{key:\"createRedirect\",value:function(t){return e.createRoute(a({},t,{path:t.path||t.from||\"*\",onEnter:function(e,n,r){e.redirect(t.to,t.params||n,t.query||r)}}))}}]),i(e,[{key:\"appendChild\",value:function(t){s(t instanceof e,\"route.appendChild must use a valid Route\"),this.childRoutes||(this.childRoutes=[]),this.childRoutes.push(t)}},{key:\"toString\",value:function(){var e=\"<Route\";return this.name&&(e+=' name=\"'+this.name+'\"'),e+=' path=\"'+this.path+'\">'}}]),e}();e.exports=c},function(e,t,n){(function(t){\"use strict\";var n=function(e,n,r,o,i,a,s,u){if(\"production\"!==t.env.NODE_ENV&&void 0===n)throw new Error(\"invariant requires an error message argument\");if(!e){var l;if(void 0===n)l=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[r,o,i,a,s,u],p=0;l=new Error(n.replace(/%s/g,function(){return c[p++]})),l.name=\"Invariant Violation\"}throw l.framesToPop=1,l}};e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var n=\"production\"!==t.env.NODE_ENV,r=function(){};n&&(r=function(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),o=2;o<n;o++)r[o-2]=arguments[o];if(void 0===t)throw new Error(\"`warning(condition, format, ...args)` requires a warning message argument\");if(t.length<10||/^[s\\W]*$/.test(t))throw new Error(\"The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: \"+t);if(0!==t.indexOf(\"Failed Composite propType: \")&&!e){var i=0,a=\"Warning: \"+t.replace(/%s/g,function(){return r[i++]});console.warn(a);try{throw new Error(a)}catch(e){}}}),e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){if(!(e in p)){var t=[],n=e.replace(s,function(e,n){return n?(t.push(n),\"([^/?#]+)\"):\"*\"===e?(t.push(\"splat\"),\"(.*?)\"):\"\\\\\"+e});p[e]={matcher:new RegExp(\"^\"+n+\"$\",\"i\"),paramNames:t}}return p[e]}var o=n(468),i=n(466),a=n(471),s=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\\[\\]\\\\+|{}^$]/g,u=/:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g,l=/\\/\\/\\?|\\/\\?\\/|\\/\\?(?![^\\/=]+=.*$)/g,c=/\\?(.*)$/,p={},f={isAbsolute:function(e){return\"/\"===e.charAt(0)},join:function(e,t){return e.replace(/\\/*$/,\"/\")+t},extractParamNames:function(e){return r(e).paramNames},extractParams:function(e,t){var n=r(e),o=n.matcher,i=n.paramNames,a=t.match(o);if(!a)return null;var s={};return i.forEach(function(e,t){s[e]=a[t+1]}),s},injectParams:function(e,t){t=t||{};var n=0;return e.replace(u,function(r,i){if(i=i||\"splat\",\"?\"===i.slice(-1)){if(i=i.slice(0,-1),null==t[i])return\"\"}else o(null!=t[i],'Missing \"%s\" parameter for path \"%s\"',i,e);var a;return\"splat\"===i&&Array.isArray(t[i])?(a=t[i][n++],o(null!=a,'Missing splat # %s for path \"%s\"',n,e)):a=t[i],a}).replace(l,\"/\")},extractQuery:function(e){var t=e.match(c);return t&&a.parse(t[1])},withoutQuery:function(e){return e.replace(c,\"\")},withQuery:function(e,t){var n=f.extractQuery(e);n&&(t=t?i(n,t):n);var r=a.stringify(t,{arrayFormat:\"brackets\"});return r?f.withoutQuery(e)+\"?\"+r:f.withoutQuery(e)}};e.exports=f},function(e,t,n){e.exports=n(472)},function(e,t,n){var r=n(473),o=n(475);e.exports={stringify:r,parse:o}},function(e,t,n){var r=n(474),o={delimiter:\"&\",arrayPrefixGenerators:{brackets:function(e,t){return e+\"[]\"},indices:function(e,t){return e+\"[\"+t+\"]\"},repeat:function(e,t){return e}}};o.stringify=function(e,t,n){if(r.isBuffer(e)?e=e.toString():e instanceof Date?e=e.toISOString():null===e&&(e=\"\"),\"string\"==typeof e||\"number\"==typeof e||\"boolean\"==typeof e)return[encodeURIComponent(t)+\"=\"+encodeURIComponent(e)];var i=[];if(\"undefined\"==typeof e)return i;for(var a=Object.keys(e),s=0,u=a.length;s<u;++s){var l=a[s];i=Array.isArray(e)?i.concat(o.stringify(e[l],n(t,l),n)):i.concat(o.stringify(e[l],t+\"[\"+l+\"]\",n))}return i},e.exports=function(e,t){t=t||{};var n=\"undefined\"==typeof t.delimiter?o.delimiter:t.delimiter,r=[];if(\"object\"!=typeof e||null===e)return\"\";var i;i=t.arrayFormat in o.arrayPrefixGenerators?t.arrayFormat:\"indices\"in t?t.indices?\"indices\":\"repeat\":\"indices\";for(var a=o.arrayPrefixGenerators[i],s=Object.keys(e),u=0,l=s.length;u<l;++u){var c=s[u];r=r.concat(o.stringify(e[c],c,a))}return r.join(n)}},function(e,t){t.arrayToObject=function(e){for(var t={},n=0,r=e.length;n<r;++n)\"undefined\"!=typeof e[n]&&(t[n]=e[n]);return t},t.merge=function(e,n){if(!n)return e;if(\"object\"!=typeof n)return Array.isArray(e)?e.push(n):e[n]=!0,e;if(\"object\"!=typeof e)return e=[e].concat(n);Array.isArray(e)&&!Array.isArray(n)&&(e=t.arrayToObject(e));for(var r=Object.keys(n),o=0,i=r.length;o<i;++o){var a=r[o],s=n[a];e[a]?e[a]=t.merge(e[a],s):e[a]=s}return e},t.decode=function(e){try{return decodeURIComponent(e.replace(/\\+/g,\" \"))}catch(t){return e}},t.compact=function(e,n){if(\"object\"!=typeof e||null===e)return e;n=n||[];var r=n.indexOf(e);if(r!==-1)return n[r];if(n.push(e),Array.isArray(e)){for(var o=[],i=0,a=e.length;i<a;++i)\"undefined\"!=typeof e[i]&&o.push(e[i]);return o}var s=Object.keys(e);for(i=0,a=s.length;i<a;++i){var u=s[i];e[u]=t.compact(e[u],n)}return e},t.isRegExp=function(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)},t.isBuffer=function(e){return null!==e&&\"undefined\"!=typeof e&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))}},function(e,t,n){var r=n(474),o={delimiter:\"&\",depth:5,arrayLimit:20,parameterLimit:1e3};o.parseValues=function(e,t){for(var n={},o=e.split(t.delimiter,t.parameterLimit===1/0?void 0:t.parameterLimit),i=0,a=o.length;i<a;++i){var s=o[i],u=s.indexOf(\"]=\")===-1?s.indexOf(\"=\"):s.indexOf(\"]=\")+1;if(u===-1)n[r.decode(s)]=\"\";else{var l=r.decode(s.slice(0,u)),c=r.decode(s.slice(u+1));if(Object.prototype.hasOwnProperty(l))continue;n.hasOwnProperty(l)?n[l]=[].concat(n[l]).concat(c):n[l]=c}}return n},o.parseObject=function(e,t,n){if(!e.length)return t;var r=e.shift(),i={};if(\"[]\"===r)i=[],i=i.concat(o.parseObject(e,t,n));else{var a=\"[\"===r[0]&&\"]\"===r[r.length-1]?r.slice(1,r.length-1):r,s=parseInt(a,10),u=\"\"+s;!isNaN(s)&&r!==a&&u===a&&s>=0&&s<=n.arrayLimit?(i=[],i[s]=o.parseObject(e,t,n)):i[a]=o.parseObject(e,t,n)}return i},o.parseKeys=function(e,t,n){if(e){var r=/^([^\\[\\]]*)/,i=/(\\[[^\\[\\]]*\\])/g,a=r.exec(e);if(!Object.prototype.hasOwnProperty(a[1])){var s=[];a[1]&&s.push(a[1]);for(var u=0;null!==(a=i.exec(e))&&u<n.depth;)++u,Object.prototype.hasOwnProperty(a[1].replace(/\\[|\\]/g,\"\"))||s.push(a[1]);return a&&s.push(\"[\"+e.slice(a.index)+\"]\"),o.parseObject(s,t,n)}}},e.exports=function(e,t){if(\"\"===e||null===e||\"undefined\"==typeof e)return{};t=t||{},t.delimiter=\"string\"==typeof t.delimiter||r.isRegExp(t.delimiter)?t.delimiter:o.delimiter,t.depth=\"number\"==typeof t.depth?t.depth:o.depth,t.arrayLimit=\"number\"==typeof t.arrayLimit?t.arrayLimit:o.arrayLimit,t.parameterLimit=\"number\"==typeof t.parameterLimit?t.parameterLimit:o.parameterLimit;for(var n=\"string\"==typeof e?o.parseValues(e,t):e,i={},a=Object.keys(n),s=0,u=a.length;s<u;++s){var l=a[s],c=o.parseKeys(l,n[l],t);i=r.merge(i,c)}return r.compact(i)}},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},s=n(4),u=n(477),l=n(466),c=n(465),p=\"__routeHandler__\",f=function(e){function t(){r(this,t),a(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),i(t,[{key:\"getChildContext\",value:function(){return{routeDepth:this.context.routeDepth+1}}},{key:\"componentDidMount\",value:function(){this._updateRouteComponent(this.refs[p])}},{key:\"componentDidUpdate\",value:function(){this._updateRouteComponent(this.refs[p])}},{key:\"componentWillUnmount\",value:function(){this._updateRouteComponent(null)}},{key:\"_updateRouteComponent\",value:function(e){this.context.router.setRouteComponentAtDepth(this.getRouteDepth(),e)}},{key:\"getRouteDepth\",value:function(){return this.context.routeDepth}},{key:\"createChildRouteHandler\",value:function(e){var t=this.context.router.getRouteAtDepth(this.getRouteDepth());if(null==t)return null;var n=l({},e||this.props,{ref:p,params:this.context.router.getCurrentParams(),query:this.context.router.getCurrentQuery()});return s.createElement(t.handler,n)}},{key:\"render\",value:function(){var e=this.createChildRouteHandler();return e?s.createElement(u,null,e):s.createElement(\"script\",null)}}]),t}(s.Component);f.contextTypes={routeDepth:c.number.isRequired,router:c.router.isRequired},f.childContextTypes={routeDepth:c.number.isRequired},e.exports=f},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},s=n(4),u=function(e){function t(){r(this,t),a(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),i(t,[{key:\"render\",value:function(){return this.props.children}}]),t}(s.Component);e.exports=u},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},s=n(4),u=n(468),l=n(465),c=n(476),p=function(e){function t(){r(this,t),a(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),i(t,[{key:\"render\",value:function(){u(!1,\"%s elements are for router configuration only and should not be rendered\",this.constructor.name)}}]),t}(s.Component);p.propTypes={name:l.string,path:l.string,handler:l.func,ignoreScrollBehavior:l.bool},p.defaultProps={handler:c},e.exports=p},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return 0===e.button}function a(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},l=n(4),c=n(466),p=n(465),f=function(e){function t(){r(this,t),u(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),s(t,[{key:\"handleClick\",value:function(e){var t,n=!0;this.props.onClick&&(t=this.props.onClick(e)),!a(e)&&i(e)&&(t!==!1&&e.defaultPrevented!==!0||(n=!1),e.preventDefault(),n&&this.context.router.transitionTo(this.props.to,this.props.params,this.props.query))}},{key:\"getHref\",value:function(){return this.context.router.makeHref(this.props.to,this.props.params,this.props.query)}},{key:\"getClassName\",value:function(){var e=this.props.className;return this.getActiveState()&&(e+=\" \"+this.props.activeClassName),e}},{key:\"getActiveState\",value:function(){return this.context.router.isActive(this.props.to,this.props.params,this.props.query)}},{key:\"render\",value:function(){var e=c({},this.props,{href:this.getHref(),className:this.getClassName(),onClick:this.handleClick.bind(this)});return e.activeStyle&&this.getActiveState()&&(e.style=e.activeStyle),delete e.to,delete e.params,delete e.query,delete e.activeClassName,delete e.activeStyle,l.DOM.a(e,this.props.children)}}]),t}(l.Component);f.contextTypes={router:p.router.isRequired},f.propTypes={activeClassName:p.string.isRequired,to:p.oneOfType([p.string,p.route]).isRequired,params:p.object,query:p.object,activeStyle:p.object,onClick:p.func},f.defaultProps={activeClassName:\"active\",className:\"\"},e.exports=f},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},a=n(465),s=n(476),u=n(478),l=function(e){function t(){r(this,t),i(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),t}(u);l.propTypes={name:a.string,path:a.falsy,children:a.falsy,handler:a.func.isRequired},l.defaultProps={handler:s},e.exports=l},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},a=n(465),s=n(478),u=function(e){function t(){r(this,t),i(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),t}(s);u.propTypes={path:a.string,from:a.string,to:a.string,handler:a.falsy},u.defaultProps={},e.exports=u},function(e,t,n){\"use strict\";function r(e){e===s.PUSH&&(u.length+=1);var t={path:p.getCurrentPath(),type:e};l.forEach(function(e){e.call(p,t)})}function o(){var e=p.getCurrentPath();return\"/\"===e.charAt(0)||(p.replace(\"/\"+e),!1)}function i(){if(o()){var e=a;a=null,r(e||s.POP)}}var a,s=n(483),u=n(484),l=[],c=!1,p={addChangeListener:function(e){l.push(e),o(),c||(window.addEventListener?window.addEventListener(\"hashchange\",i,!1):window.attachEvent(\"onhashchange\",i),c=!0)},removeChangeListener:function(e){l=l.filter(function(t){return t!==e}),0===l.length&&(window.removeEventListener?window.removeEventListener(\"hashchange\",i,!1):window.removeEvent(\"onhashchange\",i),c=!1)},push:function(e){a=s.PUSH,window.location.hash=e},replace:function(e){a=s.REPLACE,window.location.replace(window.location.pathname+window.location.search+\"#\"+e)},pop:function(){a=s.POP,u.back()},getCurrentPath:function(){return decodeURI(window.location.href.split(\"#\")[1]||\"\")},toString:function(){return\"<HashLocation>\"}};e.exports=p},function(e,t){\"use strict\";var n={PUSH:\"push\",REPLACE:\"replace\",POP:\"pop\"};e.exports=n},function(e,t,n){\"use strict\";var r=n(468),o=n(485),i={length:1,back:function(){r(o,\"Cannot use History.back without a DOM\"),i.length-=1,window.history.back()}};e.exports=i},function(e,t){var n=!(\"undefined\"==typeof window||!window.document||!window.document.createElement);e.exports=n},function(e,t,n){\"use strict\";function r(e){var t={path:l.getCurrentPath(),type:e};s.forEach(function(e){e.call(l,t)})}function o(e){void 0!==e.state&&r(i.POP)}var i=n(483),a=n(484),s=[],u=!1,l={addChangeListener:function(e){s.push(e),u||(window.addEventListener?window.addEventListener(\"popstate\",o,!1):window.attachEvent(\"onpopstate\",o),u=!0)},removeChangeListener:function(e){s=s.filter(function(t){return t!==e}),0===s.length&&(window.addEventListener?window.removeEventListener(\"popstate\",o,!1):window.removeEvent(\"onpopstate\",o),u=!1)},push:function(e){window.history.pushState({path:e},\"\",e),a.length+=1,r(i.PUSH)},replace:function(e){window.history.replaceState({path:e},\"\",e),r(i.REPLACE)},pop:a.back,getCurrentPath:function(){return decodeURI(window.location.pathname+window.location.search)},toString:function(){return\"<HistoryLocation>\"}};e.exports=l},function(e,t,n){\"use strict\";var r=n(486),o=n(484),i={push:function(e){window.location=e},replace:function(e){window.location.replace(e)},pop:o.back,getCurrentPath:r.getCurrentPath,toString:function(){return\"<RefreshLocation>\"}};e.exports=i},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(){a(!1,\"You cannot modify a static location\")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(468),s=function(){function e(t){r(this,e),this.path=t}return i(e,[{key:\"getCurrentPath\",value:function(){return this.path}},{key:\"toString\",value:function(){return'<StaticLocation path=\"'+this.path+'\">'}}]),e}();s.prototype.push=o,s.prototype.replace=o,s.prototype.pop=o,e.exports=s},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(468),a=n(483),s=n(484),u=function(){function e(t){r(this,e),this.history=t||[],this.listeners=[],this.needsDOM=!1,this._updateHistoryLength()}return o(e,[{key:\"_updateHistoryLength\",value:function(){s.length=this.history.length}},{key:\"_notifyChange\",value:function(e){for(var t={path:this.getCurrentPath(),type:e},n=0,r=this.listeners.length;n<r;++n)this.listeners[n].call(this,t)}},{key:\"addChangeListener\",value:function(e){this.listeners.push(e)}},{key:\"removeChangeListener\",value:function(e){this.listeners=this.listeners.filter(function(t){return t!==e})}},{key:\"push\",value:function(e){this.history.push(e),this._updateHistoryLength(),this._notifyChange(a.PUSH)}},{key:\"replace\",value:function(e){i(this.history.length,\"You cannot replace the current path with no history\"),this.history[this.history.length-1]=e,this._notifyChange(a.REPLACE)}},{key:\"pop\",value:function(){this.history.pop(),this._updateHistoryLength(),this._notifyChange(a.POP)}},{key:\"getCurrentPath\",value:function(){return this.history[this.history.length-1]}},{key:\"toString\",value:function(){return\"<TestLocation>\"}}]),e}();e.exports=u},function(e,t,n){\"use strict\";var r=n(483),o={updateScrollPosition:function(e,t){switch(t){case r.PUSH:case r.REPLACE:window.scrollTo(0,0);break;case r.POP:e?window.scrollTo(e.x,e.y):window.scrollTo(0,0)}}};e.exports=o},function(e,t){\"use strict\";var n={updateScrollPosition:function(){window.scrollTo(0,0)}};e.exports=n},function(e,t,n){\"use strict\";var r=n(465),o={contextTypes:{router:r.router.isRequired},makePath:function(e,t,n){return this.context.router.makePath(e,t,n)},makeHref:function(e,t,n){return this.context.router.makeHref(e,t,n)},transitionTo:function(e,t,n){this.context.router.transitionTo(e,t,n)},replaceWith:function(e,t,n){this.context.router.replaceWith(e,t,n)},goBack:function(){return this.context.router.goBack()}};e.exports=o},function(e,t,n){\"use strict\";var r=n(465),o={contextTypes:{router:r.router.isRequired},getPath:function(){return this.context.router.getCurrentPath()},getPathname:function(){return this.context.router.getCurrentPathname()},getParams:function(){return this.context.router.getCurrentParams()},getQuery:function(){return this.context.router.getCurrentQuery()},getRoutes:function(){return this.context.router.getCurrentRoutes()},isActive:function(e,t,n){return this.context.router.isActive(e,t,n)}};e.exports=o},function(e,t,n){\"use strict\";function r(e,t,n){e=e||\"UnknownComponent\";for(var r in t)if(t.hasOwnProperty(r)){var o=t[r](n,r,e);o instanceof Error&&l(!1,o.message)}}function o(e){var t=u({},e),n=t.handler;return n&&(t.onEnter=n.willTransitionTo,t.onLeave=n.willTransitionFrom),t}function i(e){if(s.isValidElement(e)){var t=e.type,n=u({},t.defaultProps,e.props);return t.propTypes&&r(t.displayName,t.propTypes,n),t===c?d.createDefaultRoute(o(n)):t===p?d.createNotFoundRoute(o(n)):t===f?d.createRedirect(o(n)):d.createRoute(o(n),function(){n.children&&a(n.children)})}}function a(e){var t=[];return s.Children.forEach(e,function(e){(e=i(e))&&t.push(e)}),t}var s=n(4),u=n(466),l=n(469),c=n(464),p=n(480),f=n(481),d=n(467);e.exports=a},function(e,t,n){(function(t){\"use strict\";function r(e,t){for(var n in t)if(t.hasOwnProperty(n)&&e[n]!==t[n])return!1;return!0}function o(e,t,n,o,i,a){return e.some(function(e){if(e!==t)return!1;for(var s,u=t.paramNames,l=0,c=u.length;l<c;++l)if(s=u[l],o[s]!==n[s])return!1;return r(i,a)&&r(a,i)})}function i(e,t){for(var n,r=0,o=e.length;r<o;++r)n=e[r],n.name&&(f(null==t[n.name],'You may not have more than one route named \"%s\"',n.name),t[n.name]=n),n.childRoutes&&i(n.childRoutes,t)}function a(e,t){return e.some(function(e){return e.name===t})}function s(e,t){for(var n in t)if(String(e[n])!==String(t[n]))return!1;return!0}function u(e,t){for(var n in t)if(String(e[n])!==String(t[n]))return!1;return!0}function l(e){e=e||{},O(e)&&(e={routes:e});var n=[],r=e.location||k,l=e.scrollBehavior||I,v={},R={},A=null,j=null;\"string\"==typeof r&&(r=new b(r)),\nr instanceof b?p(!d||\"test\"===t.env.NODE_ENV,\"You should not use a static location in a DOM environment because the router will not be kept in sync with the current URL\"):f(d||r.needsDOM===!1,\"You cannot use %s without a DOM\",r),r!==y||M()||(r=g);var L=c.createClass({displayName:\"Router\",statics:{isRunning:!1,cancelPendingTransition:function(){A&&(A.cancel(),A=null)},clearAllRoutes:function(){L.cancelPendingTransition(),L.namedRoutes={},L.routes=[]},addRoutes:function(e){O(e)&&(e=_(e)),i(e,L.namedRoutes),L.routes.push.apply(L.routes,e)},replaceRoutes:function(e){L.clearAllRoutes(),L.addRoutes(e),L.refresh()},match:function(e){return T.findMatch(L.routes,e)},makePath:function(e,t,n){var r;if(S.isAbsolute(e))r=e;else{var o=e instanceof D?e:L.namedRoutes[e];f(o instanceof D,'Cannot find a route named \"%s\"',e),r=o.path}return S.withQuery(S.injectParams(r,t),n)},makeHref:function(e,t,n){var o=L.makePath(e,t,n);return r===m?\"#\"+o:o},transitionTo:function(e,t,n){var o=L.makePath(e,t,n);A?r.replace(o):r.push(o)},replaceWith:function(e,t,n){r.replace(L.makePath(e,t,n))},goBack:function(){return P.length>1||r===g?(r.pop(),!0):(p(!1,\"goBack() was ignored because there is no router history\"),!1)},handleAbort:e.onAbort||function(e){if(r instanceof b)throw new Error(\"Unhandled aborted transition! Reason: \"+e);e instanceof x||(e instanceof C?r.replace(L.makePath(e.to,e.params,e.query)):r.pop())},handleError:e.onError||function(e){throw e},handleLocationChange:function(e){L.dispatch(e.path,e.type)},dispatch:function(e,t){L.cancelPendingTransition();var r=v.path,i=null==t;if(r!==e||i){r&&t===h.PUSH&&L.recordScrollPosition(r);var a=L.match(e);p(null!=a,'No route matches path \"%s\". Make sure you have <Route path=\"%s\"> somewhere in your routes',e,e),null==a&&(a={});var s,u,l=v.routes||[],c=v.params||{},f=v.query||{},d=a.routes||[],m=a.params||{},y=a.query||{};l.length?(s=l.filter(function(e){return!o(d,e,c,m,f,y)}),u=d.filter(function(e){return!o(l,e,c,m,f,y)})):(s=[],u=d);var g=new N(e,L.replaceWith.bind(L,e));A=g;var b=n.slice(l.length-s.length);N.from(g,s,b,function(n){return n||g.abortReason?j.call(L,n,g):void N.to(g,u,m,y,function(n){j.call(L,n,g,{path:e,action:t,pathname:a.pathname,routes:d,params:m,query:y})})})}},run:function(e){f(!L.isRunning,\"Router is already running\"),j=function(t,n,r){t&&L.handleError(t),A===n&&(A=null,n.abortReason?L.handleAbort(n.abortReason):e.call(L,L,R=r))},r instanceof b||(r.addChangeListener&&r.addChangeListener(L.handleLocationChange),L.isRunning=!0),L.refresh()},refresh:function(){L.dispatch(r.getCurrentPath(),null)},stop:function(){L.cancelPendingTransition(),r.removeChangeListener&&r.removeChangeListener(L.handleLocationChange),L.isRunning=!1},getLocation:function(){return r},getScrollBehavior:function(){return l},getRouteAtDepth:function(e){var t=v.routes;return t&&t[e]},setRouteComponentAtDepth:function(e,t){n[e]=t},getCurrentPath:function(){return v.path},getCurrentPathname:function(){return v.pathname},getCurrentParams:function(){return v.params},getCurrentQuery:function(){return v.query},getCurrentRoutes:function(){return v.routes},isActive:function(e,t,n){return S.isAbsolute(e)?e===v.path:a(v.routes,e)&&s(v.params,t)&&(null==n||u(v.query,n))}},mixins:[E],propTypes:{children:w.falsy},childContextTypes:{routeDepth:w.number.isRequired,router:w.router.isRequired},getChildContext:function(){return{routeDepth:1,router:L}},getInitialState:function(){return v=R},componentWillReceiveProps:function(){this.setState(v=R)},componentWillUnmount:function(){L.stop()},render:function(){var e=L.getRouteAtDepth(0);return e?c.createElement(e.handler,this.props):null}});return L.clearAllRoutes(),e.routes&&L.addRoutes(e.routes),L}var c=n(4),p=n(469),f=n(468),d=n(485),h=n(483),v=n(490),m=n(482),y=n(486),g=n(487),b=n(488),E=n(496),_=n(494),O=n(498),N=n(499),w=n(465),C=n(501),P=n(484),x=n(500),T=n(502),D=n(467),M=n(503),S=n(470),k=d?m:\"/\",I=d?v:null;e.exports=l}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t){if(!t)return!0;if(e.pathname===t.pathname)return!1;var n=e.routes,r=t.routes,o=n.filter(function(e){return r.indexOf(e)!==-1});return!o.some(function(e){return e.ignoreScrollBehavior})}var o=n(468),i=n(485),a=n(497),s={statics:{recordScrollPosition:function(e){this.scrollHistory||(this.scrollHistory={}),this.scrollHistory[e]=a()},getScrollPosition:function(e){return this.scrollHistory||(this.scrollHistory={}),this.scrollHistory[e]||null}},componentWillMount:function(){o(null==this.constructor.getScrollBehavior()||i,\"Cannot use scroll behavior without a DOM\")},componentDidMount:function(){this._updateScroll()},componentDidUpdate:function(e,t){this._updateScroll(t)},_updateScroll:function(e){if(r(this.state,e)){var t=this.constructor.getScrollBehavior();t&&t.updateScrollPosition(this.constructor.getScrollPosition(this.state.path),this.state.action)}}};e.exports=s},function(e,t,n){\"use strict\";function r(){return o(i,\"Cannot get current scroll position without a DOM\"),{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}}var o=n(468),i=n(485);e.exports=r},function(e,t,n){\"use strict\";function r(e){return null==e||i.isValidElement(e)}function o(e){return r(e)||Array.isArray(e)&&e.every(r)}var i=n(4);e.exports=o},function(e,t,n){\"use strict\";function r(e,t){this.path=e,this.abortReason=null,this.retry=t.bind(this)}var o=n(500),i=n(501);r.prototype.abort=function(e){null==this.abortReason&&(this.abortReason=e||\"ABORT\")},r.prototype.redirect=function(e,t,n){this.abort(new i(e,t,n))},r.prototype.cancel=function(){this.abort(new o)},r.from=function(e,t,n,r){t.reduce(function(t,r,o){return function(i){if(i||e.abortReason)t(i);else if(r.onLeave)try{r.onLeave(e,n[o],t),r.onLeave.length<3&&t()}catch(e){t(e)}else t()}},r)()},r.to=function(e,t,n,r,o){t.reduceRight(function(t,o){return function(i){if(i||e.abortReason)t(i);else if(o.onEnter)try{o.onEnter(e,n,r,t),o.onEnter.length<4&&t()}catch(e){t(e)}else t()}},o)()},e.exports=r},function(e,t){\"use strict\";function n(){}e.exports=n},function(e,t){\"use strict\";function n(e,t,n){this.to=e,this.params=t,this.query=n}e.exports=n},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t,n){var r=e.childRoutes;if(r)for(var i,u,l=0,c=r.length;l<c;++l)if(u=r[l],!u.isDefault&&!u.isNotFound&&(i=o(u,t,n)))return i.routes.unshift(e),i;var p=e.defaultRoute;if(p&&(d=a.extractParams(p.path,t)))return new s(t,d,n,[e,p]);var f=e.notFoundRoute;if(f&&(d=a.extractParams(f.path,t)))return new s(t,d,n,[e,f]);var d=a.extractParams(e.path,t);return d?new s(t,d,n,[e]):null}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(470),s=function(){function e(t,n,o,i){r(this,e),this.pathname=t,this.params=n,this.query=o,this.routes=i}return i(e,null,[{key:\"findMatch\",value:function(e,t){for(var n=a.withoutQuery(t),r=a.extractQuery(t),i=null,s=0,u=e.length;null==i&&s<u;++s)i=o(e[s],n,r);return i}}]),e}();e.exports=s},function(e,t){\"use strict\";function n(){/*! taken from modernizr\n\t   * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n\t   * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n\t   * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586\n\t   */\nvar e=navigator.userAgent;return(e.indexOf(\"Android 2.\")===-1&&e.indexOf(\"Android 4.0\")===-1||e.indexOf(\"Mobile Safari\")===-1||e.indexOf(\"Chrome\")!==-1||e.indexOf(\"Windows Phone\")!==-1)&&(window.history&&\"pushState\"in window.history)}e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n){\"function\"==typeof t&&(n=t,t=null);var r=o({routes:e,location:t});return r.run(n),r}var o=n(495);e.exports=r},,,,,,,function(e,t,n){e.exports=n(512)},function(e,t,n){(function(t){\"use strict\";var r=n(513),o=n(5),i=n(516),a=n(517),s=n(13),u=n(518),l=n(29),c=n(526),p=n(520),f=n(527);o.addons={CSSTransitionGroup:a,LinkedStateMixin:r,PureRenderMixin:i,TransitionGroup:u,batchedUpdates:l.batchedUpdates,classSet:c,cloneWithProps:p,createFragment:s.create,update:f},\"production\"!==t.env.NODE_ENV&&(o.addons.Perf=n(153),o.addons.TestUtils=n(528)),e.exports=o}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(514),o=n(515),i={linkState:function(e){return new r(this.state[e],o.createStateKeySetter(this,e))}};e.exports=i},function(e,t,n){\"use strict\";function r(e,t){this.value=e,this.requestChange=t}function o(e){var t={value:\"undefined\"==typeof e?i.PropTypes.any.isRequired:e.isRequired,requestChange:i.PropTypes.func.isRequired};return i.PropTypes.shape(t)}var i=n(5);r.PropTypes={link:o},e.exports=r},function(e,t){\"use strict\";function n(e,t){var n={};return function(r){n[t]=r,e.setState(n)}}var r={createStateSetter:function(e,t){return function(n,r,o,i,a,s){var u=t.call(e,n,r,o,i,a,s);u&&e.setState(u)}},createStateKeySetter:function(e,t){var r=e.__keySetters||(e.__keySetters={});return r[t]||(r[t]=n(e,t))}};r.Mixin={createStateSetter:function(e){return r.createStateSetter(this,e)},createStateKeySetter:function(e){return r.createStateKeySetter(this,e)}},e.exports=r},function(e,t,n){\"use strict\";var r=n(140),o={shouldComponentUpdate:function(e,t){return!r(this.props,e)||!r(this.state,t)}};e.exports=o},function(e,t,n){\"use strict\";var r=n(5),o=n(16),i=r.createFactory(n(518)),a=r.createFactory(n(523)),s=r.createClass({displayName:\"ReactCSSTransitionGroup\",propTypes:{transitionName:r.PropTypes.string.isRequired,transitionAppear:r.PropTypes.bool,transitionEnter:r.PropTypes.bool,transitionLeave:r.PropTypes.bool},getDefaultProps:function(){return{transitionAppear:!1,transitionEnter:!0,transitionLeave:!0}},_wrapChild:function(e){return a({name:this.props.transitionName,appear:this.props.transitionAppear,enter:this.props.transitionEnter,leave:this.props.transitionLeave},e)},render:function(){return i(o({},this.props,{childFactory:this._wrapChild}))}});e.exports=s},function(e,t,n){\"use strict\";var r=n(5),o=n(519),i=n(16),a=n(520),s=n(19),u=r.createClass({displayName:\"ReactTransitionGroup\",propTypes:{component:r.PropTypes.any,childFactory:r.PropTypes.func},getDefaultProps:function(){return{component:\"span\",childFactory:s.thatReturnsArgument}},getInitialState:function(){return{children:o.getChildMapping(this.props.children)}},componentWillMount:function(){this.currentlyTransitioningKeys={},this.keysToEnter=[],this.keysToLeave=[]},componentDidMount:function(){var e=this.state.children;for(var t in e)e[t]&&this.performAppear(t)},componentWillReceiveProps:function(e){var t=o.getChildMapping(e.children),n=this.state.children;this.setState({children:o.mergeChildMappings(n,t)});var r;for(r in t){var i=n&&n.hasOwnProperty(r);!t[r]||i||this.currentlyTransitioningKeys[r]||this.keysToEnter.push(r)}for(r in n){var a=t&&t.hasOwnProperty(r);!n[r]||a||this.currentlyTransitioningKeys[r]||this.keysToLeave.push(r)}},componentDidUpdate:function(){var e=this.keysToEnter;this.keysToEnter=[],e.forEach(this.performEnter);var t=this.keysToLeave;this.keysToLeave=[],t.forEach(this.performLeave)},performAppear:function(e){this.currentlyTransitioningKeys[e]=!0;var t=this.refs[e];t.componentWillAppear?t.componentWillAppear(this._handleDoneAppearing.bind(this,e)):this._handleDoneAppearing(e)},_handleDoneAppearing:function(e){var t=this.refs[e];t.componentDidAppear&&t.componentDidAppear(),delete this.currentlyTransitioningKeys[e];var n=o.getChildMapping(this.props.children);n&&n.hasOwnProperty(e)||this.performLeave(e)},performEnter:function(e){this.currentlyTransitioningKeys[e]=!0;var t=this.refs[e];t.componentWillEnter?t.componentWillEnter(this._handleDoneEntering.bind(this,e)):this._handleDoneEntering(e)},_handleDoneEntering:function(e){var t=this.refs[e];t.componentDidEnter&&t.componentDidEnter(),delete this.currentlyTransitioningKeys[e];var n=o.getChildMapping(this.props.children);n&&n.hasOwnProperty(e)||this.performLeave(e)},performLeave:function(e){this.currentlyTransitioningKeys[e]=!0;var t=this.refs[e];t.componentWillLeave?t.componentWillLeave(this._handleDoneLeaving.bind(this,e)):this._handleDoneLeaving(e)},_handleDoneLeaving:function(e){var t=this.refs[e];t.componentDidLeave&&t.componentDidLeave(),delete this.currentlyTransitioningKeys[e];var n=o.getChildMapping(this.props.children);if(n&&n.hasOwnProperty(e))this.performEnter(e);else{var r=i({},this.state.children);delete r[e],this.setState({children:r})}},render:function(){var e=[];for(var t in this.state.children){var n=this.state.children[t];n&&e.push(a(this.props.childFactory(n),{ref:t,key:t}))}return r.createElement(this.props.component,this.props,e)}});e.exports=u},function(e,t,n){\"use strict\";var r=n(11),o=n(13),i={getChildMapping:function(e){return e?o.extract(r.map(e,function(e){return e})):e},mergeChildMappings:function(e,t){function n(n){return t.hasOwnProperty(n)?t[n]:e[n]}e=e||{},t=t||{};var r={},o=[];for(var i in e)t.hasOwnProperty(i)?o.length&&(r[i]=o,o=[]):o.push(i);var a,s={};for(var u in t){if(r.hasOwnProperty(u))for(a=0;a<r[u].length;a++){var l=r[u][a];s[r[u][a]]=n(l)}s[u]=n(u)}for(a=0;a<o.length;a++)s[o[a]]=n(o[a]);return s}};e.exports=i},function(e,t,n){(function(t){\"use strict\";function r(e,n){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?s(!e.ref,\"You are calling cloneWithProps() on a child with a ref. This is dangerous because you're creating a new child which will not be added as a ref to its parent.\"):null);var r=i.mergeProps(n,e.props);return!r.hasOwnProperty(u)&&e.props.hasOwnProperty(u)&&(r.children=e.props.children),o.createElement(e.type,r)}var o=n(14),i=n(521),a=n(42),s=n(18),u=a({children:null});e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return function(t,n,r){t.hasOwnProperty(n)?t[n]=e(t[n],r):t[n]=r}}function o(e,t){for(var n in t)if(t.hasOwnProperty(n)){var r=l[n];r&&l.hasOwnProperty(n)?r(e,n,t[n]):e.hasOwnProperty(n)||(e[n]=t[n])}return e}var i=n(16),a=n(19),s=n(522),u=r(function(e,t){return i({},t,e)}),l={children:a,className:r(s),style:u},c={mergeProps:function(e,t){return o(i({},e),t)}};e.exports=c},function(e,t){\"use strict\";function n(e){e||(e=\"\");var t,n=arguments.length;if(n>1)for(var r=1;r<n;r++)t=arguments[r],t&&(e=(e?e+\" \":\"\")+t);return e}e.exports=n},function(e,t,n){(function(t){\"use strict\";var r=n(5),o=n(524),i=n(525),a=n(159),s=n(18),u=17,l=5e3,c=null;\"production\"!==t.env.NODE_ENV&&(c=function(){\"production\"!==t.env.NODE_ENV?s(!1,\"transition(): tried to perform an animation without an animationend or transitionend event after timeout (%sms). You should either disable this transition in JS or add a CSS animation/transition.\",l):null});var p=r.createClass({displayName:\"ReactCSSTransitionGroupChild\",transition:function(e,n){var r=this.getDOMNode(),a=this.props.name+\"-\"+e,s=a+\"-active\",u=null,p=function(e){e&&e.target!==r||(\"production\"!==t.env.NODE_ENV&&clearTimeout(u),o.removeClass(r,a),o.removeClass(r,s),i.removeEndEventListener(r,p),n&&n())};i.addEndEventListener(r,p),o.addClass(r,a),this.queueClass(s),\"production\"!==t.env.NODE_ENV&&(u=setTimeout(c,l))},queueClass:function(e){this.classNameQueue.push(e),this.timeout||(this.timeout=setTimeout(this.flushClassNameQueue,u))},flushClassNameQueue:function(){this.isMounted()&&this.classNameQueue.forEach(o.addClass.bind(o,this.getDOMNode())),this.classNameQueue.length=0,this.timeout=null},componentWillMount:function(){this.classNameQueue=[]},componentWillUnmount:function(){this.timeout&&clearTimeout(this.timeout)},componentWillAppear:function(e){this.props.appear?this.transition(\"appear\",e):e()},componentWillEnter:function(e){this.props.enter?this.transition(\"enter\",e):e()},componentWillLeave:function(e){this.props.leave?this.transition(\"leave\",e):e()},render:function(){return a(this.props.children)}});e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){var r=n(10),o={addClass:function(e,n){return\"production\"!==t.env.NODE_ENV?r(!/\\s/.test(n),'CSSCore.addClass takes only a single class name. \"%s\" contains multiple classes.',n):r(!/\\s/.test(n)),n&&(e.classList?e.classList.add(n):o.hasClass(e,n)||(e.className=e.className+\" \"+n)),e},removeClass:function(e,n){return\"production\"!==t.env.NODE_ENV?r(!/\\s/.test(n),'CSSCore.removeClass takes only a single class name. \"%s\" contains multiple classes.',n):r(!/\\s/.test(n)),n&&(e.classList?e.classList.remove(n):o.hasClass(e,n)&&(e.className=e.className.replace(new RegExp(\"(^|\\\\s)\"+n+\"(?:\\\\s|$)\",\"g\"),\"$1\").replace(/\\s+/g,\" \").replace(/^\\s*|\\s*$/g,\"\"))),e},conditionClass:function(e,t,n){return(n?o.addClass:o.removeClass)(e,t)},hasClass:function(e,n){return\"production\"!==t.env.NODE_ENV?r(!/\\s/.test(n),\"CSS.hasClass takes only a single class name.\"):r(!/\\s/.test(n)),e.classList?!!n&&e.classList.contains(n):(\" \"+e.className+\" \").indexOf(\" \"+n+\" \")>-1}};e.exports=o}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){var e=document.createElement(\"div\"),t=e.style;\"AnimationEvent\"in window||delete s.animationend.animation,\"TransitionEvent\"in window||delete s.transitionend.transition;for(var n in s){var r=s[n];for(var o in r)if(o in t){u.push(r[o]);break}}}function o(e,t,n){e.addEventListener(t,n,!1)}function i(e,t,n){e.removeEventListener(t,n,!1)}var a=n(54),s={transitionend:{transition:\"transitionend\",WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"mozTransitionEnd\",OTransition:\"oTransitionEnd\",msTransition:\"MSTransitionEnd\"},animationend:{animation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\",MozAnimation:\"mozAnimationEnd\",OAnimation:\"oAnimationEnd\",msAnimation:\"MSAnimationEnd\"}},u=[];a.canUseDOM&&r();var l={addEndEventListener:function(e,t){return 0===u.length?void window.setTimeout(t,0):void u.forEach(function(n){o(e,n,t)})},removeEndEventListener:function(e,t){0!==u.length&&u.forEach(function(n){i(e,n,t)})}};e.exports=l},function(e,t,n){(function(t){\"use strict\";function r(e){return\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?o(i,\"React.addons.classSet will be deprecated in a future version. See http://fb.me/react-addons-classset\"):null,i=!0),\"object\"==typeof e?Object.keys(e).filter(function(t){return e[t]}).join(\" \"):Array.prototype.join.call(arguments,\" \")}var o=n(18),i=!1;e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return Array.isArray(e)?e.concat():e&&\"object\"==typeof e?a(new e.constructor,e):e}function o(e,n,r){\"production\"!==t.env.NODE_ENV?u(Array.isArray(e),\"update(): expected target of %s to be an array; got %s.\",r,e):u(Array.isArray(e));var o=n[r];\"production\"!==t.env.NODE_ENV?u(Array.isArray(o),\"update(): expected spec of %s to be an array; got %s. Did you forget to wrap your parameter in an array?\",r,o):u(Array.isArray(o))}function i(e,n){if(\"production\"!==t.env.NODE_ENV?u(\"object\"==typeof n,\"update(): You provided a key path to update() that did not contain one of %s. Did you forget to include {%s: ...}?\",m.join(\", \"),d):u(\"object\"==typeof n),l.call(n,d))return\"production\"!==t.env.NODE_ENV?u(1===Object.keys(n).length,\"Cannot have more than one key in an object with %s\",d):u(1===Object.keys(n).length),n[d];var s=r(e);if(l.call(n,h)){var g=n[h];\"production\"!==t.env.NODE_ENV?u(g&&\"object\"==typeof g,\"update(): %s expects a spec of type 'object'; got %s\",h,g):u(g&&\"object\"==typeof g),\"production\"!==t.env.NODE_ENV?u(s&&\"object\"==typeof s,\"update(): %s expects a target of type 'object'; got %s\",h,s):u(s&&\"object\"==typeof s),a(s,n[h])}l.call(n,c)&&(o(e,n,c),n[c].forEach(function(e){s.push(e)})),l.call(n,p)&&(o(e,n,p),n[p].forEach(function(e){s.unshift(e)})),l.call(n,f)&&(\"production\"!==t.env.NODE_ENV?u(Array.isArray(e),\"Expected %s target to be an array; got %s\",f,e):u(Array.isArray(e)),\"production\"!==t.env.NODE_ENV?u(Array.isArray(n[f]),\"update(): expected spec of %s to be an array of arrays; got %s. Did you forget to wrap your parameters in an array?\",f,n[f]):u(Array.isArray(n[f])),n[f].forEach(function(e){\"production\"!==t.env.NODE_ENV?u(Array.isArray(e),\"update(): expected spec of %s to be an array of arrays; got %s. Did you forget to wrap your parameters in an array?\",f,n[f]):u(Array.isArray(e)),s.splice.apply(s,e)})),l.call(n,v)&&(\"production\"!==t.env.NODE_ENV?u(\"function\"==typeof n[v],\"update(): expected spec of %s to be a function; got %s.\",v,n[v]):u(\"function\"==typeof n[v]),s=n[v](s));for(var b in n)y.hasOwnProperty(b)&&y[b]||(s[b]=i(e[b],n[b]));return s}var a=n(16),s=n(42),u=n(10),l={}.hasOwnProperty,c=s({$push:null}),p=s({$unshift:null}),f=s({$splice:null}),d=s({$set:null}),h=s({$merge:null}),v=s({$apply:null}),m=[c,p,f,d,h,v],y={};m.forEach(function(e){y[e]=!0}),e.exports=i}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){}function o(e){return function(t,n){var o;N.isDOMComponent(t)?o=t.getDOMNode():t.tagName&&(o=t);var i=new r;i.target=o;var a=new b(d.eventNameDispatchConfigs[e],y.getID(o),i);E(a,n),l.accumulateTwoPhaseDispatches(a),g.batchedUpdates(function(){u.enqueueEvents(a),u.processEventQueue()})}}function i(){N.Simulate={};var e;for(e in d.eventNameDispatchConfigs)N.Simulate[e]=o(e)}function a(e){return function(t,n){var o=new r(e);E(o,n),N.isDOMComponent(t)?N.simulateNativeEventOnDOMComponent(e,t,o):t.tagName&&N.simulateNativeEventOnNode(e,t,o)}}var s=n(8),u=n(72),l=n(96),c=n(5),p=n(14),f=n(79),d=n(71),h=n(87),v=n(22),m=n(28),y=n(70),g=n(29),b=n(100),E=n(16),_=n(17),O=s.topLevelTypes,N={renderIntoDocument:function(e){var t=document.createElement(\"div\");return c.render(e,t)},isElement:function(e){return p.isValidElement(e)},isElementOfType:function(e,t){return p.isValidElement(e)&&e.type===t},isDOMComponent:function(e){return!!(e&&e.tagName&&e.getDOMNode)},isDOMComponentElement:function(e){return!!(e&&p.isValidElement(e)&&e.tagName)},isCompositeComponent:function(e){return\"function\"==typeof e.render&&\"function\"==typeof e.setState},isCompositeComponentWithType:function(e,t){return!(!N.isCompositeComponent(e)||e.constructor!==t)},isCompositeComponentElement:function(e){if(!p.isValidElement(e))return!1;var t=e.type.prototype;return\"function\"==typeof t.render&&\"function\"==typeof t.setState},isCompositeComponentElementWithType:function(e,t){return!(!N.isCompositeComponentElement(e)||e.constructor!==t)},getRenderedChildOfCompositeComponent:function(e){if(!N.isCompositeComponent(e))return null;var t=m.get(e);return t._renderedComponent.getPublicInstance()},findAllInRenderedTree:function(e,t){if(!e)return[];var n=t(e)?[e]:[];if(N.isDOMComponent(e)){var r,o=m.get(e),i=o._renderedComponent._renderedChildren;for(r in i)i.hasOwnProperty(r)&&i[r].getPublicInstance&&(n=n.concat(N.findAllInRenderedTree(i[r].getPublicInstance(),t)))}else N.isCompositeComponent(e)&&(n=n.concat(N.findAllInRenderedTree(N.getRenderedChildOfCompositeComponent(e),t)));return n},scryRenderedDOMComponentsWithClass:function(e,t){return N.findAllInRenderedTree(e,function(e){var n=e.props.className;return N.isDOMComponent(e)&&n&&(\" \"+n+\" \").indexOf(\" \"+t+\" \")!==-1})},findRenderedDOMComponentWithClass:function(e,t){var n=N.scryRenderedDOMComponentsWithClass(e,t);if(1!==n.length)throw new Error(\"Did not find exactly one match (found: \"+n.length+\") for class:\"+t);return n[0]},scryRenderedDOMComponentsWithTag:function(e,t){return N.findAllInRenderedTree(e,function(e){return N.isDOMComponent(e)&&e.tagName===t.toUpperCase()})},findRenderedDOMComponentWithTag:function(e,t){var n=N.scryRenderedDOMComponentsWithTag(e,t);if(1!==n.length)throw new Error(\"Did not find exactly one match for tag:\"+t);return n[0]},scryRenderedComponentsWithType:function(e,t){return N.findAllInRenderedTree(e,function(e){return N.isCompositeComponentWithType(e,t)})},findRenderedComponentWithType:function(e,t){var n=N.scryRenderedComponentsWithType(e,t);if(1!==n.length)throw new Error(\"Did not find exactly one match for componentType:\"+t);return n[0]},mockComponent:function(e,t){return t=t||e.mockTagName||\"div\",e.prototype.render.mockImplementation(function(){return c.createElement(t,null,this.props.children)}),this},simulateNativeEventOnNode:function(e,t,n){n.target=t,d.ReactEventListener.dispatchEvent(e,n)},simulateNativeEventOnDOMComponent:function(e,t,n){N.simulateNativeEventOnNode(e,t.getDOMNode(),n)},nativeTouchData:function(e,t){return{touches:[{pageX:e,pageY:t}]}},createRenderer:function(){return new w},Simulate:null,SimulateNative:{}},w=function(){this._instance=null};w.prototype.getRenderOutput=function(){return this._instance&&this._instance._renderedComponent&&this._instance._renderedComponent._renderedOutput||null};var C=function(e){this._renderedOutput=e,this._currentElement=null===e||e===!1?f.emptyElement:e};C.prototype={mountComponent:function(){},receiveComponent:function(e){this._renderedOutput=e,this._currentElement=null===e||e===!1?f.emptyElement:e},unmountComponent:function(){}};var P=function(){};E(P.prototype,h.Mixin,{_instantiateReactComponent:function(e){return new C(e)},_replaceNodeWithMarkupByID:function(){},_renderValidatedComponent:h.Mixin._renderValidatedComponentWithoutOwnerOrContext}),w.prototype.render=function(e,t){t||(t=_);var n=g.ReactReconcileTransaction.getPooled();this._render(e,n,t),g.ReactReconcileTransaction.release(n)},w.prototype.unmount=function(){this._instance&&this._instance.unmountComponent()},w.prototype._render=function(e,t,n){if(this._instance)this._instance.receiveComponent(e,t,n);else{var r=v.createReactRootID(),o=new P(e.type);o.construct(e),o.mountComponent(r,t,n),this._instance=o}};var x=u.injection.injectEventPluginOrder;u.injection.injectEventPluginOrder=function(){x.apply(this,arguments),i()};var T=u.injection.injectEventPluginsByName;u.injection.injectEventPluginsByName=function(){T.apply(this,arguments),i()},i();var D;for(D in O){var M=0===D.indexOf(\"top\")?D.charAt(3).toLowerCase()+D.substr(4):D;N.SimulateNative[M]=a(D)}e.exports=N}]);"
  },
  {
    "path": "client/common.js",
    "content": "var { FancyWebSocket } = require(\"./utils/FancyWebSocket\");\nvar ConnectionMonitor = require(\"./components/ConnectionMonitor.jsx\");\nvar ProcessStats = require(\"./components/ProcessStats.jsx\");\n\n$(window).ready(function() {\n    ConnectionMonitor.install(\"monitor\");\n    ProcessStats.installHeader(\"process-stats\");\n});\n"
  },
  {
    "path": "client/components/ConnectionMonitor.jsx",
    "content": "/*\nA widget which shows if a server is idle/crawling or if we're not connected.\n*/\n\nvar React = require('react');\nvar Reflux = require('reflux');\nvar { Label } = require('react-bootstrap');\nvar ConnectionStore = require(\"../stores/ConnectionStore\");\n\n\nvar ConnectionMonitorWidget = React.createClass({\n    STATE_CLASSES: {\n        'offline': 'danger',\n        'online': 'info',\n        'crawling': 'success'\n    },\n\n    render: function () {\n        var cls = this.STATE_CLASSES[this.props.status] || \"default\";\n        return (\n            <Label bsStyle={cls} title=\"reconnect\" style={{cursor:\"pointer\"}} onClick={this.onClick}>\n                {this.props.status}\n            </Label>\n        );\n    },\n\n    onClick: function () {\n        ConnectionStore.Actions.reconnect();\n    }\n});\n\n\nvar ConnectionMonitor = React.createClass({\n    mixins: [Reflux.connect(ConnectionStore.store, \"status\")],\n    render: function () {\n        return <ConnectionMonitorWidget status={this.state.status}/>;\n    }\n});\n\nexport function install(elemId) {\n    React.render(<ConnectionMonitor />, document.getElementById(elemId));\n}\n"
  },
  {
    "path": "client/components/CrawlForm.jsx",
    "content": "/* A form for starting the crawl */\n\nvar React = require(\"react\");\nvar { Panel } = require(\"react-bootstrap\");\n\nvar JobStore = require(\"../stores/JobStore\");\n\n\nexport var CrawlForm = React.createClass({\n    getInitialState: function () {\n        return {value: \"\"};\n    },\n\n    render: function () {\n        // it must be rendered inside a small bootstrap Panel\n        var noPadding = {\n            paddingLeft: 0, paddingRight: 0, marginLeft: 0, marginRight: 0\n        };\n        return (\n            <form method=\"post\" className=\"container-fluid\" style={noPadding}\n                  action={this.props.action} onSubmit={this.onSubmit}>\n                <div className=\"form-group row\" style={noPadding}>\n                    <div className=\"col-xs-2\"  style={noPadding}>\n                        <button type=\"submit\" className=\"btn btn-success\" style={{width:\"100%\"}}>Crawl</button>\n                    </div>\n                    <div className=\"col-xs-10\"  style={noPadding}>\n                        <input type=\"text\" className=\"form-control\" name=\"domain\"\n                               ref=\"domainInput\" value={this.state.value}\n                               onChange={this.onChange}\n                               placeholder=\"website URL, e.g. scrapy.org\"/>\n                    </div>\n                </div>\n            </form>\n\n        );\n    },\n\n    onChange: function (ev) {\n        this.setState({value: this.refs.domainInput.getDOMNode().value});\n    },\n\n    onSubmit: function (ev) {\n        ev.preventDefault();\n        if (this.state.value != \"\") {\n            JobStore.Actions.startCrawl(this.state.value);\n            this.setState({value: \"\"});\n        }\n    }\n});\n\n"
  },
  {
    "path": "client/components/JobList.jsx",
    "content": "/* A list of active crawl jobs */\n\nvar React = require(\"react\");\nvar Reflux = require(\"reflux\");\nvar filesize = require(\"filesize\");\nvar prettyMs = require('pretty-ms');\nvar { Link, Navigation } = require('react-router');\n\nvar { Table, Glyphicon, Button } = require(\"react-bootstrap\");\nvar JobStore = require(\"../stores/JobStore\");\nvar { JobsMixin } = require(\"./RefluxMixins\");\nvar ProcessStatsStore = require(\"../stores/ProcessStatsStore\");\n\n\nrequire(\"babel-core/polyfill\");\n\n\nvar STATUS_CLASSES = {\n    'crawling': 'success',\n    'stopping': 'info',\n    'suspended': 'warning',\n    'done': ''\n};\n\nvar SIMPLER_STATUSES = [\n    [/closespider/, \"closed\"],\n];\n\nfunction simplifiedStatus(status) {\n    for (var i=0; i< SIMPLER_STATUSES.length; i++) {\n        var [re, simple] = SIMPLER_STATUSES[i];\n        if (re.test(status)){\n            return simple;\n        }\n    }\n    return status;\n}\n\n\nvar NoJobs = React.createClass({\n    render: function () {\n        return (<div>\n            <p>没有任务运行.</p>\n            <p>请通过\"新增任务\"或\"读取配置\"开始采集.</p>\n        </div>);\n    }\n});\n\nvar GlyphA = React.createClass({\n    render: function () {\n        var txt = this.props.button ? \" \" + this.props.title : \"\";\n        return (\n            <a href='#' {...this.props}>\n                <Glyphicon glyph={this.props.glyph} />{txt}\n            </a>\n        )\n    },\n});\n\n\nexport var JobStopButton = React.createClass({\n    render: function () {\n        return <GlyphA title=\"Stop\" glyph=\"stop\" onClick={this.onClick}\n                       button={this.props.button} className={this.props.className} />;\n    },\n\n    onClick: function (ev) {\n        ev.preventDefault();\n        var id = this.props.job.id;\n        if (confirm(\"Stop job #\" + id + \"?\")){\n            JobStore.Actions.stopCrawl(id);\n        }\n    }\n});\n\n\nexport var JobPauseButton = React.createClass({\n    render: function () {\n        return <GlyphA title=\"Pause\" glyph=\"pause\" onClick={this.onClick}\n                       button={this.props.button} className={this.props.className}  />;\n    },\n\n    onClick: function (ev) {\n        ev.preventDefault();\n        JobStore.Actions.pauseCrawl(this.props.job.id);\n    }\n});\n\n\nexport var JobResumeButton = React.createClass({\n    render: function () {\n        return <GlyphA title=\"Resume\" glyph=\"play\" onClick={this.onClick}\n                       button={this.props.button} className={this.props.className}  />;\n    },\n\n    onClick: function (ev) {\n        ev.preventDefault();\n        JobStore.Actions.resumeCrawl(this.props.job.id);\n    }\n});\n\nexport function buttonsForStatus(status){\n    var status = simplifiedStatus(status);\n    if (status == \"crawling\") {\n        return {pause: true, stop: true}\n    }\n    else if (status == \"suspended\") {\n        return {resume: true, stop: true}\n    }\n    return {}\n}\n\nexport var JobControlIcons = React.createClass({\n    render: function () {\n        var job = this.props.job;\n        var active = buttonsForStatus(job.status);\n        var props = {job: job};\n\n        var items = [];\n        if (active.pause) {\n            items.push(<span key=\"pause\"><JobPauseButton {...props} />&nbsp;&nbsp;</span>);\n        }\n        if (active.resume) {\n            items.push(<span key=\"resume\"><JobResumeButton {...props} />&nbsp;&nbsp;</span>);\n        }\n        if (active.stop) {\n            items.push(<JobStopButton key=\"stop\" {...props} />);\n        }\n        return <span>{items}</span>;\n    }\n});\n\n\nexport var JobControlButtons = React.createClass({\n    render: function () {\n        var job = this.props.job;\n        var active = buttonsForStatus(job.status);\n        var props = {button: true, job: job};\n\n        var items = [];\n        if (active.pause) {\n            items.push(<span key=\"pause\"><JobPauseButton className=\"btn\" {...props} />&nbsp;&nbsp;</span>);\n        }\n        if (active.resume) {\n            items.push(<span key=\"resume\"><JobResumeButton className=\"btn\" {...props} />&nbsp;&nbsp;</span>);\n        }\n        if (active.stop) {\n            items.push(<JobStopButton key=\"stop\" className=\"btn\" {...props} />);\n        }\n        return <span>{items}</span>;\n    }\n});\n\n\n/* Parse a date returned by Scrapy */\nvar _parseDate = function (dt) {\n    var dt = dt.replace(\" \", \"T\");\n    return new Date(dt+\"Z\");\n};\n\n/* Return a string like 1202 @ 15/sec */\nfunction _formatItemSpeed(info) {\n    var count = info.stats['item_scraped_count'] || 0;\n    var speed = Math.round(info.itemsSpeed * 60);\n    return count + \" @ \" + speed + \"/min\";\n}\n\n\nfunction _getRowInfo(job, curTime){\n    var stats = job.stats || {};\n    var status = simplifiedStatus(job.status);\n    var downloaded = stats['downloader/response_bytes'] || 0;\n\n\n    var shortId = job.id;\n    if (job.job_id) {\n        shortId = shortId + \": \" + job.job_id.slice(-5);\n    }\n\n    var duration = 0;\n    if (stats['start_time']) {\n        var start = _parseDate(stats['start_time']);\n        if (stats['finish_time']){\n            var end = _parseDate(stats['finish_time']);\n        }\n        else {\n            var end = curTime || new Date();\n        }\n        duration = end.getTime() - start.getTime();\n    }\n\n    var durationSec = duration / 1000;\n    var downloadSpeed = duration ? downloaded / (durationSec): 0;\n    var itemsSpeed = duration ? (stats['item_scraped_count'] || 0) / durationSec : 0;\n\n    return {\n        id: job.job_id || job.id,\n        status: status,\n        rowClass: STATUS_CLASSES[status] || \"\",\n        stats: stats,\n        downloaded: downloaded,\n        downloadSpeed: downloadSpeed,\n        itemsSpeed: itemsSpeed,\n        todo: (stats['scheduler/enqueued'] || 0) - (stats['scheduler/dequeued'] || 0),\n        shortId: shortId,\n        duration: duration\n    }\n}\n\n\nvar JobRow = React.createClass({\n    mixins: [Navigation],\n    render: function () {\n        var job = this.props.job;\n        var info = _getRowInfo(job, this.props.serverTime);\n        var style = {cursor: \"pointer\"};\n        var cb = () => { this.transitionTo(\"job\", {id: job.id}) };\n\n        var columns = [\n            <td key='col-buttons'><JobControlIcons job={job}/></td>,\n            <th key='col-id' scope=\"row\" style={style} onClick={cb}>{info.shortId}</th>\n        ];\n\n        var data = [\n            job.seed,\n            info.status,\n            _formatItemSpeed(info),\n            filesize(info.downloaded),\n            prettyMs(info.duration),\n        ];\n\n        columns = columns.concat(\n            data.map((v,i) => <td style={style} onClick={cb} key={i}>{v}</td>)\n        );\n\n        return <tr className={info.rowClass}>{columns}</tr>;\n    }\n});\n\n\nvar JobRowVerbose = React.createClass({\n    mixins: [Navigation],\n    render: function () {\n        var job = this.props.job;\n        var info = _getRowInfo(job, this.props.serverTime);\n        var columns = [\n            <th key='col-id' scope=\"row\">{info.id}</th>\n        ];\n        var data = [\n            job.seed,\n            info.stats['start_time'],\n            info.status,\n            _formatItemSpeed(info),\n            info.todo,\n            filesize(info.downloaded),\n            filesize(info.downloadSpeed, {round: 1}) + \"/s\",\n            prettyMs(info.duration),\n        ];\n\n        columns = columns.concat(data.map((v,i) => <td key={i}>{v}</td>));\n        return <tr className={info.rowClass}>{columns}</tr>;\n    }\n});\n\n\nexport var JobListWidget = React.createClass({\n    mixins: [\n        Reflux.connect(ProcessStatsStore.store, \"stats\"),\n    ],\n\n    render: function () {\n        var stats = this.state.stats;\n        var rows = this.props.jobs.map(job => {\n            return <JobRow job={job} key={job.id} serverTime={stats.serverTime} />;\n        });\n        return <Table fill hover={this.props.link}>\n            <thead>\n                <tr>\n                    <th key='col-buttons'></th>\n                    <th key='col-id'>ID</th>\n                    <th key='col-seed'>主域名</th>\n                    <th key='col-status'>状态</th>\n                    <th key='col-items'>速率</th>\n                    <th key='col-data' className=\"col-md-2\">数据量</th>\n                    <th key='col-runtime' className=\"col-md-2\">用时</th>\n                </tr>\n            </thead>\n            <tbody>{rows}</tbody>\n        </Table>;\n    }\n});\n\n\nexport var JobListWidgetVerbose = React.createClass({\n    mixins: [\n        Reflux.connect(ProcessStatsStore.store, \"stats\"),\n    ],\n    render: function () {\n        var stats = this.state.stats;\n        var rows = this.props.jobs.map(job => {\n            return <JobRowVerbose job={job} key={job.id} serverTime={stats.serverTime} />;\n        });\n        return <Table fill>\n            <thead>\n                <tr>\n                    <th key='col-id'>ID</th>\n                    <th key='col-seed'>主域名</th>\n                    <th key='col-started'>开始时间</th>\n                    <th key='col-status'>状态</th>\n                    <th key='col-items'>速率</th>\n                    <th key='col-queue'>待请求</th>\n                    <th key='col-data' className=\"col-md-1\">数据量</th>\n                    <th key='col-speed' className=\"col-md-1\">↓ 网速</th>\n                    <th key='col-runtime'>用时</th>\n                </tr>\n            </thead>\n            <tbody>{rows}</tbody>\n        </Table>;\n    }\n\n});\n\n\nexport var JobList = React.createClass({\n    mixins: [JobsMixin],\n    render: function () {\n        var jobs = this.state.jobs;\n        if (!jobs.length) {\n            return <NoJobs/>;\n        }\n        return <JobListWidget jobs={jobs} />;\n    }\n});\n"
  },
  {
    "path": "client/components/JobStats.jsx",
    "content": "/* A widget for displaying crawl stats */\nvar React = require(\"react\");\nvar Reflux = require(\"reflux\");\nvar filesize = require(\"filesize\");\nvar { Table } = require(\"react-bootstrap\");\nvar { KeyValueTable } = require(\"./KeyValueTable\");\n\nvar JobStore = require(\"../stores/JobStore\");\nvar { JobsMixin } = require(\"./RefluxMixins\");\n\nvar range = (top) => Array.from(new Array(top), (_,i) => i);\n\nvar _response_status_count_keys = [\n    200, 201, 202, 203, 204, 205, 206, 207, 226,\n    300, 301, 302, 303, 304, 305, 306, 307,\n    400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418,\n    422, 423, 424, 425, 426, 428, 429, 431, 434, 449, 451, 456, 499,\n    500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511\n].map(status => 'downloader/response_status_count/' + status);\n\nvar _request_depth_keys = range(20).map(i => 'request_depth_count/' + i);\n\nvar SUM_KEYS = [\n    'downloader/request_bytes',\n    'downloader/request_count',\n    'downloader/request_method_count/GET',\n    'downloader/request_method_count/POST',\n    'downloader/request_method_count/PUT',\n    'downloader/request_method_count/HEAD',\n    'downloader/request_method_count/DELETE',\n    'downloader/request_method_count/TRACE',\n    'downloader/request_method_count/CONNECT',\n    'downloader/request_method_count/OPTIONS',\n    'downloader/response_bytes',\n    'downloader/response_count',\n].concat(_response_status_count_keys).concat([\n    'downloader/exception_count',\n    'downloader/exception_type_count/twisted.internet.error.DNSLookupError',\n    'downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError',\n    'dupefilter/filtered',\n    'item_scraped_count',\n    'log_count/DEBUG',\n    'log_count/INFO',\n    'log_count/WARNING',\n    'log_count/ERROR',\n    'response_received_count',\n    'scheduler/dequeued',\n    'scheduler/dequeued/memory',\n    'scheduler/enqueued',\n    'scheduler/enqueued/memory'\n]).concat(_request_depth_keys).concat([\n    'spider_exceptions/AttributeError',\n    'spider_exceptions/ValueError',\n    'spider_exceptions/TypeError'\n]).concat([\n    'motor/items_stored_count',\n    'motor/store_error_count',\n    'motor/store_error_count/AutoReconnect',\n]);\n\n\nvar SHORT_NAMES = {\n    'downloader/exception_type_count/twisted.internet.error.DNSLookupError': 'downloader/DNS errors',\n    'downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError': 'downloader/Connection Refused',\n};\n\n\nfunction getJobStatRows(stats){\n    return Object.keys(stats).map(key => {\n        var value = stats[key];\n        if (value == 0){\n            return \"\";\n        }\n        if (/_bytes$|memusage/.test(key)){\n            value = filesize(value);\n        }\n        var shortKey = SHORT_NAMES[key] || key;\n        return (\n            <tr key={key}>\n                <td>{shortKey}</td>\n                <td>{value}</td>\n            </tr>\n        );\n    }).filter(item => item != \"\");\n}\n\n\nexport var AggregateJobStats = React.createClass({\n    mixins: [JobsMixin],\n    render: function () {\n        var stats = this.getAggregateStats(this.state.jobs);\n        var rows = getJobStatRows(stats);\n        if (rows.length == 0){\n            return (\n                <p>此面板显示爬虫抓取属性, 尚未展现.</p>\n            );\n        }\n        return <KeyValueTable noheader={this.props.fill}>{rows}</KeyValueTable>;\n    },\n\n    getAggregateStats: function (jobs) {\n        var stats = {};\n        SUM_KEYS.forEach(key => {stats[key] = 0});\n\n        jobs.forEach(job => {\n            SUM_KEYS.forEach(key => {\n                stats[key] += job.stats[key] || 0;\n            });\n        });\n        return stats;\n    }\n});\n\n\nexport var JobStats = React.createClass({\n    render: function () {\n        var stats = this.props.job.stats;\n        var sortedStats = {};\n        Object.keys(stats).sort().forEach(k => {sortedStats[k] = stats[k]});\n        var rows = getJobStatRows(sortedStats);\n        if (rows.length == 0) {\n            return <p>Nothing to show yet.</p>;\n        }\n        return <KeyValueTable noheader={this.props.fill}>{rows}</KeyValueTable>;\n    }\n});\n"
  },
  {
    "path": "client/components/JobTransfers.jsx",
    "content": "/*\nWidgets for job downloads info.\n*/\nvar React = require(\"react/addons\");\n//var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;\nvar Reflux = require(\"reflux\");\nvar filesize = require(\"filesize\");\nvar prettyMs = require(\"pretty-ms\");\nvar { Table } = require(\"react-bootstrap\");\n\nvar JobStore = require(\"../stores/JobStore\");\nvar { JobsMixin } = require(\"./RefluxMixins\");\n\n\n\nfunction _updatedSeenTimes(currentUrls, oldSeen) {\n    var now = new Date();\n    var seenAt = {};\n    currentUrls.forEach(url => {seenAt[url] = now});\n    Object.keys(oldSeen).filter(url => seenAt[url]).forEach(url => {\n        seenAt[url] = oldSeen[url];\n    });\n    return seenAt;\n}\n\n\nfunction sortedRequests(requests, seenAt) {\n    var arr = requests.slice();\n    arr.sort((r1, r2) => seenAt[r1.url] - seenAt[r2.url]);\n    return arr;\n}\n\n\nexport var ShortTermQueueWidget = React.createClass({\n    propTypes: {\n        job: React.PropTypes.object.isRequired,\n    },\n\n    getInitialState: function () {\n        return {seenAt: {}};\n    },\n\n    componentWillReceiveProps: function(nextProps) {\n        var urls = nextProps.job.downloads.active.map(tr => tr.url);\n        this.setState({seenAt: _updatedSeenTimes(urls, this.state.seenAt)});\n    },\n\n    render: function () {\n        var downloads = this.props.job.downloads;\n        var active = sortedRequests(downloads.active, this.state.seenAt);\n\n        if (!active.length){\n            return false;\n        }\n\n        var getSlotTable = (slot) => {\n            var requests = sortedRequests(slot.active, this.state.seenAt);\n            var isTransferring = {};\n            slot.transferring.forEach(req => isTransferring[req.url] = true);\n            var rows = requests.map(\n                req => {\n                    var clsName = isTransferring[req.url] ? \"success\" : \"default\";\n                    return <tr key={req.url} className={clsName}><td>{req.url}</td></tr>;\n                }\n            );\n            var delay = prettyMs((slot.delay || 0) * 1000);\n\n                //<ReactCSSTransitionGroup transitionName=\"transfer\"\n                //                         component=\"tbody\"\n                //                         transitionLeave={false}>\n                //    {rows}\n                //</ReactCSSTransitionGroup>\n\n            return <Table key={slot.key}>\n                <caption>\n                    {slot.key} &nbsp;\n                    <span className=\"pull-right\">\n                        download delay: {delay}\n                    </span>\n                </caption>\n                <tbody>\n                {rows}\n                </tbody>\n            </Table>;\n        };\n\n        var tables = downloads.slots.map(s => getSlotTable(s));\n\n        return <div>{tables}</div>;\n    }\n});\n\n\n/*\nexport var ActiveTransfersWidget = React.createClass({\n    render: function () {\n        return false;\n    }\n});\n*/\n"
  },
  {
    "path": "client/components/KeyValueTable.jsx",
    "content": "/* A widget for displaying key-value tables */\nvar React = require(\"react\");\nvar { Table } = require(\"react-bootstrap\");\n\nexport var KeyValueTable = React.createClass({\n    render: function () {\n        if (this.props.noheader){\n            var header = <thead></thead>;\n        }\n        else {\n            var header = <thead><th>Name</th><th className=\"col-md-3\">Value</th></thead>;\n        }\n\n        return <Table condensed>\n            {header}\n            <tbody>{this.props.children}</tbody>\n        </Table>;\n    }\n});\n"
  },
  {
    "path": "client/components/ProcessStats.jsx",
    "content": "/* A widget for monitoring CPU and RAM usage of a process */\n\nvar filesize = require(\"filesize\");\nvar prettyMs = require(\"pretty-ms\");\nvar React = require(\"react\");\nvar Reflux = require(\"reflux\");\nvar { Table } = require(\"react-bootstrap\");\n\nvar ProcessStatsStore = require(\"../stores/ProcessStatsStore\");\nvar ConnectionStore = require(\"../stores/ConnectionStore\");\nvar { KeyValueTable } = require(\"./KeyValueTable\");\n\n\nfunction formatTimeMs(timeMs){\n    return prettyMs(timeMs*1000 || 0, {compact: false});\n}\n\nexport var HeaderProcessStats = React.createClass({\n    mixins: [\n        Reflux.connect(ProcessStatsStore.store, \"stats\"),\n        Reflux.connect(ConnectionStore.store, \"connectionStatus\"),\n    ],\n    render: function () {\n        if (this.state.connectionStatus == \"offline\"){\n            return <span></span>;\n        }\n        var s = this.state.stats;\n        var style = {marginTop: 15}; // for yeti theme\n        return <div className=\"navbar-text\" style={style}>\n            {filesize(s.ram_rss || 0)}, CPU: {(s.cpu_percent || 0).toFixed(1)}%\n        </div>;\n    }\n});\n\n\nexport var ProcessStatsTable = React.createClass({\n    mixins: [Reflux.connect(ProcessStatsStore.store, \"stats\")],\n    render: function () {\n        var s = this.state.stats;\n        var items = [\n            [\"CPU %\", (s.cpu_percent || 0).toFixed(1)],\n            [\"User Time\", formatTimeMs(s.cpu_time_user)],\n            [\"System Time\", formatTimeMs(s.cpu_time_system)],\n            [\"RSS\", filesize(s.ram_rss || 0, {round: 1})],\n            [\"VMS\", filesize(s.ram_vms || 0)],\n            [\"RAM %\", (s.ram_percent || 0).toFixed(2)],\n            [\"File Descriptors\", s.num_fds],\n            [\"Threads\", s.num_threads],\n        ];\n        var noheader = this.props.fill;\n        var rows = items.map(kv => {return <tr key={kv[0]}><td>{kv[0]}</td><td>{kv[1]}</td></tr>});\n        return <KeyValueTable noheader={noheader}>{rows}</KeyValueTable>;\n    }\n});\n\n\nexport function installHeader(elemId) {\n    React.render(<HeaderProcessStats />, document.getElementById(elemId));\n}\n"
  },
  {
    "path": "client/components/RefluxMixins.js",
    "content": "var React = require(\"react\");\nvar Reflux = require(\"reflux\");\nvar JobStore = require(\"../stores/JobStore\");\n\nexport var JobsMixin = Reflux.connect(JobStore.store, \"jobs\");\n"
  },
  {
    "path": "client/main.jsx",
    "content": "/* Main entry point */\n\nvar React = require(\"react\");\nvar Router = require('react-router');\nvar { Route, RouteHandler, Link, DefaultRoute, NotFoundRoute } = Router;\n\nvar { IndexPage } = require(\"./pages/IndexPage.jsx\");\nvar { JobPage } = require(\"./pages/JobPage.jsx\");\n\nvar NotFound = React.createClass({\n    render: function () {\n        return (\n            <div>\n                <h2>404 找不到网页</h2>\n                <p>您试图访问的页面不存在.</p>\n            </div>\n        );\n    }\n});\n\n\nvar App = React.createClass({\n  render () {\n      // TODO: move most stuff from base.html here\n      return (\n          <RouteHandler/>\n      );\n  }\n});\n\nvar routes = (\n    <Route path=\"/\" handler={App}>\n        <DefaultRoute handler={IndexPage} name=\"index\" />\n        <Route path=\"job/:id\" handler={JobPage} name=\"job\" />\n        <NotFoundRoute handler={NotFound} />\n    </Route>\n);\n\nRouter.run(routes, Router.HashLocation, (Root) => {\n    React.render(<Root/>, document.getElementById(\"root\"));\n});\n"
  },
  {
    "path": "client/package.json",
    "content": "{\n  \"name\": \"arachnado\",\n  \"version\": \"1.0.0\",\n  \"description\": \"React+Reflux =========\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"build\": \"webpack --optimize-minimize\",\n    \"watch\": \"webpack --progress --color --watch\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/TeamHG-Memex/arachnado.git\"\n  },\n  \"author\": \"Mikhail Korobov <kmike84@gmail.com>\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/TeamHG-Memex/arachnado/issues\"\n  },\n  \"homepage\": \"https://github.com/TeamHG-Memex/arachnado#readme\",\n  \"devDependencies\": {\n    \"babel-core\": \"^5.5.8\",\n    \"babel-loader\": \"^5.1.4\",\n    \"node-libs-browser\": \"^0.5.2\",\n    \"webpack\": \"^1.9.11\"\n  },\n  \"dependencies\": {\n    \"debounce\": \"^1.0.0\",\n    \"eventemitter3\": \"^1.1.1\",\n    \"filesize\": \"^3.1.2\",\n    \"pretty-ms\": \"^1.2.0\",\n    \"react\": \"^0.13.3\",\n    \"react-bootstrap\": \"^0.23.4\",\n    \"react-router\": \"^0.13.3\",\n    \"reflux\": \"^0.2.8\"\n  }\n}\n"
  },
  {
    "path": "client/pages/IndexPage.jsx",
    "content": "/* Main (index) page */\n\nvar React = require(\"react\");\nvar { Panel } = require(\"react-bootstrap\");\n\nvar { JobList } = require(\"../components/JobList\");\nvar { AggregateJobStats } = require(\"../components/JobStats\");\nvar { ProcessStatsTable } = require(\"../components/ProcessStats\");\n\n\nexport var IndexPage = React.createClass({\n    render: function () {\n        return (\n            <div className=\"row\">\n                <div className=\"col-lg-7 col-md-7\">\n                    <Panel collapsible defaultExpanded header=\"任务\" bsStyle=\"primary\">\n                        <JobList/>\n                    </Panel>\n                    <Panel collapsible defaultExpanded header=\"系统状态\" className=\"hidden-lg\">\n                        <ProcessStatsTable />\n                    </Panel>\n                </div>\n                <div className=\"col-lg-5 col-md-5\">\n                    <Panel collapsible defaultExpanded header=\"系统状态\" className=\"visible-lg-block\">\n                        <ProcessStatsTable />\n                    </Panel>\n                    <Panel collapsible defaultExpanded header=\"爬虫状态\">\n                        <AggregateJobStats/>\n                    </Panel>\n                </div>\n            </div>\n        );\n    }\n});\n"
  },
  {
    "path": "client/pages/JobPage.jsx",
    "content": "/* Job page */\n\nvar React = require(\"react\");\nvar Reflux = require(\"reflux\");\nvar { Link } = require('react-router');\nvar { Panel, Table, Button, Glyphicon, ButtonToolbar } = require(\"react-bootstrap\");\n\nvar JobStore = require(\"../stores/JobStore\");\nvar { ProcessStatsTable } = require(\"../components/ProcessStats\");\nvar { JobStats } = require(\"../components/JobStats\");\nvar { JobListWidgetVerbose, JobControlButtons } = require(\"../components/JobList\");\nvar { ShortTermQueueWidget } = require(\"../components/JobTransfers.jsx\");\n\n\nvar ShortJobInfo = React.createClass({\n    render: function () {\n        var job = this.props.job;\n        var jobs = [job];\n        return <JobListWidgetVerbose jobs={jobs} />;\n    }\n});\n\n\nvar JobInfo = React.createClass({\n    render: function () {\n        var job = this.props.job;\n        var kvpairs = [\n            [\"Target\", job.seed],\n            [\"Status\", job.status],\n            [\"Job ID\", job.id],\n            [\"Started at\", job.stats.start_time],\n        ];\n        if (job.stats.finish_time){\n            kvpairs.push([\"Finished at\", job.stats.finish_time]);\n        }\n\n        var rows = kvpairs.map(p => <tr key={p[0]}><td>{p[0]}</td><td>{p[1]}</td></tr>);\n        return (\n            <div>\n                <Table>\n                    <caption>General Job Information</caption>\n                    <tbody>{rows}</tbody>\n                </Table>\n            </div>\n        );\n    }\n});\n\n\nvar NoJobPage = React.createClass({\n    render: function () {\n        return (\n            <div>\n                <h2>Job is not found</h2>\n                <p>This job is either not available or never existed.</p>\n                <Link to=\"index\">\n                    <Glyphicon glyph=\"menu-left\"/>&nbsp;\n                    Back to Full Job List\n                </Link>\n            </div>\n        );\n    }\n});\n\n\nexport var JobPage = React.createClass({\n    mixins: [\n        Reflux.connectFilter(JobStore.store, \"job\", function(jobs) {\n            return jobs.filter(job => job.id == this.props.params.id)[0];\n        })\n    ],\n\n    render: function () {\n        var job = this.state.job;\n        if (!job){\n            return <NoJobPage/>;\n        }\n        return (\n            <div className=\"row\">\n                <div className=\"row\">\n                    <div className=\"col-lg-12\">\n                        <Link to=\"index\" className=\"btn\">\n                            <Glyphicon glyph=\"menu-left\"/>&nbsp;全部任务\n                        </Link>&nbsp;&nbsp;\n                        <JobControlButtons job={job}/>\n                        <br/><br/>\n                        <ShortJobInfo job={job}/>\n                    </div>\n                </div>\n                <div className=\"row\">\n                    <div className=\"col-lg-5\">\n                        <Panel collapsible defaultExpanded header=\"爬虫统计\">\n                            <JobStats job={job} />\n                        </Panel>\n                    </div>\n                    <div className=\"col-lg-7\">\n                        <Panel collapsible defaultExpanded header=\"请求队列\">\n                            <ShortTermQueueWidget job={job} />\n                        </Panel>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n});\n"
  },
  {
    "path": "client/stores/ConnectionStore.js",
    "content": "require(\"babel-core/polyfill\");\n\nvar Reflux = require(\"reflux\");\nvar { FancyWebSocket } = require(\"../utils/FancyWebSocket\");\nvar JobStore = require(\"./JobStore\");\n\n\nexport var Actions = Reflux.createActions([\"update\", \"reconnect\"]);\n\n\nexport var store = Reflux.createStore({\n    init: function () {\n        this.status = \"offline\";\n        this.listenToMany(Actions);\n        this.listenTo(JobStore.store, this.onJobListChanged);\n    },\n\n    getInitialState: function () {\n        return this.status;\n    },\n\n    onJobListChanged: function (jobs) {\n        if (jobs.some(job => job.status == \"crawling\")) {\n            this.status = \"crawling\";\n            this.trigger(this.status);\n        }\n        else if (this.status == \"crawling\") {\n            this.status = \"online\";\n            this.trigger(this.status);\n        }\n    },\n\n    onUpdate: function (status) {\n        this.status = status;\n        this.trigger(status);\n    },\n\n    onReconnect: function () {\n        socket.reconnect();\n    }\n});\n\n\nvar socket = FancyWebSocket.instance();\nsocket.on(\"open\", () => { Actions.update('online') });\nsocket.on(\"close\", () => { Actions.update('offline') });\n\n"
  },
  {
    "path": "client/stores/JobStore.js",
    "content": "require(\"babel-core/polyfill\");\nvar Reflux = require(\"reflux\");\nvar debounce = require(\"debounce\");\nvar { FancyWebSocket } = require(\"../utils/FancyWebSocket\");\nvar API = require(\"../utils/ArachnadoAPI\");\n\n\nexport var Actions = Reflux.createActions([\n    \"setAll\",\n    \"updateStats\",\n    \"startCrawl\",\n    \"stopCrawl\",\n    \"pauseCrawl\",\n    \"resumeCrawl\",\n]);\n\n\nexport var store = Reflux.createStore({\n    init: function () {\n        this.jobs = [];\n        this.listenToMany(Actions);\n        this.triggerDebounced = debounce(this.trigger, 200);\n    },\n\n    getInitialState: function () {\n        return this.jobs;\n    },\n\n    onSetAll: function (jobs) {\n        this.jobs = jobs;\n        this.triggerDebounced(jobs);\n    },\n\n    onUpdateStats: function (crawlId, changes) {\n        this.jobs.filter(job => job.id == crawlId).forEach(job => {\n            job.stats = Object.assign(job.stats || {}, changes);\n        });\n        this.trigger(this.jobs);\n    },\n\n    onStartCrawl: function (domain, options) {\n        API.startCrawl(domain, options);\n    },\n\n    onStopCrawl: function (jobId) {\n        API.stopCrawl(jobId);\n    },\n\n    onPauseCrawl: function (jobId) {\n        API.pauseCrawl(jobId);\n    },\n\n    onResumeCrawl: function (jobId) {\n        API.resumeCrawl(jobId);\n    }\n});\n\n\nvar socket = FancyWebSocket.instance();\nsocket.on(\"jobs:state\", (jobs) => {\n    //console.log(\"jobs:state\", jobs);\n    Actions.setAll(jobs);\n});\n\nsocket.on(\"stats:changed\", (data) => {\n    var [crawlId, changes] = data;\n    Actions.updateStats(crawlId, changes);\n    //console.log(\"stats:changed\", crawlId, changes);\n});\n\nActions.setAll(window.INITIAL_DATA.jobs);\n\n"
  },
  {
    "path": "client/stores/ProcessStatsStore.js",
    "content": "var Reflux = require(\"reflux\");\nvar { FancyWebSocket } = require(\"../utils/FancyWebSocket\");\nrequire(\"babel-core/polyfill\");\n\nexport var Actions = Reflux.createActions([\"update\"]);\n\n\nexport var store = Reflux.createStore({\n    init: function () {\n        this.stats = {};\n        this.listenTo(Actions.update, this.onUpdate);\n    },\n\n    getInitialState: function () {\n        return this.stats;\n    },\n\n    onUpdate: function (stats) {\n        this.stats = stats;\n        if (stats.server_time) {\n            this.stats.serverTime = new Date(stats.server_time);\n        }\n        this.trigger(this.stats);\n    }\n});\n\n\nvar socket = FancyWebSocket.instance();\nsocket.on(\"process:stats\", (stats) => {\n    Actions.update(stats);\n});\n\nif (window.INITIAL_PROCESS_STATS){\n    Actions.update(window.INITIAL_PROCESS_STATS);\n}\n"
  },
  {
    "path": "client/utils/ArachnadoAPI.js",
    "content": "/* Wrapper for Arachnado HTTP API */\n\nexport function startCrawl(domain, options){\n    var startCrawlUrl = window.START_CRAWL_URL;  // set in base.html\n    var data = {\n        domain: domain,\n        options: options\n    };\n    $.post(startCrawlUrl, data);\n}\n\nexport function stopCrawl(jobId){\n    $.post(window.STOP_CRAWL_URL, {job_id: jobId});\n}\n\nexport function pauseCrawl(jobId){\n    $.post(window.PAUSE_CRAWL_URL, {job_id: jobId});\n}\n\nexport function resumeCrawl(jobId){\n    $.post(window.RESUME_CRAWL_URL, {job_id: jobId});\n}\n"
  },
  {
    "path": "client/utils/FancyWebSocket.js",
    "content": "/*\nWebSocket wrapper.\nIt allows multiple callbacks and forces a common message format.\n*/\n\nvar EventEmitter = require(\"eventemitter3\");\n\nvar endpointSockets = {};\n\nexport class FancyWebSocket {\n\n    constructor(url) {\n        this._ee = new EventEmitter();\n        this._connect(url);\n    }\n\n    _connect(url) {\n        this._conn = new WebSocket(url);\n        this._conn.onmessage = (evt) => {\n            var json = JSON.parse(evt.data);\n            this._ee.emit(json.event, json.data);\n        };\n        this._conn.onopen = () => { this._ee.emit('open', null) };\n        this._conn.onclose = (e) => { this._ee.emit('close', e) };\n        this._conn.onerror = (e) => { this._ee.emit('error', e) };\n        this._url = url;\n    }\n\n    reconnect() {\n        this._conn.close();\n        this._connect(this._url);\n    }\n\n    /* Listen to incoming messages */\n    on(event, callback) { this._ee.on(event, callback) }\n    off(event, callback) { this._ee.off(event, callback) }\n    once(event, callback) { this._ee.once(event, callback) }\n\n    /* Send data to the websocket */\n    send(event, data) {\n        var payload = JSON.stringify({event: event, data: data});\n        this._conn.send(payload);\n    }\n\n    /* Return a FancyWebSocket on the same domain/port as current URL */\n    static forEndpoint(endpoint){\n        if (endpointSockets[endpoint]) {\n            return endpointSockets[endpoint];\n        }\n        var loc = document.location;\n        var url = \"ws://\" + loc.hostname + \":\" + loc.port + endpoint;\n        var socket = new FancyWebSocket(url);\n        endpointSockets[endpoint] = socket;\n        return socket;\n    }\n\n    /* Return a default instance */\n    static instance() {\n        return FancyWebSocket.forEndpoint(window.WS_SERVER_ADDRESS);\n    }\n\n}\n"
  },
  {
    "path": "client/webpack.config.js",
    "content": "var path = require('path');\nvar webpack = require('webpack');\n\nfunction _static(name){\n    return path.resolve(__dirname, name);\n}\n\nmodule.exports = {\n    entry: {\n        'main': _static(\"main.jsx\"),\n        'common': _static(\"common.js\"),\n        'vendor': [\n            'react',\n            'react/addons',\n            'react-bootstrap',\n            'react-router',\n            'reflux',\n            'eventemitter3'\n        ]\n    },\n    output: {\n        path: _static(\"build\"),\n        filename: '[name].js',\n    },\n    module: {\n        loaders: [\n            {\n                test: /\\.jsx?$/,\n                exclude: /node_modules/,\n                loader: \"babel-loader\"\n            },\n            // {\n            //     test: /\\.js$/,\n            //         use: [{\n            //         loader: 'babel-loader',\n            //         options: {\n            //             presets: ['es2015']\n            //         }\n            //     }],\n            // exclude: /node_modules/\n            // }\n        ]\n    },\n    resolve: {\n        extensions: ['', '.js', '.jsx']\n    },\n    plugins: [\n        new webpack.optimize.CommonsChunkPlugin(\"vendor\", \"vendor.js\"),\n    ]\n    //devtool: \"#inline-source-map\",\n};\n"
  },
  {
    "path": "requirements.txt",
    "content": "asn1crypto==0.24.0\nattrs==17.3.0\nAutomat==0.6.0\nbackports-abc==0.5\nbeautifulsoup4==4.6.0\ncertifi==2017.11.5\ncffi==1.11.2\nchardet==3.0.4\nconstantly==15.1.0\ncryptography==2.1.4\ncssselect==1.0.1\nhyperlink==17.3.1\nidna==2.6\nincremental==17.5.0\nlxml==4.1.1\nparsel==1.2.0\npsutil==5.4.2\npyasn1==0.4.2\npyasn1-modules==0.2.1\npycparser==2.18\nPyDispatcher==2.0.5\npymongo==3.6.0\npyOpenSSL==17.5.0\npywin32==221\nqueuelib==1.4.2\nrequests==2.18.4\nScrapy==1.4.0\nservice-identity==17.0.0\nsix==1.11.0\ntornado==4.5.3\nTwisted==17.9.0\nurllib3==1.22\nw3lib==1.18.0\nzope.interface==4.4.3\n"
  },
  {
    "path": "server/__init__.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\n__version__ = 0.1"
  },
  {
    "path": "server/config/__init__.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-"
  },
  {
    "path": "server/config/mysql_conf.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nMYSQL_SERVER = {\n    \"write_db\": {\n        \"version\": 3,\n        \"objects\": {\n            \"database\": \"crawl_db\",\n            \"port\": 3306,\n            \"host\": \"112.124.232.175\",\n            \"user\": \"crawl_user\",\n            \"maxConnections\": 3,\n            \"minFreeConnections\": 1,\n            \"charset\": \"utf8\",\n            \"password\": \"Htctita331\",\n            \"keepConnectionAlive\": True\n        }\n    },\n    \"read_db\": {\n        \"version\": 3,\n        \"objects\": {\n            \"database\": \"crawl_db\",\n            \"port\": 3306,\n            \"host\": \"112.124.232.175\",\n            \"user\": \"crawl_user\",\n            \"maxConnections\": 3,\n            \"minFreeConnections\": 1,\n            \"charset\": \"utf8\",\n            \"password\": \"Htctita331\",\n            \"keepConnectionAlive\": True\n        }\n    },\n    \"admin_read_db\": {\n        \"version\": 1,\n        \"objects\": {\n            \"database\": \"crawl_db\",\n            \"port\": 3306,\n            \"host\": \"112.124.232.175\",\n            \"user\": \"crawl_user\",\n            \"maxConnections\": 3,\n            \"minFreeConnections\": 1,\n            \"charset\": \"utf8\",\n            \"password\": \"Htctita331\",\n            \"keepConnectionAlive\": True\n        }\n    },\n    \"admin_write_db\": {\n        \"version\": 1,\n        \"objects\": {\n            \"database\": \"crawl_db\",\n            \"port\": 3306,\n            \"host\": \"112.124.232.175\",\n            \"user\": \"crawl_user\",\n            \"maxConnections\": 3,\n            \"minFreeConnections\": 1,\n            \"charset\": \"utf8\",\n            \"password\": \"Htctita331\",\n            \"keepConnectionAlive\": True\n        }\n    },\n    \"msg_read_db\": {\n        \"version\": 2,\n        \"objects\": {\n            \"database\": \"crawl_db\",\n            \"port\": 3306,\n            \"host\": \"112.124.232.175\",\n            \"user\": \"crawl_user\",\n            \"maxConnections\": 3,\n            \"minFreeConnections\": 1,\n            \"password\": \"Htctita331\",\n            \"keepConnectionAlive\": True\n        }\n    }\n}\n"
  },
  {
    "path": "server/config/opts.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\n# 全局配置\nopts = {\n    'spider.storage': {'host': 'localhost', 'port': 27017, 'db_name': 'spider', 'config_collection': 'config'},\n    'spider.scrapy': {'spider_packages': ''},\n    'spider.manhole': {'host': 'localhost', 'port': '6023', 'enabled': False},\n    'spider': {'host': '0.0.0.0', 'port': '9999', 'loglevel': 'DEBUG', 'reactor': 'auto', 'debug': True},\n}"
  },
  {
    "path": "server/config/utils.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nfrom scrapy.utils.serialize import ScrapyJSONEncoder\n\ndef json_encode(obj):\n    \"\"\"转换json对象\"\"\"\n    _encoder = ScrapyJSONEncoder(ensure_ascii=False)\n    return _encoder.encode(obj)"
  },
  {
    "path": "server/config/wsbase.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport logging, json\nfrom tornado import websocket\nfrom server.config.utils import json_encode\n\nlogger = logging.getLogger(__name__)\n\nclass BaseWSHandler(websocket.WebSocketHandler):\n    \"\"\"websocket通信基类，数据类型{\"event\": name, \"data\": data}\"\"\"\n    def write_event(self, event, data):\n        \"\"\"向客户端发送message\"\"\"\n        message = json_encode({'event': event, 'data': data})\n        self.write_message(message)\n\n    def on_message(self, message):\n        try:\n            msg = json.loads(message)\n            event, data = msg['event'], msg['data']\n        except Exception as e:\n            logger.warning(\"Invalid message skipped\" + message[:500])\n            return\n        self.on_event(event, data)\n\n    def on_event(self, event, data):\n        \"\"\"客户端接收消息\"\"\"\n        pass\n\n    def on_open(self, *args, **kwargs):\n        pass\n\n    def open(self, *args, **kwargs):\n        self.on_open(*args, **kwargs)"
  },
  {
    "path": "server/db/__init__.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-"
  },
  {
    "path": "server/db/db.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\nfrom pymongo import MongoClient\n\nfrom server.config.opts import opts\n\nclass MongodbLink(object):\n    \"\"\"mongodb数据库操作类\"\"\"\n    def __init__(self):\n        self.conn = MongoClient(\n            host=opts['spider.storage']['host'],\n            port=opts['spider.storage']['port'],\n            document_class=dict\n        )\n\n    def get_db(self):\n        \"\"\"获取数据库\"\"\"\n        db = self.conn[opts['spider.storage']['db_name']]\n        return db\n\n    def get_config(self):\n        \"\"\"获取配置集合\"\"\"\n        conf = self.conn[opts['spider.storage']['db_name']][opts['spider.storage']['config_collection']]\n        return conf\n\n    def exe_insert(self, collection, document):\n        \"\"\"插入数据\"\"\"\n        try:\n            result = collection.insert_one(document)\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': None}\n\n\n    def exe_remove(self, collection, document):\n        \"\"\"删除数据\"\"\"\n        try:\n            result = collection.remove(document)\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': None}\n\n    def exe_update(self, collection, document):\n        \"\"\"更新数据\"\"\"\n        try:\n            data = collection.update({\"_id\": document[\"_id\"]}, document)\n            result = collection.find_one({\"_id\": data[\"_id\"]})\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': {}}\n\n    def exe_search_one(self, collection, document):\n        \"\"\"查找一条数据\"\"\"\n        try:\n            result = collection.find_one(document)\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': {}}\n\n    def exe_search(self, collection, document):\n        \"\"\"查找数据\"\"\"\n        try:\n            result = list(collection.find(document))\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': []}\n\n    def exe_count(self, collection, document):\n        \"\"\"查询总数\"\"\"\n        try:\n            result = collection.find(document).count()\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': 0}\n\n    def exe_search_page(self, collection, document, limit, offset):\n        \"\"\"翻页\"\"\"\n        try:\n            result = list(collection.find(document).limit(limit).skip(offset))\n            return {'state': True, 'data': result}\n        except:\n            return {'state': False, 'data': []}"
  },
  {
    "path": "server/spider/__init__.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-"
  },
  {
    "path": "server/spider/crawler_process.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\nimport itertools, logging, six, operator\nfrom scrapy.crawler import CrawlerProcess, Crawler\nfrom scrapy.signalmanager import SignalManager\nfrom scrapy import signals\nfrom scrapy.core.downloader import Downloader\nfrom scrapy.core.engine import ExecutionEngine\nfrom scrapy.utils.reactor import CallLaterOnce\n\nfrom server.spider.signals import Signal\nfrom server.spider import stats\nfrom server.spider.process_stats import ProcessStatsMonitor\n\n# 日志\nlogger = logging.getLogger(__name__)\n\n# spider信号stats改变时的信号\nagg_stats_changed = Signal(\"agg_stats_changed\", False)\nSTAT_SIGNALS = {\n    stats.stats_changed: agg_stats_changed\n}\n\n# 新增信号状态\nsignals.spider_closing = object()\nsignals.engine_paused = object()\nsignals.engine_resumed = object()\nsignals.engine_tick = object()\nsignals.downloader_enqueued = object()\nsignals.downloader_dequeued = object()\n# 信号状态参数\nSCRAPY_SIGNAL_NAMES = [\n    'engine_started',\n    'engine_stopped',\n    'engine_paused',  # custom\n    'engine_resumed',  # custom\n    'engine_tick',  # custom\n    'item_scraped',\n    'item_dropped',\n    'spider_closed',\n    'spider_closing',  # custom\n    'spider_opened',\n    'spider_idle',\n    'spider_error',\n    'request_scheduled',\n    'request_dropped',\n    'response_received',\n    'response_downloaded',\n    'downloader_enqueued',  # custom\n    'downloader_dequeued',  # custom\n]\n\ndef _get_crawler_process_signals_cls():\n    \"\"\"获取信号状态\"\"\"\n    spider_to_cp = {}\n    class CrawlerProcessSignals(object):\n        @classmethod\n        def signal(cls, spider_signal):\n            return spider_to_cp[spider_signal]\n\n        engine_started = Signal('engine_started', True)\n        engine_stopped = Signal('engine_stopped', True)\n        engine_paused = Signal('engine_paused', False)  # custom\n        engine_resumed = Signal('engine_resumed', False)  # custom\n        engine_tick = Signal('engine_tick', False)  # custom\n        spider_opened = Signal('spider_opened', True)\n        spider_idle = Signal('spider_idle', False)\n        spider_closed = Signal('spider_closed', True)\n        spider_closing = Signal('spider_closing', False)  # custom\n        spider_error = Signal('spider_error', False)\n        request_scheduled = Signal('request_scheduled', False)\n        request_dropped = Signal('request_dropped', False)\n        response_received = Signal('response_received', False)\n        response_downloaded = Signal('response_downloaded', False)\n        item_scraped = Signal('item_scraped', True)\n        item_dropped = Signal('item_dropped', True)\n        downloader_enqueued = Signal('downloader_enqueued', False)\n        downloader_dequeued = Signal('downloader_dequeued', False)\n\n    for name in SCRAPY_SIGNAL_NAMES:\n        signal = getattr(signals, name)\n        cp_signal = getattr(CrawlerProcessSignals, name)\n        spider_to_cp[signal] = cp_signal\n\n    return CrawlerProcessSignals\n\nCrawlerProcessSignals = _get_crawler_process_signals_cls()\n\nclass MyselfExecutionEngine(ExecutionEngine):\n    \"\"\"扩写执行引擎 任务停止时发送信号\"\"\"\n    def __init__(self, *args, **kwargs):\n        super(MyselfExecutionEngine, self).__init__(*args, **kwargs)\n        self.send_tick = CallLaterOnce(self._send_tick_signal)\n\n    # TODO\n    def close_spider(self, spider, reason='cancelled'):\n        \"\"\"关闭spider并清除未完成请求\"\"\"\n        # self.slot使用twisted.reactor调度engine的_next_request方法, 核心循环方法\n        if self.slot.closing:\n            return self.slot.closing\n        self.crawler.crawling = False\n        self.signals.send_catch_log(signals.spider_closing)\n        return super(MyselfExecutionEngine, self).close_spider(spider, reason)\n\n    def pause(self):\n        \"\"\"暂停执行引擎\"\"\"\n        super(MyselfExecutionEngine, self).pause()\n        self.signals.send_catch_log(signals.engine_paused)\n\n    def unpause(self):\n        \"\"\"继续执行暂停任务\"\"\"\n        super(MyselfExecutionEngine, self).unpause()\n        self.signals.send_catch_log(signals.engine_resumed)\n\n    def _next_request(self, spider):\n        \"\"\"任务调度\"\"\"\n        res = super(MyselfExecutionEngine, self)._next_request(spider)\n        self.send_tick.schedule(0.1)\n        return res\n\n    def _send_tick_signal(self):\n        \"\"\"发送信号\"\"\"\n        self.signals.send_catch_log_deferred(signals.engine_tick)\n\nclass MyselfCrawler(Crawler):\n    \"\"\"扩展Crawler\"\"\"\n    def __init__(self, spidercls, settings=None, **kwargs):\n        super(MyselfCrawler, self).__init__(spidercls, settings)\n        self.url = kwargs.get('url', '')\n        self.name = kwargs.get('name', '')\n        self.method = kwargs.get('method', 'get')\n        self.header = kwargs.get('header', {})\n        self.form = kwargs.get('form', {})\n        self.cookie = kwargs.get('cookie', {})\n        self.selectors = kwargs.get('selectors', [])\n        self.pageLoadDelay = kwargs.get('pageLoadDelay', 0)\n\n    def _create_spider(self, *args, **kwargs):\n        \"\"\"创建spider\"\"\"\n        return self.spidercls.from_crawler(self, *args, url=self.url, name=self.name, method=self.method,\n                                           header=self.header, form=self.form, cookie=self.cookie,\n                                           selectors=self.selectors, pageLoadDelay=self.pageLoadDelay, **kwargs)\n\n    def _create_engine(self, *args, **kwargs):\n        \"\"\"创建engine\"\"\"\n        return MyselfExecutionEngine(self, lambda _: self.stop())\n\nclass MyselfDownloader(Downloader):\n    \"\"\"下载器\"\"\"\n    def _enqueue_request(self, request, spider):\n        \"\"\"队列中请求\"\"\"\n        dfd = super(MyselfDownloader, self)._enqueue_request(request, spider)\n        self.signals.send_catch_log(signals.downloader_enqueued)\n\n        def _send_dequeued(_):\n            \"\"\"\"\"\"\n            self.signals.send_catch_log(signals.downloader_dequeued)\n            return _\n\n        dfd.addBoth(_send_dequeued)\n        return dfd\n\nclass MyselfCrawlerProcess(CrawlerProcess):\n    \"\"\"signals管理, spider管理\"\"\"\n    crawl_ids = itertools.count(start=1)\n\n    def __init__(self, settings=None):\n        self.signals = SignalManager(self)\n        self.signals.connect(self.on_spider_closed, CrawlerProcessSignals.spider_closed)\n        self._finished_jobs = []\n        self._paused_jobs = set()\n        self.procmon = ProcessStatsMonitor()\n        self.procmon.start()\n\n        super(MyselfCrawlerProcess, self).__init__(settings or {})\n        logging.getLogger('scrapy.spidermiddlewares.depth').setLevel(logging.INFO)\n\n    def crawl(self, crawler_or_spidercls, *args, **kwargs):\n        kwargs['crawl_id'] = next(self.crawl_ids)\n        crawler = crawler_or_spidercls\n        if not isinstance(crawler_or_spidercls, Crawler):\n            crawler = self._create_crawler(crawler_or_spidercls)\n\n        # 爬虫信号状态\n        for name in SCRAPY_SIGNAL_NAMES:\n            crawler.signals.connect(self._resend_signal, getattr(signals, name))\n\n        if hasattr(crawler.stats, \"signals\"):\n            crawler.stats.signals.connect(self._resend_signal, stats.stats_changed)\n\n        d = super(MyselfCrawlerProcess, self).crawl(crawler_or_spidercls, *args, **kwargs)\n        return d\n\n    def _create_crawler(self, spidercls):\n        \"\"\"新建crawler\"\"\"\n        if isinstance(spidercls, six.string_types):\n            spidercls = self.spider_loader.load(spidercls)\n        return MyselfCrawlerProcess(spidercls, self.settings)\n\n    def stop_job(self, crawl_id):\n        \"\"\"crawl job停止信号\"\"\"\n        self.get_crawler(crawl_id).stop()\n\n    def pause_job(self, crawl_id):\n        \"\"\"crawl job暂停\"\"\"\n        self._paused_jobs.add(crawl_id)\n        self.get_crawler(crawl_id).engine.pause()\n\n    def resume_job(self, crawl_id):\n        \"\"\"crawl job恢复\"\"\"\n        self._paused_jobs.remove(crawl_id)\n        self.get_crawler(crawl_id).engine.unpause()\n\n    def get_crawler(self, crawl_id):\n        \"\"\"获取crawl\"\"\"\n        for crawler in self.crawlers:\n            if getattr(crawler.spider, \"crawl_id\") == crawl_id:\n                return crawler\n        raise  KeyError(\"Job is not known: %s\" % crawl_id)\n\n    def _resend_signal(self, **kwargs):\n        # FIXME: signal and crawl are mess.\n        signal = kwargs['signal']\n        if signal in STAT_SIGNALS:\n            signal = STAT_SIGNALS[signal]\n            kwargs['crawler'] = kwargs.pop('sender').crawler\n        else:\n            signal = CrawlerProcessSignals.signal(signal)\n            kwargs['crawler'] = kwargs.pop('sender')\n\n        kwargs['signal'] = signal\n        if signal.supports_defer:\n            return self.signals.send_catch_log_deferred(**kwargs)\n        else:\n            return self.signals.send_catch_log(**kwargs)\n\n    def stop(self):\n        \"\"\"停止crawl process\"\"\"\n        self.procmon.stop()\n        return super(MyselfCrawlerProcess, self).stop()\n\n    def on_spider_closed(self, spider, reason):\n        \"\"\"spider关闭时写入\"\"\"\n        self._finished_jobs.insert(0, {\n            'id': spider.crawl_id,\n            'job_id': getattr(spider, 'motor_job_id'),\n            'seed': spider.domain,\n            'status': reason,\n            'stats': spider.crawler.stats.get_stats(spider),\n            'downloads': self._downloader_stats(spider.crawler)\n        })\n\n    def get_jobs(self):\n        \"\"\"获取运行中的job\"\"\"\n        crawlers = [crawler for crawler in self.crawlers if crawler.spider is not None]\n        return [{\n            'id': crawler.spider.crawl_id,\n            'job_id': getattr(crawler.spider, 'motor_job_id'),\n            'seed': crawler.spider.domain,\n            'status': self._get_crawler_status(crawler),\n            'stats': crawler.spider.crawler.stats.get_stats(crawler.spider),\n            'downloads': self._downloader_stats(crawler)\n        }for crawler in crawlers]\n\n    @classmethod\n    def _downloader_stats(cls, crawler):\n        \"\"\"下载器状态\"\"\"\n        downloader = crawler.engine.downloader\n        return {\n            'active': [cls._request_info(req) for req in downloader.active],\n            'slots': sorted([\n                cls._slot_info(key, slot) for key, slot in downloader.slots.items()\n            ], key=operator.itemgetter('key'))\n        }\n\n    @classmethod\n    def _request_info(cls, request):\n        \"\"\"request消息\"\"\"\n        return {\n            'url': request.url,\n            'method': request.method\n        }\n\n    @classmethod\n    def _slot_info(cls, key, slot):\n        \"\"\"slot消息\"\"\"\n        return {\n            'key': key,\n            'concurrency': slot.concurrency,\n            'delay': slot.delay,\n            'lastseen': slot.lastseen,\n            'len(queue)': len(slot.queue),\n            'transferring': [cls._request_info(req) for req in slot.transferring],\n            'active': [cls._request_info(req) for req in slot.active]\n        }\n\n    def _get_crawler_status(self, crawler):\n        \"\"\"crawler运行状态\"\"\"\n        if crawler.spider is None:\n            return \"unknown\"\n        if not crawler.crawling:\n            return \"stopping\"\n        if int(crawler.spider.crawl_id) in self._paused_jobs:\n            return \"suspended\"\n        return \"crawling\"\n\n    @property\n    def jobs(self):\n        \"\"\"完成和未完成crawl状态\"\"\"\n        finished_ids = {job['id'] for job in self._finished_jobs}\n        active_jobs = [job for job in self.get_jobs() if job['id'] not in finished_ids]\n\n        return active_jobs + self._finished_jobs"
  },
  {
    "path": "server/spider/handler_utils.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\nimport json\nfrom tornado import web\n\nclass ApiHandler(web.RequestHandler):\n    \"\"\"handler JSON API\"\"\"\n    def prepare(self):\n        try:\n            self.json_args = json.loads(self.request.body.decode() if isinstance(self.request.body, bytes) else self.request.body)\n            # 检查参数\n            assert self.json_args['selectedField'], 'KeyError'\n            assert self.json_args['config'], 'KeyError'\n            assert self.json_args['scrapeSitemap'], 'KeyError'\n            self.is_json = True\n        except:\n            self.json_args = None\n            self.is_json = False\n\nclass NoEtagsMixin(object):\n    \"\"\"从浏览器缓存中读取\"\"\"\n    def compute_etag(self):\n        return None\n"
  },
  {
    "path": "server/spider/handlers.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport os, re, json\n\nfrom scrapy.utils.misc import walk_modules\nfrom scrapy.utils.spider import iter_spider_classes\nfrom server.spider.monitor import Monitor\nfrom tornado.web import url, Application, RequestHandler, HTTPError\n\nfrom server.config.utils import json_encode\nfrom server.spider.handler_utils import ApiHandler\nfrom server.spider.spider import CrawlWebsiteSpider, create_crawler, CrawlEntranceSpider\nfrom server.spider.scrapy_thread import thread_crawl\nfrom server.db.db import MongodbLink\n\nclass BaseRequestHandler(RequestHandler):\n    \"\"\"基础请求处理类\"\"\"\n    def initialize(self, crawler_process, opts):\n        self.crawler_process = crawler_process\n        self.opts = opts\n\n    def render(self, *args, **kwargs):\n        proc_stats = self.crawler_process.procmon.get_recent()\n        kwargs['initial_process_stats_json'] = json_encode(proc_stats)\n        return super(BaseRequestHandler, self).render(*args, **kwargs)\n\nclass _ControlJobHandler(ApiHandler, BaseRequestHandler):\n    \"\"\"任务处理类\"\"\"\n    def control_job(self, job_id):\n        raise NotImplementedError\n\n    def post(self):\n        if self.is_json:\n            job_id = int(self.json_args['job_id'])\n            self.control_job(job_id)\n            self.write({\"status\": \"ok\"})\n        else:\n            job_id = int(self.get_body_argument('job_id'))\n            self.control_job(job_id)\n            self.redirect(\"/\")\n\n\ndef get_spider_cls(url, spider_packages, default=CrawlWebsiteSpider):\n    \"\"\"获取spider类\"\"\"\n    if url.startswith('spider://'):\n        spider_name = url[len('spider://'):]\n        return find_spider_cls(spider_name, spider_packages)\n    return default\n\ndef find_spider_cls(spider_name, spider_packages):\n    \"\"\"查找spider\"\"\"\n    for package_name in spider_packages:\n        for module in walk_modules(package_name):\n            for spider_cls in iter_spider_classes(module):\n                if spider_cls.name == spider_name:\n                    return spider_cls\n\ndef get_application(crawler_process, opts):\n    \"\"\"入口配置\"\"\"\n    # 路径函数\n    at_root = lambda *args: os.path.join(os.path.dirname(os.path.dirname(__file__)), *args)\n    # scrapy进程和参数\n    context = {\n        'crawler_process': crawler_process,\n        'opts': opts\n    }\n    debug = opts['spider']['debug']\n\n    handlers = [\n        url(r'/', Index, context, name='index'),\n        url(r'/help', Help, context, name='help'),\n        url(r\"/crawler/start\", StartCrawler, context, name='start'),\n        url(r\"/crawler/stop\", StopCrawler, context, name='stop'),\n        url(r\"/crawler/pause\", PauseCrawler, context, name='pause'),\n        url(r\"/crawler/resume\", ResumeCrawler, context, name='resume'),\n        url(r\"/crawler/status\", CrawlerStatus, context, name='status'),\n        url(r\"/ws-updates\", Monitor, context, name='ws'),\n        url(r'/add/config', Config, context, name='config'),\n        url(r'/add/work', Work, context, name='work'),\n        url(r'/add/next', Next, context, name='next'),\n        url(r'/data', Data, context, name='data'),\n        url(r'/data/columns', CollectionColumns, context, name='columns'),\n        url(r'/data/collection', CollectionData, context, name='collection_data'),\n        url(r'/data/save', DateSave, context, name='save'),\n        url(r'/data/delete', DateDelete, context, name='delete'),\n        url(r'/read', Read, context, name='read'),\n        url(r'/read/collection', CollectionRead, context, name='collection_read'),\n        url(r'.*', ErrorHandler, context, name='error')\n    ]\n\n    return Application(\n        handlers=handlers,\n        template_path=at_root('templates'),\n        compiled_template_cache=not debug,\n        static_hash_cache=not debug,\n        static_path=at_root('static'),\n        compress_response=True\n    )\n\nclass Index(BaseRequestHandler):\n    \"\"\"入口界面\"\"\"\n    def get(self):\n        # TODO\n        jobs = self.crawler_process.jobs\n        initial_data_json = json_encode({'jobs': jobs})\n        return self.render(\"index.html\", initial_data_json=initial_data_json)\n\nclass Help(BaseRequestHandler):\n    \"\"\"帮助界面\"\"\"\n    def get(self):\n        return self.render(\"help.html\")\n\nclass StartCrawler(ApiHandler, BaseRequestHandler):\n    \"\"\"开始job\"\"\"\n    def post(self):\n        if self.is_json:\n            name = self.json_args['config'].get('name', '')\n            url = self.json_args['config'].get('url', '')\n            method = self.json_args['config'].get('method', '')\n            proxy = self.json_args['config'].get('proxy', 0)\n            dynamic = self.json_args['config'].get('dynamic', 0)\n            header = self.json_args['config'].get('header', '{}')\n            cookie = self.json_args['config'].get('cookie', '{}')\n            form = self.json_args['config'].get('form', '{}')\n            selectors = self.json_args['selectedField'].get('selectors', [])\n            requestInterval = self.json_args['requestInterval']\n            pageLoadDelay = self.json_args['pageLoadDelay']\n            # 字段验证\n            fields = [i['id'] for i in selectors if i['type'] in ['SelectorText', 'SelectorElementAttribute', 'SelectorHTML', 'SelectorImage']]\n            mongo = MongodbLink()\n            if not name:\n                self.set_header('Content-Type', 'application/json; charset=UTF-8')\n                return self.write(json_encode({'state': False, 'message': '配置名称为空'}))\n            db = mongo.get_db()\n            result = mongo.exe_search_one(db[name], {})\n            if name == 'config':\n                self.set_header('Content-Type', 'application/json; charset=UTF-8')\n                return self.write(json_encode({'state': False, 'message': '配置名称不能为config'}))\n            if not result['state']:\n                self.set_header('Content-Type', 'application/json; charset=UTF-8')\n                return self.write(json_encode([]))\n            if result['data']:\n                db_fields = [i for i in result['data'] if i != \"_id\"]\n                for i in fields:\n                    if i not in db_fields:\n                        self.set_header('Content-Type', 'application/json; charset=UTF-8')\n                        return self.write(json_encode({'state': False, 'message': '采集字段和数据库已有字段不符, 请修改配置名或修改采集字段.'}))\n\n            # settings设置\n            # 代理服务器\n            settings = {}\n            settings['DOWNLOADER_MIDDLEWARES'] = {}\n            if proxy:\n                settings = {\n                    'DOWNLOADER_MIDDLEWARES': {\n                        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 542,\n                        'server.spider.middlewares.ProxyIPMiddleware': 100\n                    }\n                }\n            # 动态加载\n            if dynamic:\n                settings['DOWNLOADER_MIDDLEWARES'].update({\n                    # 关闭默认下载器\n                    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,\n                    'server.spider.middlewares.PhantomJSMiddleware': 543\n                })\n            # 下载间隔\n            if requestInterval: settings['DOWNLOAD_DELAY'] = requestInterval\n            if self.crawl(url, name, CrawlWebsiteSpider, method, header, cookie, form, settings, selectors, pageLoadDelay):\n                return self.write({'state': True, 'message': 'success'})\n            else:\n                raise HTTPError(400)\n        else:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            self.write(json.dumps({'state': False, 'message': '程序启动失败<br>字段选择器格式错误，或缺失字段，请检查.'}))\n            self.finish()\n\n    def crawl(self, url, name, spider_cls, method, header, cookie, form, settings, selectors, pageLoadDelay):\n        \"\"\"启动spider\"\"\"\n        # 存储\n        # storage_opts = self.opts['spider.storage']\n        # settings = {\n        #     'MOTOR_PIPELINE_ENABLED': storage_opts['enabled'],\n        #     'MOTOR_PIPELINE_DB_NAME': storage_opts['db_name'],\n        #     'MOTOR_PIPELINE_DB': storage_opts['db_name'],\n        #     'MOTOR_PIPELINE_URI': storage_opts['uri'],\n        # }\n        spider_cls = get_spider_cls(url, spider_cls)\n        if spider_cls is not None:\n            self.crawler = create_crawler(settings, spider_cls=spider_cls, name=name, url=url, method=method, header=header,\n                                          cookie=cookie, form=form, selectors=selectors, pageLoadDelay=pageLoadDelay)\n            self.crawler_process.crawl(self.crawler)\n            return True\n        return False\n\nclass StopCrawler(_ControlJobHandler):\n    \"\"\"停止job\"\"\"\n    def control_job(self, job_id):\n        self.crawler_process.stop_job(job_id)\n\nclass PauseCrawler(_ControlJobHandler):\n    \"\"\"暂停任务\"\"\"\n    def control_job(self, job_id):\n        self.crawler_process.pause_job(job_id)\n\nclass ResumeCrawler(_ControlJobHandler):\n    \"\"\"恢复任务\"\"\"\n    def control_job(self, job_id):\n        self.crawler_process.resume_job(job_id)\n\nclass CrawlerStatus(BaseRequestHandler):\n    \"\"\"job状态\"\"\"\n    def get(self):\n        crawl_ids_arg = self.get_argument('crawl_ids', '')\n        if crawl_ids_arg == '':\n            jobs = self.crawler_process.get_jobs()\n        else:\n            crawl_ids = set(map(int, crawl_ids_arg.split(',')))\n            jobs = [job for job in self.crawler_process.get_jobs()\n                    if job['id'] in crawl_ids]\n        return self.write(json_encode({'jobs': jobs}))\n\nclass Config(BaseRequestHandler):\n    \"\"\"添加配置\"\"\"\n    def get(self):\n        return self.render('config.html')\n\nclass Work(BaseRequestHandler):\n    \"\"\"添加字段\"\"\"\n    def post(self):\n        name = self.get_argument('name', '').replace('\"', '')\n        url = self.get_argument('url', '').replace('\"', '')\n        method = self.get_argument('method', '').replace('\"', '')\n        proxy = int(self.get_argument('proxy', 0))\n        dynamic = int(self.get_argument('dynamic', 0))\n        header = json.loads(self.get_argument('header', '{}'))\n        cookie = json.loads(self.get_argument('cookie', '{}'))\n        form = json.loads(self.get_argument('form', '{}'))\n        config_data = json_encode({'name': name, 'url': url, 'method': method, 'proxy': proxy, 'dynamic': dynamic, 'header': header, 'cookie': cookie, 'form': form})\n        # 代理服务器\n        settings = {}\n        settings['DOWNLOADER_MIDDLEWARES'] = {}\n        if proxy:\n            settings = {\n                'DOWNLOADER_MIDDLEWARES': {\n                    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 542,\n                    'server.spider.middlewares.ProxyIPMiddleware': 100\n                }\n            }\n        # 动态加载\n        if dynamic:\n            settings['DOWNLOADER_MIDDLEWARES'].update({\n                # 关闭默认下载器\n                'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,\n                'server.spider.middlewares.PhantomJSMiddleware': 543\n            })\n        if not url:\n            return self.render('config.html')\n        # 启动spider\n        result = thread_crawl(url, CrawlEntranceSpider, method, header, cookie, form, settings)\n        if result:\n            return self.render('work.html', config_data=config_data)\n        else:\n            return self.write('waiting')\n\nclass Next(BaseRequestHandler):\n    \"\"\"跳转详情页\"\"\"\n    def post(self):\n        name = self.get_argument('name', '').replace('\"', '')\n        url = self.get_argument('url', '').replace('\"', '')\n        method = self.get_argument('method', '').replace('\"', '')\n        proxy = int(self.get_argument('proxy', 0))\n        dynamic = int(self.get_argument('dynamic', 0))\n        header = json.loads(self.get_argument('header', '{}'))\n        cookie = json.loads(self.get_argument('cookie', '{}'))\n        form = json.loads(self.get_argument('form', '{}'))\n        # 代理服务器\n        settings = {}\n        settings['DOWNLOADER_MIDDLEWARES'] = {}\n        if proxy:\n            settings = {\n                'DOWNLOADER_MIDDLEWARES': {\n                    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 542,\n                    'server.spider.middlewares.ProxyIPMiddleware': 100\n                }\n            }\n        # 动态加载\n        if dynamic:\n            settings['DOWNLOADER_MIDDLEWARES'].update({\n                # 关闭默认下载器\n                'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,\n                'server.spider.middlewares.PhantomJSMiddleware': 543\n            })\n        if not url:\n            return self.render('config.html')\n        # 启动spider\n        result = thread_crawl(url, CrawlEntranceSpider, method, header, cookie, form, settings)\n        if result:\n            return self.write('success')\n        else:\n            return self.write('fail')\n\nclass Data(BaseRequestHandler):\n    \"\"\"查看数据\"\"\"\n    def get(self):\n        mongo = MongodbLink()\n        db = mongo.get_db()\n        collection_names = db.collection_names()\n        result = [{\"text\": \"数据集合\", \"nodes\": [{'text': j} for i, j in enumerate(collection_names) if j != 'config']}]\n        return self.render('data.html', collection_names=result)\n\nclass CollectionColumns(BaseRequestHandler):\n    \"\"\"获取集合字段\"\"\"\n    def get(self):\n        mongo = MongodbLink()\n        collection_name = self.get_argument('collection_name', '')\n        if not collection_name:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode([]))\n        db = mongo.get_db()\n        result = mongo.exe_search_one(db[collection_name], {})\n        if not result['state']:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode([]))\n        fields = result['data']\n        if not fields:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode([]))\n        result = [{'field': i, 'title': i} for i in fields if i != \"_id\"]\n        self.set_header('Content-Type', 'application/json; charset=UTF-8')\n        return self.write(json_encode(result))\n\nclass CollectionData(BaseRequestHandler):\n    \"\"\"获取集合中数据\"\"\"\n    def get(self):\n        mongo = MongodbLink()\n        collection_name = self.get_argument('collection_name', '')\n        if not collection_name:\n            return self.write([])\n        # limit = int(self.get_argument('limit', 10))\n        # offset = int(self.get_argument('offset', 10))\n        # limit = 50 if limit > 50 else limit\n        # offset = 50 if offset > 50 else offset\n        # 查询数据\n        db = mongo.get_db()\n        # result = mongo.exe_search_page(db[collection_name], {}, limit, offset)\n        result = mongo.exe_search(db[collection_name], {})\n        if not result['state']:\n            return self.write([])\n        else:\n            for i in result['data']: del i[\"_id\"]\n        self.set_header('Content-Type', 'application/json; charset=UTF-8')\n        # 查询总数\n        total = mongo.exe_count(db[collection_name], {})\n        # self.write(json_encode({'total': total['data'], 'rows': result['data']}))\n        self.write(json_encode({'total': total['data'], 'data': result['data']}))\n\nclass DateSave(BaseRequestHandler):\n    \"\"\"保存数据\"\"\"\n    def post(self):\n        mongo = MongodbLink()\n        selectedField = json.loads(self.get_argument('selectedField', '{}'))\n        config = json.loads(self.get_argument('config', '{}'))\n        # 请求间隔\n        requestInterval = int(self.get_argument('requestInterval', 0))\n        # 翻页间隔\n        pageLoadDelay = int(self.get_argument('pageLoadDelay', 0))\n        # 查空\n        if not selectedField or not config:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': False, 'message': '无法获取配置, 请检查.'}))\n        # 查重\n        count = mongo.exe_count(config, {'config.name': config['name']})\n        if not count:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': False, 'message': '配置名称已存在, 请修改.'}))\n        # 保存数据\n        request = {'selectedField': selectedField, 'config': config, 'requestInterval': requestInterval, \"pageLoadDelay\": pageLoadDelay}\n        conf = mongo.get_config()\n        result = mongo.exe_insert(conf, request)\n        if not result['state']:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': False, 'message': '保存配置失败.'}))\n        else:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': True, 'message': 'success'}))\n\nclass DateDelete(BaseRequestHandler):\n    \"\"\"删除数据\"\"\"\n    def get(self):\n        mongo = MongodbLink()\n        name = self.get_argument('name', '')\n        print(name)\n        # 查空\n        if not name:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': False, 'message': '无法获取参数, 请检查.'}))\n        # 删除数据\n        request = {'config.name': name}\n        conf = mongo.get_config()\n        result = mongo.exe_remove(conf, request)\n        if not result['state']:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': False, 'message': '删除配置失败.'}))\n        else:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': True, 'message': 'success'}))\n\nclass Read(BaseRequestHandler):\n    \"\"\"读取配置\"\"\"\n    def get(self):\n        # 查询配置\n        mongo = MongodbLink()\n        conf = mongo.get_config()\n        data = mongo.exe_search(conf, {})\n        if not data['data']:\n            return self.render('read.html', result=[{\"text\": \"配置集合\", \"nodes\": []}])\n        result = [{\"text\": \"配置集合\", \"nodes\": [{'text': i['config']['name']} for i in data['data']]}]\n        return self.render('read.html', result=result)\n\nclass CollectionRead(BaseRequestHandler):\n    \"\"\"读取配置集合\"\"\"\n    def get(self):\n        name = self.get_argument('name', '')\n        if not name:\n            self.set_header('Content-Type', 'application/json; charset=UTF-8')\n            return self.write(json_encode({'state': False, 'message': '字段值为空'}))\n        # 查询配置数据\n        mongo = MongodbLink()\n        conf = mongo.get_config()\n        conf_data = mongo.exe_search_one(conf, {'config.name': name})\n        del conf_data['data']['_id']\n        self.set_header('Content-Type', 'application/json; charset=UTF-8')\n        return self.write(json_encode({'state': True, 'message': 'success', 'data': conf_data['data']}))\n\n\n\nclass ErrorHandler(BaseRequestHandler):\n    \"\"\"异常界面处理\"\"\"\n    def get(self):\n        return self.write_error(404)\n\n    def write_error(self, status_code, **kwargs):\n        if status_code == 404:\n            self.render('error_status/404.html')\n        elif status_code == 500:\n            self.render('error_status/500.html')\n        else:\n            self.write('error'+ str(status_code))\n"
  },
  {
    "path": "server/spider/manhole.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nfrom twisted.internet import protocol\nfrom twisted.conch.telnet import TelnetTransport, TelnetBootstrapProtocol\nfrom twisted.conch.insults import insults\nfrom twisted.conch.manhole import ColoredManhole\n\ndef start(port=None, host=None, telnet_vars=None):\n    from twisted.internet import reactor\n\n    port = int(port) if port else 6023\n    host = host or '127.0.0.1'\n    telnet_vars = telnet_vars or {}\n\n    factory = protocol.ServerFactory()\n    factory.protocol = lambda: TelnetTransport(\n        TelnetBootstrapProtocol,\n        insults.ServerProtocol,\n        ColoredManhole,\n        telnet_vars\n    )\n    return reactor.listenTCP(port, factory, interface=host)"
  },
  {
    "path": "server/spider/middlewares.py",
    "content": "# -*- coding: utf-8 -*-\n\n# Define here the models for your spider middleware\n#\n# See documentation in:\n# http://doc.scrapy.org/en/latest/topics/spider-middleware.html\n\n# from scrapy import signals\nfrom selenium import webdriver\nfrom scrapy.http import HtmlResponse\nimport base64\n\n#指定使用的浏览器，写在此处而不写在类中，是为了不每次调用都生成一个信息独享，减少内存使用\n# global driver\n# driver = webdriver.PhantomJS()\n\nclass PhantomJSMiddleware(object):\n    \"\"\"动态解析js\"\"\"\n    @classmethod\n    def process_request(cls, request, spider):\n        # 开启动态加载\n        # global driver\n        driver = webdriver.PhantomJS(executable_path=r'D:\\phantomjs-2.1.1\\bin\\phantomjs')\n        driver.get(request.url)\n        # # 滚动页面\n        # driver.execute_script(js)\n        # # 等待JS执行\n        # time.sleep(1)\n        # 编码\n        content = driver.page_source.encode('utf-8', 'ignore')\n        driver.quit()\n        return HtmlResponse(request.url, encoding='utf-8', body=content, status=200)\n\nclass ProxyIPMiddleware(object):\n    \"\"\"代理ip\"\"\"\n    def process_request(self, request, spider):\n        \"\"\"代理ip\"\"\"\n        request.meta['proxy'] = \"http://proxy.abuyun.com:9020\"\n        proxy_user_pass = \"H1IF096FYI74C29D:10F8046B21581DBA\"\n        encoded_user_pass = base64.b64encode(proxy_user_pass.encode()).decode()\n        request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass"
  },
  {
    "path": "server/spider/monitor.py",
    "content": "# -*- coding: utf-8 -*-\nimport logging, datetime\n\nfrom server.spider.crawler_process import (\n    MyselfCrawlerProcess,\n    agg_stats_changed,\n    CrawlerProcessSignals as CPS,\n)\nfrom server.spider.process_stats import ProcessStatsMonitor\nfrom server.config.wsbase import BaseWSHandler\n\n\nlogger = logging.getLogger(__name__)\n\nclass Monitor(BaseWSHandler):\n    \"\"\"WebSocket推送\"\"\"\n    engine_signals = [\n        CPS.spider_closing, CPS.engine_paused, CPS.engine_resumed,\n        CPS.engine_tick, CPS.downloader_enqueued, CPS.downloader_dequeued\n    ]\n\n    def initialize(self, crawler_process, opts):\n        \"\"\"\n        :param MyselfCrawlerProcess crawler_process: crawler process\n        \"\"\"\n        self.cp = crawler_process\n        self.opts = opts\n\n    def on_open(self):\n        \"\"\"建立connection\"\"\"\n        logger.debug(\"new connection\")\n        self.cp.signals.connect(self.on_stats_changed, agg_stats_changed)\n        self.cp.signals.connect(self.on_spider_opened, CPS.spider_opened)\n        self.cp.signals.connect(self.on_spider_closed, CPS.spider_closed)\n        for signal in self.engine_signals:\n            self.cp.signals.connect(self.on_engine_state_changed, signal)\n\n        self.cp.procmon.signals.connect(self.on_process_stats, ProcessStatsMonitor.signal_updated)\n        self.write_event(\"jobs:state\", self.cp.jobs)\n\n    def on_close(self):\n        logger.debug(\"connection closed\")\n        self.cp.signals.disconnect(self.on_stats_changed, agg_stats_changed)\n        self.cp.signals.disconnect(self.on_spider_opened, CPS.spider_opened)\n        self.cp.signals.disconnect(self.on_spider_closed, CPS.spider_closed)\n        for signal in self.engine_signals:\n            self.cp.signals.disconnect(self.on_engine_state_changed, signal)\n        self.cp.procmon.signals.disconnect(self.on_process_stats, ProcessStatsMonitor.signal_updated)\n\n    def on_spider_opened(self, spider):\n        self._send_jobs_state()\n\n    def on_spider_closed(self, spider, reason):\n        self._send_jobs_state()\n\n    def on_engine_state_changed(self, crawler):\n        self._send_jobs_state()\n\n    def on_tick(self):\n        self._send_jobs_state()\n\n    def on_stats_changed(self, changes, crawler):\n        # Don't log anything here! Log events are counted by stats collector,\n        # so logging a message will trigger more on_stats_changed events.\n        crawl_id = crawler.spider.crawl_id\n        self.write_event(\"stats:changed\", [crawl_id, changes])\n\n    def on_process_stats(self, stats):\n        self.write_event(\"process:stats\", stats)\n\n    def _send_jobs_state(self):\n        self.write_event(\"jobs:state\", self.cp.jobs)\n"
  },
  {
    "path": "server/spider/pipelines.py",
    "content": "# -*- coding: utf-8 -*-\n\"\"\"\nAsync MongoDB item exporter using Motor_.\n\n.. _Motor: https://github.com/mongodb/motor\n\"\"\"\nfrom __future__ import absolute_import\nimport logging\nimport datetime\n\nfrom tornado import gen\nfrom scrapy.exceptions import NotConfigured\n\nfrom .utils import tt_coroutine, json_encode\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass MotorPipeline(object):\n    \"\"\"\n    This pipeline exports tems to MongoDB using async mongo\n    driver (motor). Interaction with MongoDB doesn't block\n    the event loop.\n\n    On start it creates object in 'jobs' collection and sets\n    spider.motor_job_id to the ID of this job.\n\n    If MOTOR_PIPELINE_JOBID_KEY option is set, job id is added to\n    each stored item under the specified key name.\n    \"\"\"\n    ITEMS_COLLECTION = 'items'\n    JOBS_COLLECTION = 'jobs'\n\n    def __init__(self, crawler):\n        try:\n            import motor\n        except ImportError:\n            logger.info(\"MotorPipeline is disabled because motor Python package \"\n                        \"is not available\")\n            raise NotConfigured\n\n        self.crawler = crawler\n        opts = self.crawler.settings\n        if not opts.getbool('MOTOR_PIPELINE_ENABLED', False):\n            raise NotConfigured\n\n        self.job_id_key = opts.get('MOTOR_PIPELINE_JOBID_KEY')\n        self.db_uri = opts.get('MOTOR_PIPELINE_URI', 'mongodb://localhost:27017')\n        db_name = opts.get('MOTOR_PIPELINE_DB_NAME', 'motor_exporter')\n\n        self.client = motor.MotorClient(self.db_uri)\n        self.items_table = self.client[db_name][self.ITEMS_COLLECTION]\n        self.jobs_table = self.client[db_name][self.JOBS_COLLECTION]\n        self.connected = False\n\n    @classmethod\n    def from_crawler(cls, crawler):\n        return cls(crawler)\n\n    @tt_coroutine\n    def open_spider(self, spider):\n        try:\n            yield self.items_table.ensure_index(self.job_id_key)\n\n            self.job_id = yield self.jobs_table.insert({\n                'started_at': datetime.datetime.now(),\n                'spider': spider.name,\n            })\n            spider.motor_job_id = str(self.job_id)\n\n            logger.info(\"Crawl job generated id: %s\", self.job_id,\n                        extra={'crawler': self.crawler})\n            self.connected = True\n        except Exception:\n            self.job_id = None\n            logger.error(\n                \"Can't connect to %s. Items won't be stored.\",\n                self.db_uri, exc_info=True,\n                extra={'crawler': self.crawler},\n            )\n\n    @tt_coroutine\n    def close_spider(self, spider):\n        if self.job_id is None:\n            self.client.close()\n            return\n\n        # json is to fix an issue with dots in key names\n        stats = json_encode(self.crawler.stats.get_stats())\n\n        res = yield self.jobs_table.update(\n            {'_id': self.job_id},\n            {'$set': {\n                'finished_at': datetime.datetime.now(),\n                'stats': stats,\n            }}\n        )\n        self.client.close()\n        logger.info(\"Job info %s is saved\", self.job_id,\n                    extra={'crawler': self.crawler})\n\n    @tt_coroutine\n    def process_item(self, item, spider):\n        if not self.connected:\n            raise gen.Return(item)\n\n        mongo_item = dict(item)\n        if self.job_id_key:\n            mongo_item[self.job_id_key] = self.job_id\n\n        try:\n            yield self.items_table.insert(mongo_item)\n            self.crawler.stats.inc_value(\"motor/items_stored_count\")\n        except Exception as e:\n            self.crawler.stats.inc_value(\"motor/store_error_count\")\n            self.crawler.stats.inc_value(\"motor/store_error_count/\" + e.__class__.__name__)\n            logger.error(\"Error storing item\", exc_info=True, extra={\n                'crawler': self.crawler\n            })\n        raise gen.Return(item)\n"
  },
  {
    "path": "server/spider/process_stats.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nfrom scrapy.signalmanager import SignalManager\nfrom tornado.ioloop import PeriodicCallback\n\nimport logging, psutil, os, time\n\nlogger = logging.getLogger(__name__)\n\nclass ProcessStatsMonitor(object):\n    \"\"\"查看进程状态, 每秒发布一次\"\"\"\n    signal_updated = object()\n\n    def __init__(self, interval=1.0):\n        self.signals = SignalManager(self)\n        self.process = psutil.Process(os.getpid())\n        self.interval = interval\n        self._task = PeriodicCallback(self._emit, self.interval*1000)\n        self._recent = {}\n\n    def start(self):\n        \"\"\"启动进程\"\"\"\n        self._task.start()\n\n    def stop(self):\n        \"\"\"停止进程\"\"\"\n        self._task.stop()\n\n    def get_recent(self):\n        \"\"\"当前进程信息\"\"\"\n        return self._recent\n\n    def _emit(self):\n        \"\"\"进程属性\"\"\"\n        cpu_times = self.process.cpu_times()\n        ram_usage = self.process.memory_info()\n        stats = {\n            # 内存使用率\n            'ram_percent': self.process.memory_percent(),\n            # 内存rss\n            'ram_rss': ram_usage.rss,\n            # 内存vms\n            'ram_vms': ram_usage.vms,\n            # cpu百分比\n            'cpu_percent': self.process.cpu_percent(),\n            # 用户cpu时间\n            'cpu_time_user': cpu_times.user,\n            # 系统cpu时间\n            'cpu_time_system': cpu_times.system,\n            # 上下文\n            'context_switches': self.process.num_ctx_switches(),\n            # 线程数\n            'num_threads': self.process.num_threads(),\n            # 运行时间\n            'server_time': int(time.time() * 1000)\n        }\n        # 当前系统状态\n        self._recent = stats\n        self.signals.send_catch_log(self.signal_updated, stats=stats)"
  },
  {
    "path": "server/spider/scrapy_thread.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\nimport multiprocessing\n\nfrom scrapy.crawler import CrawlerProcess, Crawler\n\ndef thread_crawl(url, spider_cls, method, header, cookie, form, settings):\n    \"\"\"多进程同步\"\"\"\n    scrapy_thread = multiprocessing.Process(\n        target=crawl,\n        args=(url, spider_cls, method, header, cookie, form, settings)\n    )\n    scrapy_thread.start()\n    # 等待完成\n    scrapy_thread.join()\n    return True\n\ndef crawl(url, spider_cls, method, header, cookie, form, settings):\n    \"\"\"启动spider\"\"\"\n    crawler_process = CrawlerProcess()\n    crawler = create_crawler(settings, spider_cls=spider_cls, url=url, method=method, header=header, form=form, cookie=cookie)\n    crawler_process.crawl(crawler)\n    crawler_process.start()\n    return True\n\nDEFAULT_SETTINGS = {\n    'ROBOTSTXT_OBEY': False,\n    'DEPTH_STATS_VERBOSE': True,\n    'BOT_NAME': 'spider_platform',\n    'USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2148.0 Safari/537.36',\n    'LOG_LEVEL': 'DEBUG',\n    'TELNETCONSOLE_ENABLED': False,\n    # 超时时间\n    'DOWNLOAD_TIMEOUT': 30\n}\n\ndef create_crawler(settings=None, spider_cls=None, **kwargs):\n    \"\"\"生成crawler类\"\"\"\n    _settings = DEFAULT_SETTINGS.copy()\n    _settings.update(settings or {})\n    return IndexCrawler(spider_cls, _settings, **kwargs)\n\nclass IndexCrawler(Crawler):\n    \"\"\"扩展Crawler\"\"\"\n    def __init__(self, spidercls, settings=None, **kwargs):\n        super(IndexCrawler, self).__init__(spidercls, settings)\n        self.url = kwargs.get('url', '')\n        self.method = kwargs.get('method', 'get')\n        self.header = kwargs.get('header', {})\n        self.form = kwargs.get('form', {})\n        self.cookie = kwargs.get('cookie', {})\n\n    def _create_spider(self, *args, **kwargs):\n        \"\"\"创建spider\"\"\"\n        return self.spidercls.from_crawler(self, *args, url=self.url, method=self.method, header=self.header, form=self.form, cookie=self.cookie, **kwargs)\n"
  },
  {
    "path": "server/spider/signals.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nclass Signal(object):\n    def __init__(self, name, supports_defer):\n        self.name = name\n        self.supports_defer = supports_defer\n\n    def __repr__(self):\n        return \"%s(%r, supports_defer=%r)\" % (\n            self.__class__.__name__, self.name, self.supports_defer\n        )"
  },
  {
    "path": "server/spider/spider.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport re, os, urllib.parse, requests\nfrom bs4 import BeautifulSoup\n\nfrom scrapy.http.request import Request\nfrom scrapy import FormRequest\nimport scrapy, logging, datetime\nfrom scrapy.http.response.html import HtmlResponse\nfrom scrapy.selector import Selector\nfrom itertools import zip_longest\n\nfrom server.spider.crawler_process import MyselfCrawler\nfrom server.config.opts import opts\nfrom server.db.db import MongodbLink\n\n\nDEFAULT_SETTINGS = {\n    'DEPTH_STATS_VERBOSE': True,\n    'DEPTH_PRIORITY': 0,\n    'BOT_NAME': 'spider_platform',\n    'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0',\n    'LOG_LEVEL': 'DEBUG',\n    'TELNETCONSOLE_ENABLED': False,\n    # 'STATS_CLASS': 'server.spider.stats.EventedStatsCollector',\n    'DOWNLOADER': 'server.spider.crawler_process.MyselfDownloader',\n    # 'ITEM_PIPELINES': {\n    #     'server.spider.motor_exporter.pipelines.MotorPipeline': 100,\n    # },\n    'MOTOR_PIPELINE_JOBID_KEY': '_job_id',\n    # 超时时间\n    'DOWNLOAD_TIMEOUT': 30\n}\n\ndef create_crawler(settings=None, spider_cls=None, **kwargs):\n    \"\"\"生成crawler类\"\"\"\n    _settings = DEFAULT_SETTINGS.copy()\n    _settings.update(settings or {})\n    return MyselfCrawler(spider_cls, _settings, **kwargs)\n\nclass BaseSpider(scrapy.Spider):\n    \"\"\"基类spider\"\"\"\n    crawl_id = None\n    domain = None\n    motor_job_id = None\n\n    def __init__(self, *args, **kwargs):\n        super(BaseSpider, self).__init__(*args, **kwargs)\n        # 不要把日志配置到domain中\n        logging.getLogger(\"scrapy.core.scraper\").setLevel(logging.INFO)\n\n    def get_page_item(self, response, _type='page'):\n        \"\"\"spider日志\"\"\"\n        return {\n            'crawled_at': datetime.datetime.now(),\n            'url': response.url,\n            'status': response.status,\n            'headers': response.headers,\n            'body': response.body_as_unicode(),\n            'meta': response.meta,\n            '_type': _type\n        }\n\nclass CrawlEntranceSpider(BaseSpider):\n    \"\"\"入口页面加载\"\"\"\n    name = \"Enter\"\n    # 起始url\n    start_url = ''\n    # 请求方式\n    method = ''\n    # post表单\n    form = {}\n    # cookie\n    cookie = {}\n    # 覆写setting\n    # custom_settings = {}\n\n    def __init__(self, url, method, header, form, cookie, *args, **kwargs):\n        \"\"\"外部参数引入url\"\"\"\n        super(CrawlEntranceSpider, self).__init__(*args, **kwargs)\n        self.start_url = url\n        self.method = method\n        self.header = header\n        self.form = form\n        self.cookie = cookie\n\n    def start_requests(self):\n        \"\"\"初始化请求\"\"\"\n        # 请求方式\n        if self.method.lower() == 'post':\n            request = FormRequest(url=self.start_url, formdata=self.form, cookies=self.cookie, callback=self.parse, dont_filter=True)\n        else:\n            request = Request(url=self.start_url, cookies=self.cookie, callback=self.parse, dont_filter=True)\n        # 动态加载\n        # request.meta['PantomJs'] = True\n        yield  request\n\n    def parse(self, response):\n        \"\"\"写入文件\"\"\"\n        # 本地ip, 端口\n        host = 'localhost' if opts['spider']['host'] == '0.0.0.0' else opts['spider']['host']\n        port = opts['spider']['port']\n        localhost = 'http://' + host + ':' + port\n        # 判断响应结果\n        if not isinstance(response, HtmlResponse):\n            self.logger.info(\"non-HTML response is skipped: %s\", response.url)\n            return\n        # 响应对象\n        soup = BeautifulSoup(response.body, 'html.parser')\n        # 查找url中host\n        _, rest = urllib.parse.splittype(response.url)\n        host, _ = urllib.parse.splithost(rest)\n\n        res = soup.prettify()\n        res = res.replace('target=\"_blank\"', '')\n        # 查找jquery\n        for i in re.findall(\"<script.*?>\", res, re.S | re.I)\\\n                + re.findall(\"<img.*?>\", res, re.S | re.I)\\\n                + re.findall(\"<iframe.*?>\", res, re.S | re.I):\n            if not isinstance(i, str):\n                continue\n            result = re.findall('''src=(['|\"].*?)['|\"]''', i, re.S | re.I)\n            if not result:\n                continue\n            if re.findall('^(?!http|javascript|//)/?\\w.*?$', result[0][1:], re.S | re.I) or result[0][1:].startswith(\n                    \".\"):\n                _, script_rest = urllib.parse.splittype(result[0])\n                script_host, _ = urllib.parse.splithost(script_rest)\n                if not script_host:\n                    if result[0][1:].startswith(\"..\"):\n                        new_val = result[0][0] + result[0][3:]\n                    elif result[0][1:].startswith(\".\"):\n                        new_val = result[0][0] + result[0][2:]\n                    elif not result[0][1:].startswith(\"/\"):\n                        new_val = result[0][0] + \"/\" + result[0][1:]\n                    else:\n                        new_val = result[0]\n                    res = res.replace(\"src=\" + result[0] + result[0][0], 'src=' + new_val[0] + '//' + host + new_val[1:] + new_val[0])\n\n        for i in re.findall(\"<a.*?/a>\", res, re.S | re.I) + re.findall(\"<link.*?>\", res, re.S | re.I):\n            if not isinstance(i, str):\n                continue\n            result =  re.findall('''href=(['|\"].*?)['|\"]''', i, re.S | re.I)\n            if not result:\n                continue\n            if re.findall('^(?!http|javascript|//)/?\\w.*?$', result[0][1:], re.S | re.I) or result[0][1:].startswith(\n                    \".\"):\n                _, script_rest = urllib.parse.splittype(result[0])\n                script_host, _ = urllib.parse.splithost(script_rest)\n                if not script_host:\n                    if result[0][1:].startswith(\"..\"):\n                        new_val = result[0][0] + result[0][3:]\n                    elif result[0][1:].startswith(\".\"):\n                        new_val = result[0][0] + result[0][2:]\n                    elif not result[0][1:].startswith(\"/\"):\n                        new_val = result[0][0] + \"/\" + result[0][1:]\n                    else:\n                        new_val = result[0]\n                    res = res.replace(\"href=\" + result[0] + result[0][0], 'href=' + new_val[0] + '//' + host + new_val[1:] + new_val[0])\n\n        soup = BeautifulSoup(res, 'html.parser')\n        # 添加jquery\n        jquery = soup.new_tag(\"script\", src=localhost+'/static/lib/jquery-2.1.4.min.js')\n        soup.body.append(jquery)\n        # jqueryAlias = soup.new_tag(\"script\")\n        # jqueryAlias.string =\n        # 添加soup对象集合\n        soupHeadArr = []\n        # js 文件\n        scriptArr = [\n            '/static/scripts/ContentSelector.js',\n            '/static/lib/css-selector/lib/CssSelector.js',\n            '/static/scripts/ElementQuery.js',\n            '/static/scripts/DataExtractor.js',\n            '/static/lib/sugar-1.4.1.js',\n            '/static/lib/jquery.whencallsequentially.js',\n            '/static/lib/jquery.mloading.js',\n            '/static/scripts/UniqueElementList.js',\n            '/static/lib/ajaxhook.js'\n        ]\n        # css文件\n        linkArr = [\n            '/static/lib/bootstrap-3.3.7/css/bootstrap.css',\n            '/static/css/content_script.css',\n            '/static/css/jquery.mloading.css'\n        ]\n\n        for i in scriptArr:\n            soupHeadArr.append(soup.new_tag(\"script\", src=localhost+i))\n\n        for i in linkArr:\n            soupHeadArr.append(soup.new_tag(\"link\", rel=\"stylesheet\", href=localhost+i))\n\n        for i in soupHeadArr:\n            soup.body.append(i)\n\n        # 不带referer\n        metaReferer = soup.new_tag(\"meta\")\n        metaReferer.attrs = {'name': 'referrer', 'content': 'never'}\n\n        # 页面内点击\n        startScript = soup.new_tag(\"script\")\n        startScript.string = '''$('*').bind('click.custom', function(event){\n            event.preventDefault();\n            if (/sitemap-select/.test($(event.currentTarget).attr('class'))){\n                return false;\n            }\n            if (event.target.nodeName.toLowerCase() == 'a'){\n                // 深拷贝\n                $(\"body\").mLoading(\"show\");\n                var params = JSON.parse(JSON.stringify(parent.CONFIG_DATA))\n                params.url = event.currentTarget.href;\n                params.header = JSON.stringify(params.header)\n                params.cookie = JSON.stringify(params.cookie)\n                params.form = JSON.stringify(params.form)\n                $.ajax({\n                    url: \"%s/add/next\",\n                    type: \"post\",\n                    data: params\n                }).done(function (data){\n                    location.reload();\n                }).fail(function (data){\n                    console.log(data);\n                }).always(function (){\n                    $(\"body\").mLoading(\"hide\");\n                })\n            }\n            return false;\n        });''' % localhost\n        # 拦截所有ajax请求\n        hookScript = soup.new_tag(\"script\")\n        hookScript.string = '''hookAjax({\n            open: function(arg){\n                return arg[1] == '%s/add/next' ?  false : true;\n            } \n        });''' % localhost\n        soup.head.append(metaReferer)\n        soup.body.append(startScript)\n        soup.body.append(hookScript)\n        # 字符串美化\n        res = soup.prettify()\n\n        path = os.getcwd() + r'\\server\\static\\spider\\start.html'\n        os.remove(path)\n        fw = open(path, 'wb')\n        fw.write(res.encode('utf-8', 'ignore'))\n        fw.close()\n\nclass CrawlWebsiteSpider(BaseSpider):\n    \"\"\"网站爬虫\"\"\"\n    name = 'CrawlWebsiteSpider'\n    # 起始url\n    start_url = ''\n    # 请求方式\n    method = ''\n    # post表单\n    form = {}\n    # cookie\n    cookie = {}\n    # 选择器\n    selectors = []\n    # 翻页间隔\n    pageLoadDelay = 0\n    # 覆写settings\n    # custom_settings = {\n    #     # 爬取深度\n    #     'DEPTH_LIMIT': 2\n    # }\n\n    def __init__(self, url, name, method, header, form, cookie, selectors, pageLoadDelay, *args, **kwargs):\n        super(CrawlWebsiteSpider, self).__init__(*args, **kwargs)\n        self.task_name = name\n        self.start_url = url\n        self.method = method\n        self.header = {'USER_AGENT': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'}\n        self.header.update(header)\n        self.form = form\n        self.cookie = cookie\n        self.selectors = selectors\n        self.pageLoadDelay = pageLoadDelay\n        # 数据库\n        self.mongo = MongodbLink()\n\n    def start_requests(self):\n        \"\"\"初始化请求资源\"\"\"\n        self.logger.info(\"Started job %s, #%d for domain %s\", self.motor_job_id, self.crawl_id, self.domain)\n\n        # 请求方式\n        if self.method.lower() == 'post':\n            request = FormRequest(url=self.start_url, formdata=self.form, cookies=self.cookie, callback=self.parse_first, dont_filter=True)\n        else:\n            request = Request(url=self.start_url, cookies=self.cookie, callback=self.parse_first, dont_filter=True)\n        yield request\n\n    def parse_first(self, response):\n        \"\"\"web socket参数\"\"\"\n        _, rest = urllib.parse.splittype(response.url)\n        host, _ = urllib.parse.splithost(rest)\n        self.domain = host\n        self.crawler.stats.set_value('arachnado/start_url', self.start_url)\n        self.crawler.stats.set_value('arachnado/domain', self.domain)\n\n        for elem in self.parse(response):\n            yield elem\n\n    def detail_first(self, response):\n        \"\"\"详情页参数\"\"\"\n        _, rest = urllib.parse.splittype(response.url)\n        host, _ = urllib.parse.splithost(rest)\n        self.domain = host\n        self.crawler.stats.set_value('arachnado/start_url', self.start_url)\n        self.crawler.stats.set_value('arachnado/domain', self.domain)\n\n        for elem in self.get_detail(response):\n            yield elem\n\n    def parse(self, response):\n        \"\"\"响应处理函数\"\"\"\n        # 判断响应结果\n        if not isinstance(response, HtmlResponse):\n            self.logger.info(\"non-HTML response is skipped: %s\", response.url)\n            return\n        # 根目录选择器\n        root_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == \"_root\"]\n        # 结果集\n        result = {}\n        # 翻页url\n        link = ''\n        # 遍历根目录选择器\n        for root_selector in root_selectors:\n            # text类型选择器\n            if root_selector[\"type\"] == \"SelectorText\":\n                text = self.text_resolve(root_selector, response)\n                # 非多元素\n                if text and not root_selector[\"multiple\"]:\n                    text = [text[0]]\n                # 正则过滤\n                if 'regex' in root_selector and root_selector[\"regex\"]:\n                    text = [re.findall(root_selector[\"regex\"], i)[0] if re.findall(root_selector[\"regex\"], i) else \"\" for i in text]\n                result[root_selector['id']] = text\n            # image类型选择器\n            elif root_selector[\"type\"] == \"SelectorImage\":\n                image = self.image_resolve(root_selector, response)\n                # 非多元素\n                if image and not root_selector[\"multiple\"]:\n                    image = [image[0]]\n                result[root_selector['id']] = image\n            # attribute类型选择器\n            elif root_selector[\"type\"] == \"SelectorElementAttribute\":\n                attribute = self.attribute_resolve(root_selector, response)\n                # 非多元素\n                if attribute and not root_selector[\"multiple\"]:\n                    attribute = [attribute[0]]\n                # 正则过滤\n                if 'regex' in root_selector and root_selector[\"regex\"]:\n                    attribute = [re.findall(root_selector[\"regex\"], i)[0] if re.findall(root_selector[\"regex\"], i) else \"\" for i in attribute]\n                result[root_selector['id']] = attribute\n            # html类型选择器\n            elif root_selector[\"type\"] == \"SelectorHTML\":\n                html = self.html_resolve(root_selector, response)\n                # 非多元素\n                if html and not root_selector[\"multiple\"]:\n                    html = [html[0]]\n                # 正则过滤\n                if 'regex' in root_selector and root_selector[\"regex\"]:\n                    html = [re.findall(root_selector[\"regex\"], i)[0] if re.findall(root_selector[\"regex\"], i) else \"\" for i in html]\n                result[root_selector['id']] = html\n            # link类型选择器\n            elif root_selector[\"type\"] == \"SelectorLink\":\n                if 'first' not in response.meta:\n                    link = self.link_resolve(root_selector, response)\n\n        # element类型选择器\n        element_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == \"_root\" and i[\"type\"]== \"SelectorElement\"]\n        # detail类型选择器\n        detail_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == \"_root\" and i[\"type\"] == \"SelectorDetail\"]\n        if element_selectors:\n            element_multiple = element_selectors[0][\"type\"]\n            for elem in self.element_parse(element_selectors[0], response, element_multiple, result):\n                yield elem\n\n        elif detail_selectors:\n            detail_multiple = detail_selectors[0][\"type\"]\n            detail_urls = self.detail_resolve(detail_selectors[0], response, detail_multiple)\n            child_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == detail_selectors[0][\"id\"]]\n            if not detail_urls or not child_selectors:\n                # 数据集入库\n                result_items = self.data_resolve(result)\n                for result_item in result_items:\n                    self.load_to_db(result_item)\n            else:\n                for elem in self.detail_parse(detail_selectors[0], detail_urls, child_selectors, result, response):\n                    yield elem\n        else:\n            # 数据集入库\n            result_items = self.data_resolve(result)\n            for result_item in result_items:\n                self.load_to_db(result_item)\n\n        # 翻页\n        if link:\n            if isinstance(link, list):\n                for i in range(link[1], link[2]):\n                    if self.method.lower() == 'post':\n                        request = FormRequest(url=link[0] % str(i), formdata=self.form, cookies=self.cookie, meta={'first': False}, dont_filter=True)\n                    else:\n                        request = Request(url=link[0] % str(i), cookies=self.cookie, meta={'first': False}, dont_filter=True)\n                    yield request\n            if isinstance(link, str):\n                if self.method.lower() == 'post':\n                    request = FormRequest(url=link, formdata=self.form, cookies=self.cookie, callback=self.parse, dont_filter=True)\n                else:\n                    request = Request(url=link, cookies=self.cookie, callback=self.parse, dont_filter=True)\n                yield request\n\n\n    def element_parse(self, selectorElement, response, multiple, result, serialize=False):\n        \"\"\"元素选择器解析\"\"\"\n        # 子选择器\n        child_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == selectorElement[\"id\"]]\n        new_result = {}\n        # 编辑根目录选择器\n        for child_selector in child_selectors:\n            # text类型选择器\n            if child_selector[\"type\"] == \"SelectorText\":\n                text = self.text_resolve(child_selector, response)\n                # 非多元素\n                if text and not multiple:\n                    text = [text[0]]\n                # 正则过滤\n                if child_selector[\"regex\"]:\n                    text = [re.findall(child_selector[\"regex\"], i)[0] if re.findall(child_selector[\"regex\"], i) else \"\" for i in text]\n                new_result[child_selector['id']] = text\n            # image类型选择器\n            elif child_selector[\"type\"] == \"SelectorImage\":\n                image = self.image_resolve(child_selector, response)\n                # 非多元素\n                if image and not multiple:\n                    image = [image[0]]\n                new_result[child_selector['id']] = image\n            # attribute类型选择器\n            elif child_selector[\"type\"] == \"SelectorElementAttribute\":\n                attribute = self.attribute_resolve(child_selector, response)\n                # 非多元素\n                if attribute and not multiple:\n                    attribute = [attribute[0]]\n                # 正则过滤\n                if child_selector[\"regex\"]:\n                    attribute = [re.findall(child_selector[\"regex\"], i)[0] if re.findall(child_selector[\"regex\"], i) else \"\" for i in attribute]\n                new_result[child_selector['id']] = attribute\n            # html类型选择器\n            elif child_selector[\"type\"] == \"SelectorHTML\":\n                html = self.html_resolve(child_selector, response)\n                # 非多元素\n                if html and not multiple:\n                    html = [html[0]]\n                # 正则过滤\n                if child_selector[\"regex\"]:\n                    html = [re.findall(child_selector[\"regex\"], i)[0] if re.findall(child_selector[\"regex\"], i) else \"\" for i in html]\n                new_result[child_selector['id']] = html\n\n        detail_item = []\n        if not serialize:\n            result.update(new_result)\n        else:\n            result_mid = self.data_resolve(new_result)\n            detail_item = [i.update(j) for i in result_mid for j in result]\n\n        # element类型选择器\n        element_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == selectorElement[\"id\"] and i[\"type\"]== \"SelectorElement\"]\n        # detail类型选择器\n        detail_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == selectorElement[\"id\"] and i[\"type\"] == \"SelectorDetail\"]\n        if element_selectors:\n            element_multiple = element_selectors[0][\"type\"]\n            for elem in self.element_parse(element_selectors[0], response, element_multiple, result, serialize):\n                yield elem\n        elif detail_selectors:\n            detail_urls = self.detail_resolve(detail_selectors[0], response, multiple)\n            # 子选择器\n            child_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == detail_selectors[0][\"id\"]]\n            if not detail_urls or not child_selectors:\n                # 数据集入库\n                if not serialize:\n                    result_items = self.data_resolve(result)\n                    for result_item in result_items:\n                        self.load_to_db(result_item)\n                else:\n                    for result_item in detail_item:\n                        self.load_to_db(result_item)\n            else:\n                for elem in self.detail_parse(detail_selectors[0], detail_urls, child_selectors, result, response, serialize):\n                    yield elem\n        else:\n            # 数据集入库\n            if not serialize:\n                result_items = self.data_resolve(result)\n                for result_item in result_items:\n                    self.load_to_db(result_item)\n            else:\n                for result_item in detail_item:\n                    self.load_to_db(result_item)\n\n    def detail_parse(self, selectorsDetail, detailUrls, childSelectors, result, response, serialize=False):\n        \"\"\"详情页处理\"\"\"\n        if not serialize:\n            # 数据序列化\n            result_item = self.data_resolve(result)\n            length_data = min(len(result_item), len(detailUrls))\n            for i in range(length_data):\n                yield Request(url=detailUrls[i], cookies=self.cookie, callback=self.detail_first,\n                              meta={'result_item': result_item[i], 'childSelectors': childSelectors, 'selectorsDetail': selectorsDetail},\n                              dont_filter=True)\n        else:\n            for i in detailUrls:\n                yield Request(url=i, cookies=self.cookie, callback=self.detail_first,\n                              meta={'result_item': result, 'childSelectors': childSelectors, 'selectorsDetail': selectorsDetail},\n                              dont_filter=True)\n\n    def get_detail(self, response):\n        \"\"\"解析详情页\"\"\"\n        # 异步日志\n        yield self.get_page_item(response)\n        # 结果集\n        result_item = response.meta['result_item']\n        # 选择器\n        selectorsDetail = response.meta['selectorsDetail']\n        # 子选择器\n        childSelectors = response.meta['childSelectors']\n        # 判断响应结果\n        if not isinstance(response, HtmlResponse):\n            self.logger.info(\"non-HTML response is skipped: %s\", response.url)\n            return\n        result = {}\n        # 遍历子选择器\n        for child_selector in childSelectors:\n            # text类型选择器\n            if child_selector[\"type\"] == \"SelectorText\":\n                text = self.text_resolve(child_selector, response)\n                # 非多元素\n                if text and not child_selector[\"multiple\"]:\n                    text = [text[0]]\n                # 正则过滤\n                if child_selector[\"regex\"]:\n                    text = [re.findall(child_selector[\"regex\"], i)[0] if re.findall(child_selector[\"regex\"], i) else \"\" for i in text]\n                result[child_selector['id']] = text\n            # image类型选择器\n            elif child_selector[\"type\"] == \"SelectorImage\":\n                image = self.image_resolve(child_selector, response)\n                # 非多元素\n                if image and not child_selector[\"multiple\"]:\n                    image = [image[0]]\n                result[child_selector['id']] = image\n            # attribute类型选择器\n            elif child_selector[\"type\"] == \"SelectorElementAttribute\":\n                attribute = self.attribute_resolve(child_selector, response)\n                # 非多元素\n                if attribute and not child_selector[\"multiple\"]:\n                    attribute = [attribute[0]]\n                # 正则过滤\n                if child_selector[\"regex\"]:\n                    attribute = [re.findall(child_selector[\"regex\"], i)[0] if re.findall(child_selector[\"regex\"], i) else \"\" for i in attribute]\n                result[child_selector['id']] = attribute\n            # html类型选择器\n            elif child_selector[\"type\"] == \"SelectorHTML\":\n                html = self.html_resolve(child_selector, response)\n                # 非多元素\n                if html and not child_selector[\"multiple\"]:\n                    html = [html[0]]\n                # 正则过滤\n                if child_selector[\"regex\"]:\n                    html = [re.findall(child_selector[\"regex\"], i)[0] if re.findall(child_selector[\"regex\"], i) else \"\" for i in html]\n                result[child_selector['id']] = html\n        # 序列化\n        result_mid = self.data_resolve(result)\n        detail_item = []\n        if isinstance(result_item, list):\n            detail_item = [dict(i, **j) for i in result_item for j in result_mid]\n        elif isinstance(result_item, dict):\n            detail_item = [dict(result_item, **i) for i in result_mid]\n\n        # element类型选择器\n        element_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == selectorsDetail[\"id\"] and i[\"type\"]== \"SelectorElement\"]\n        # detail类型选择器\n        detail_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == selectorsDetail[\"id\"] and i[\"type\"] == \"SelectorDetail\"]\n        if element_selectors:\n            element_multiple = element_selectors[0][\"type\"]\n            for elem in self.element_parse(element_selectors[0], response, element_multiple, detail_item, serialize=True):\n                yield elem\n        elif detail_selectors:\n            detail_multiple = detail_selectors[0][\"type\"]\n            detail_urls = self.detail_resolve(detail_selectors[0], response, detail_multiple)\n            # 子选择器\n            child_selectors = [i for i in self.selectors if i[\"parentSelectors\"][0] == detail_selectors[0][\"id\"]]\n            if not detail_urls or not child_selectors:\n                # 数据集入库\n                for result_item in detail_item:\n                    self.load_to_db(result_item)\n            else:\n                for elem in self.detail_parse(detail_selectors[0], detail_urls, child_selectors, detail_item, response, serialize=True):\n                    yield elem\n        else:\n            # 数据集入库\n            for result_item in detail_item:\n                self.load_to_db(result_item)\n\n    def detail_resolve(self, selectorDetail, response, detail_multiple):\n        \"\"\"获取详情页url\"\"\"\n        pages = response.css(selectorDetail[\"selector\"] + \"::attr(href)\").extract()\n        # 空值\n        if not pages:\n            return []\n        result = []\n        if not detail_multiple:\n            pages = [pages[0]]\n        for page in pages:\n            page = page.strip()\n            _, rest = urllib.parse.splittype(page)\n            host, _ = urllib.parse.splithost(rest)\n            if re.findall('^(?!http|javascript|//)/?\\w.*?$', page, re.S | re.I) or page.startswith(\n                    \".\"):\n                if not host:\n                    if page.startswith(\"..\"):\n                        page_url = page[2:]\n                    elif page.startswith(\".\"):\n                        page_url = page[1:]\n                    elif not page.startswith(\"/\"):\n                        page_url = \"/\" + page\n                    else:\n                        page_url = page\n                    page = self.start_url[:self.start_url.index('//')] + '//' + self.domain + page_url\n            result.append(page)\n        return result\n\n    def getParentsType(self, currentSelector):\n        \"\"\"获取所有父类选择器类型\"\"\"\n        parent_type = []\n        while currentSelector[\"parentSelectors\"][0] != \"_root\":\n            for i in self.selectors:\n                if currentSelector[\"parentSelectors\"][0] == i[\"id\"]:\n                    parent_type.append(i[\"type\"])\n                    currentSelector = i\n                    break\n        return parent_type\n\n    def data_resolve(self, result):\n        \"\"\"数据集行列互换\"\"\"\n        result_items = []\n        name_item = []\n        value_item = []\n        for name, value in result.items():\n            name_item.append(name)\n            value_item.append(value)\n\n        for data in zip_longest(*value_item, fillvalue=''):\n            data_dict = {}\n            for i, j in zip_longest(*[name_item, data], fillvalue=''):\n                data_dict[i] = j\n            result_items.append(data_dict)\n        if not result_items:\n            result_items = [{}]\n        return result_items\n\n    def text_resolve(self, selectorText, response):\n        \"\"\"文本类型解析\"\"\"\n        text = response.css(selectorText[\"selector\"]).extract()\n        text = [re.sub('<.*?>', '', i) for i in text]\n        text = [i.strip() for i in text]\n        return text\n\n    def image_resolve(self, selectorImage, response):\n        \"\"\"图片类型解析\"\"\"\n        images = response.css(selectorImage[\"selector\"] + \"::attr(href)\").extract()\n        new_images = []\n        # 替换完整路径\n        for image in images:\n            image = image.strip()\n            _, rest = urllib.parse.splittype(images)\n            host, _ = urllib.parse.splithost(rest)\n            if re.findall('^(?!http|javascript|//)/?\\w.*?$', image, re.S | re.I) or image.startswith(\n                    \".\"):\n                if not host:\n                    if image.startswith(\"..\"):\n                        new_val = image[2:]\n                    elif image.startswith(\".\"):\n                        new_val = image[1:]\n                    elif not image.startswith(\"/\"):\n                        new_val = \"/\" + image\n                    else:\n                        new_val = image\n                    image = self.start_url[:self.start_url.index('//')] + '//' + self.domain + new_val\n            new_images.append(image)\n        return new_images\n\n    def attribute_resolve(self, selectorElementAttribute, response):\n        \"\"\"element属性类型解析\"\"\"\n        attribute = response.css(selectorElementAttribute[\"selector\"] + \"::attr(%s)\" % selectorElementAttribute[\"extractAttribute\"]).extract()\n        attribute = [i.strip() for i in attribute]\n        return attribute\n\n    def html_resolve(self, selectorHTML, response):\n        \"\"\"html类型解析\"\"\"\n        html = response.css(selectorHTML[\"selector\"]).extract()\n        html = [i.strip() for i in html]\n        return html\n\n    def link_resolve(self, selectorLink, response):\n        \"\"\"翻页类型解析\"\"\"\n        if selectorLink['pageUrl'] and isinstance(selectorLink['startNum'], int) and isinstance(selectorLink['endNum'], int):\n            return [selectorLink['pageUrl'], int(selectorLink['startNum']), int(selectorLink['endNum'])]\n        link = response.css(selectorLink[\"selector\"] + \"::attr(href)\").extract()\n        if not link:\n            return \"\"\n        link = link[0].strip()\n        _, rest = urllib.parse.splittype(link)\n        host, _ = urllib.parse.splithost(rest)\n        if re.findall('^(?!http|javascript|//)/?\\w.*?$', link, re.S | re.I) or link.startswith(\n                \".\"):\n            if not host:\n                if link.startswith(\"..\"):\n                    new_val = link[2:]\n                elif link.startswith(\".\"):\n                    new_val = link[1:]\n                elif not link.startswith(\"/\"):\n                    new_val = \"/\" + link\n                else:\n                    new_val = link\n                link = self.start_url[:self.start_url.index('//')] + '//' + self.domain + new_val\n        return link\n\n    def load_to_db(self, data):\n        \"\"\"存入数据库\"\"\"\n        if not data:\n            return\n        load_fields = [i for i in data.keys()]\n        fields = [i['id'] for i in self.selectors if i['type'] in ['SelectorText', 'SelectorElementAttribute', 'SelectorHTML', 'SelectorImage']]\n        if not set(load_fields).difference(set(fields)):\n            # 获取数据库对象\n            db = self.mongo.get_db()\n            collection_name = self.task_name\n            collection = db[collection_name]\n            result = self.mongo.exe_insert(collection, data)\n            if not result['state']:\n                logging.debug(\"load to db failed\" + str(data))\n"
  },
  {
    "path": "server/spider/stats.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nfrom server.spider.signals import Signal\n\nstats_changed = Signal(\"stats_changed\", False)\n\n"
  },
  {
    "path": "server/static/build/common.js",
    "content": "webpackJsonp([0],[function(e,t,n){\"use strict\";var s=n(1),i=(s.FancyWebSocket,n(3)),o=n(454);$(window).ready(function(){i.install(\"monitor\"),o.installHeader(\"process-stats\")})},,,function(e,t,n){\"use strict\";function s(e){i.render(i.createElement(u,null),document.getElementById(e))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.install=s;var i=n(4),o=n(160),r=n(180),c=r.Label,a=n(260),l=i.createClass({displayName:\"ConnectionMonitorWidget\",STATE_CLASSES:{offline:\"danger\",online:\"info\",crawling:\"success\"},render:function(){var e=this.STATE_CLASSES[this.props.status]||\"default\";return i.createElement(c,{bsStyle:e,title:\"reconnect\",style:{cursor:\"pointer\"},onClick:this.onClick},this.props.status)},onClick:function(){a.Actions.reconnect()}}),u=i.createClass({displayName:\"ConnectionMonitor\",mixins:[o.connect(a.store,\"status\")],render:function(){return i.createElement(l,{status:this.state.status})}})}]);"
  },
  {
    "path": "server/static/build/main.js",
    "content": "webpackJsonp([1],{0:function(e,t,r){\"use strict\";var n=r(4),a=r(463),o=a.Route,s=a.RouteHandler,l=(a.Link,a.DefaultRoute),c=a.NotFoundRoute,i=r(505),u=i.IndexPage,d=r(509),m=d.JobPage,p=n.createClass({displayName:\"NotFound\",render:function(){return n.createElement(\"div\",null,n.createElement(\"h2\",null,\"404 找不到网页\"),n.createElement(\"p\",null,\"您试图访问的页面不存在.\"))}}),h=n.createClass({displayName:\"App\",render:function(){return n.createElement(s,null)}}),E=n.createElement(o,{path:\"/\",handler:h},n.createElement(l,{handler:u,name:\"index\"}),n.createElement(o,{path:\"job/:id\",handler:m,name:\"job\"}),n.createElement(c,{handler:p}));a.run(E,a.HashLocation,function(e){n.render(n.createElement(e,null),document.getElementById(\"root\"))})},505:function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(4),a=r(180),o=a.Panel,s=r(506),l=s.JobList,c=r(508),i=c.AggregateJobStats,u=r(454),d=u.ProcessStatsTable,m=n.createClass({displayName:\"IndexPage\",render:function(){return n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"col-lg-7 col-md-7\"},n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"任务\",bsStyle:\"primary\"},n.createElement(l,null)),n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"系统状态\",className:\"hidden-lg\"},n.createElement(d,null))),n.createElement(\"div\",{className:\"col-lg-5 col-md-5\"},n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"系统状态\",className:\"visible-lg-block\"},n.createElement(d,null)),n.createElement(o,{collapsible:!0,defaultExpanded:!0,header:\"爬虫状态\"},n.createElement(i,null))))}});t.IndexPage=m},506:function(e,t,r){\"use strict\";function n(e){for(var t=0;t<w.length;t++){var r=c(w[t],2),n=r[0],a=r[1];if(n.test(e))return a}return e}function a(e){var e=n(e);return\"crawling\"==e?{pause:!0,stop:!0}:\"suspended\"==e?{resume:!0,stop:!0}:{}}function o(e){var t=e.stats.item_scraped_count||0,r=Math.round(60*e.itemsSpeed);return t+\" @ \"+r+\"/min\"}function s(e,t){var r=e.stats||{},a=n(e.status),o=r[\"downloader/response_bytes\"]||0,s=e.id;e.job_id&&(s=s+\": \"+e.job_id.slice(-5));var l=0;if(r.start_time){var c=P(r.start_time);if(r.finish_time)var i=P(r.finish_time);else var i=t||new Date;l=i.getTime()-c.getTime()}var u=l/1e3,d=l?o/u:0,m=l?(r.item_scraped_count||0)/u:0;return{id:e.job_id||e.id,status:a,rowClass:N[a]||\"\",stats:r,downloaded:o,downloadSpeed:d,itemsSpeed:m,todo:(r[\"scheduler/enqueued\"]||0)-(r[\"scheduler/dequeued\"]||0),shortId:s,duration:l}}Object.defineProperty(t,\"__esModule\",{value:!0});var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},c=function(){function e(e,t){var r=[],n=!0,a=!1,o=void 0;try{for(var s,l=e[Symbol.iterator]();!(n=(s=l.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){a=!0,o=e}finally{try{!n&&l.return&&l.return()}finally{if(a)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}();t.buttonsForStatus=a;var i=r(4),u=r(160),d=r(455),m=r(456),p=r(463),h=(p.Link,p.Navigation),E=r(180),b=E.Table,f=E.Glyphicon,y=(E.Button,r(451)),v=r(507),_=v.JobsMixin,g=r(461);r(261);var N={crawling:\"success\",stopping:\"info\",suspended:\"warning\",done:\"\"},w=[[/closespider/,\"closed\"]],k=i.createClass({displayName:\"NoJobs\",render:function(){return i.createElement(\"div\",null,i.createElement(\"p\",null,\"没有任务运行.\"),i.createElement(\"p\",null,'请通过\"新增任务\"或\"读取配置\"开始采集.'))}}),j=i.createClass({displayName:\"GlyphA\",render:function(){var e=this.props.button?\" \"+this.props.title:\"\";return i.createElement(\"a\",l({href:\"#\"},this.props),i.createElement(f,{glyph:this.props.glyph}),e)}}),C=i.createClass({displayName:\"JobStopButton\",render:function(){return i.createElement(j,{title:\"Stop\",glyph:\"stop\",onClick:this.onClick,button:this.props.button,className:this.props.className})},onClick:function(e){e.preventDefault();var t=this.props.job.id;confirm(\"Stop job #\"+t+\"?\")&&y.Actions.stopCrawl(t)}});t.JobStopButton=C;var J=i.createClass({displayName:\"JobPauseButton\",render:function(){return i.createElement(j,{title:\"Pause\",glyph:\"pause\",onClick:this.onClick,button:this.props.button,className:this.props.className})},onClick:function(e){e.preventDefault(),y.Actions.pauseCrawl(this.props.job.id)}});t.JobPauseButton=J;var S=i.createClass({displayName:\"JobResumeButton\",render:function(){return i.createElement(j,{title:\"Resume\",glyph:\"play\",onClick:this.onClick,button:this.props.button,className:this.props.className})},onClick:function(e){e.preventDefault(),y.Actions.resumeCrawl(this.props.job.id)}});t.JobResumeButton=S;var T=i.createClass({displayName:\"JobControlIcons\",render:function(){var e=this.props.job,t=a(e.status),r={job:e},n=[];return t.pause&&n.push(i.createElement(\"span\",{key:\"pause\"},i.createElement(J,r),\"  \")),t.resume&&n.push(i.createElement(\"span\",{key:\"resume\"},i.createElement(S,r),\"  \")),t.stop&&n.push(i.createElement(C,l({key:\"stop\"},r))),i.createElement(\"span\",null,n)}});t.JobControlIcons=T;var x=i.createClass({displayName:\"JobControlButtons\",render:function(){var e=this.props.job,t=a(e.status),r={button:!0,job:e},n=[];return t.pause&&n.push(i.createElement(\"span\",{key:\"pause\"},i.createElement(J,l({className:\"btn\"},r)),\"  \")),t.resume&&n.push(i.createElement(\"span\",{key:\"resume\"},i.createElement(S,l({className:\"btn\"},r)),\"  \")),t.stop&&n.push(i.createElement(C,l({key:\"stop\",className:\"btn\"},r))),i.createElement(\"span\",null,n)}});t.JobControlButtons=x;var P=function(e){var e=e.replace(\" \",\"T\");return new Date(e+\"Z\")},A=i.createClass({displayName:\"JobRow\",mixins:[h],render:function(){var e=this,t=this.props.job,r=s(t,this.props.serverTime),n={cursor:\"pointer\"},a=function(){e.transitionTo(\"job\",{id:t.id})},l=[i.createElement(\"td\",{key:\"col-buttons\"},i.createElement(T,{job:t})),i.createElement(\"th\",{key:\"col-id\",scope:\"row\",style:n,onClick:a},r.shortId)],c=[t.seed,r.status,o(r),d(r.downloaded),m(r.duration)];return l=l.concat(c.map(function(e,t){return i.createElement(\"td\",{style:n,onClick:a,key:t},e)})),i.createElement(\"tr\",{className:r.rowClass},l)}}),R=i.createClass({displayName:\"JobRowVerbose\",mixins:[h],render:function(){var e=this.props.job,t=s(e,this.props.serverTime),r=[i.createElement(\"th\",{key:\"col-id\",scope:\"row\"},t.id)],n=[e.seed,t.stats.start_time,t.status,o(t),t.todo,d(t.downloaded),d(t.downloadSpeed,{round:1})+\"/s\",m(t.duration)];return r=r.concat(n.map(function(e,t){return i.createElement(\"td\",{key:t},e)})),i.createElement(\"tr\",{className:t.rowClass},r)}}),q=i.createClass({displayName:\"JobListWidget\",mixins:[u.connect(g.store,\"stats\")],render:function(){var e=this.state.stats,t=this.props.jobs.map(function(t){return i.createElement(A,{job:t,key:t.id,serverTime:e.serverTime})});return i.createElement(b,{fill:!0,hover:this.props.link},i.createElement(\"thead\",null,i.createElement(\"tr\",null,i.createElement(\"th\",{key:\"col-buttons\"}),i.createElement(\"th\",{key:\"col-id\"},\"ID\"),i.createElement(\"th\",{key:\"col-seed\"},\"主域名\"),i.createElement(\"th\",{key:\"col-status\"},\"状态\"),i.createElement(\"th\",{key:\"col-items\"},\"速率\"),i.createElement(\"th\",{key:\"col-data\",className:\"col-md-2\"},\"数据量\"),i.createElement(\"th\",{key:\"col-runtime\",className:\"col-md-2\"},\"用时\"))),i.createElement(\"tbody\",null,t))}});t.JobListWidget=q;var I=i.createClass({displayName:\"JobListWidgetVerbose\",mixins:[u.connect(g.store,\"stats\")],render:function(){var e=this.state.stats,t=this.props.jobs.map(function(t){return i.createElement(R,{job:t,key:t.id,serverTime:e.serverTime})});return i.createElement(b,{fill:!0},i.createElement(\"thead\",null,i.createElement(\"tr\",null,i.createElement(\"th\",{key:\"col-id\"},\"ID\"),i.createElement(\"th\",{key:\"col-seed\"},\"主域名\"),i.createElement(\"th\",{key:\"col-started\"},\"开始时间\"),i.createElement(\"th\",{key:\"col-status\"},\"状态\"),i.createElement(\"th\",{key:\"col-items\"},\"速率\"),i.createElement(\"th\",{key:\"col-queue\"},\"待请求\"),i.createElement(\"th\",{key:\"col-data\",className:\"col-md-1\"},\"数据量\"),i.createElement(\"th\",{key:\"col-speed\",className:\"col-md-1\"},\"↓ 网速\"),i.createElement(\"th\",{key:\"col-runtime\"},\"用时\"))),i.createElement(\"tbody\",null,t))}});t.JobListWidgetVerbose=I;var O=i.createClass({displayName:\"JobList\",mixins:[_],render:function(){var e=this.state.jobs;return e.length?i.createElement(q,{jobs:e}):i.createElement(k,null)}});t.JobList=O},507:function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=(r(4),r(160)),a=r(451),o=n.connect(a.store,\"jobs\");t.JobsMixin=o},508:function(e,t,r){\"use strict\";function n(e){return Object.keys(e).map(function(t){var r=e[t];if(0==r)return\"\";/_bytes$|memusage/.test(t)&&(r=o(r));var n=E[t]||t;return a.createElement(\"tr\",{key:t},a.createElement(\"td\",null,n),a.createElement(\"td\",null,r))}).filter(function(e){return\"\"!=e})}Object.defineProperty(t,\"__esModule\",{value:!0});var a=r(4),o=(r(160),r(455)),s=r(180),l=(s.Table,r(462)),c=l.KeyValueTable,i=(r(451),r(507)),u=i.JobsMixin,d=function(e){return Array.from(new Array(e),function(e,t){return t})},m=[200,201,202,203,204,205,206,207,226,300,301,302,303,304,305,306,307,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,422,423,424,425,426,428,429,431,434,449,451,456,499,500,501,502,503,504,505,506,507,508,509,510,511].map(function(e){return\"downloader/response_status_count/\"+e}),p=d(20).map(function(e){return\"request_depth_count/\"+e}),h=[\"downloader/request_bytes\",\"downloader/request_count\",\"downloader/request_method_count/GET\",\"downloader/request_method_count/POST\",\"downloader/request_method_count/PUT\",\"downloader/request_method_count/HEAD\",\"downloader/request_method_count/DELETE\",\"downloader/request_method_count/TRACE\",\"downloader/request_method_count/CONNECT\",\"downloader/request_method_count/OPTIONS\",\"downloader/response_bytes\",\"downloader/response_count\"].concat(m).concat([\"downloader/exception_count\",\"downloader/exception_type_count/twisted.internet.error.DNSLookupError\",\"downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError\",\"dupefilter/filtered\",\"item_scraped_count\",\"log_count/DEBUG\",\"log_count/INFO\",\"log_count/WARNING\",\"log_count/ERROR\",\"response_received_count\",\"scheduler/dequeued\",\"scheduler/dequeued/memory\",\"scheduler/enqueued\",\"scheduler/enqueued/memory\"]).concat(p).concat([\"spider_exceptions/AttributeError\",\"spider_exceptions/ValueError\",\"spider_exceptions/TypeError\"]).concat([\"motor/items_stored_count\",\"motor/store_error_count\",\"motor/store_error_count/AutoReconnect\"]),E={\"downloader/exception_type_count/twisted.internet.error.DNSLookupError\":\"downloader/DNS errors\",\"downloader/exception_type_count/twisted.internet.error.ConnectionRefusedError\":\"downloader/Connection Refused\"},b=a.createClass({displayName:\"AggregateJobStats\",mixins:[u],render:function(){var e=this.getAggregateStats(this.state.jobs),t=n(e);return 0==t.length?a.createElement(\"p\",null,\"This panel displays various crawl stats. Nothing to show yet.\"):a.createElement(c,{noheader:this.props.fill},t)},getAggregateStats:function(e){var t={};return h.forEach(function(e){t[e]=0}),e.forEach(function(e){h.forEach(function(r){t[r]+=e.stats[r]||0})}),t}});t.AggregateJobStats=b;var f=a.createClass({displayName:\"JobStats\",render:function(){var e=this.props.job.stats,t={};Object.keys(e).sort().forEach(function(r){t[r]=e[r]});var r=n(t);return 0==r.length?a.createElement(\"p\",null,\"Nothing to show yet.\"):a.createElement(c,{noheader:this.props.fill},r)}});t.JobStats=f},509:function(e,t,r){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n=r(4),a=r(160),o=r(463),s=o.Link,l=r(180),c=l.Panel,i=l.Table,u=(l.Button,l.Glyphicon),d=(l.ButtonToolbar,r(451)),m=r(454),p=(m.ProcessStatsTable,r(508)),h=p.JobStats,E=r(506),b=E.JobListWidgetVerbose,f=E.JobControlButtons,y=r(510),v=y.ShortTermQueueWidget,_=n.createClass({displayName:\"ShortJobInfo\",render:function(){var e=this.props.job,t=[e];return n.createElement(b,{jobs:t})}}),g=(n.createClass({displayName:\"JobInfo\",render:function(){var e=this.props.job,t=[[\"Target\",e.seed],[\"Status\",e.status],[\"Job ID\",e.id],[\"Started at\",e.stats.start_time]];e.stats.finish_time&&t.push([\"Finished at\",e.stats.finish_time]);var r=t.map(function(e){return n.createElement(\"tr\",{key:e[0]},n.createElement(\"td\",null,e[0]),n.createElement(\"td\",null,e[1]))});return n.createElement(\"div\",null,n.createElement(i,null,n.createElement(\"caption\",null,\"General Job Information\"),n.createElement(\"tbody\",null,r)))}}),n.createClass({displayName:\"NoJobPage\",render:function(){return n.createElement(\"div\",null,n.createElement(\"h2\",null,\"Job is not found\"),n.createElement(\"p\",null,\"This job is either not available or never existed.\"),n.createElement(s,{to:\"index\"},n.createElement(u,{glyph:\"menu-left\"}),\"  Back to Full Job List\"))}})),N=n.createClass({displayName:\"JobPage\",mixins:[a.connectFilter(d.store,\"job\",function(e){var t=this;return e.filter(function(e){return e.id==t.props.params.id})[0]})],render:function(){var e=this.state.job;return e?n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"col-lg-12\"},n.createElement(s,{to:\"index\",className:\"btn\"},n.createElement(u,{glyph:\"menu-left\"}),\" 全部任务\"),\"  \",n.createElement(f,{job:e}),n.createElement(\"br\",null),n.createElement(\"br\",null),n.createElement(_,{job:e}))),n.createElement(\"div\",{className:\"row\"},n.createElement(\"div\",{className:\"col-lg-5\"},n.createElement(c,{collapsible:!0,defaultExpanded:!0,header:\"爬虫统计\"},n.createElement(h,{job:e}))),n.createElement(\"div\",{className:\"col-lg-7\"},n.createElement(c,{collapsible:!0,defaultExpanded:!0,header:\"请求队列\"},n.createElement(v,{job:e}))))):n.createElement(g,null)}});t.JobPage=N},510:function(e,t,r){\"use strict\";function n(e,t){var r=new Date,n={};return e.forEach(function(e){n[e]=r}),Object.keys(t).filter(function(e){return n[e]}).forEach(function(e){n[e]=t[e]}),n}function a(e,t){var r=e.slice();return r.sort(function(e,r){return t[e.url]-t[r.url]}),r}Object.defineProperty(t,\"__esModule\",{value:!0});var o=r(511),s=(r(160),r(455),r(456)),l=r(180),c=l.Table,i=(r(451),r(507)),u=(i.JobsMixin,o.createClass({displayName:\"ShortTermQueueWidget\",propTypes:{job:o.PropTypes.object.isRequired},getInitialState:function(){return{seenAt:{}}},componentWillReceiveProps:function(e){var t=e.job.downloads.active.map(function(e){return e.url});this.setState({seenAt:n(t,this.state.seenAt)})},render:function(){var e=this,t=this.props.job.downloads,r=a(t.active,this.state.seenAt);if(!r.length)return!1;var n=function(t){var r=a(t.active,e.state.seenAt),n={};t.transferring.forEach(function(e){return n[e.url]=!0});var l=r.map(function(e){var t=n[e.url]?\"success\":\"default\";return o.createElement(\"tr\",{key:e.url,className:t},o.createElement(\"td\",null,e.url))}),i=s(1e3*(t.delay||0));return o.createElement(c,{key:t.key},o.createElement(\"caption\",null,t.key,\"  \",o.createElement(\"span\",{className:\"pull-right\"},\"download delay: \",i)),o.createElement(\"tbody\",null,l))},l=t.slots.map(function(e){return n(e)});return o.createElement(\"div\",null,l)}}));t.ShortTermQueueWidget=u}});"
  },
  {
    "path": "server/static/build/vendor.js",
    "content": "!function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(i,a){for(var s,u,l=0,c=[];l<i.length;l++)u=i[l],o[u]&&c.push.apply(c,o[u]),o[u]=0;for(s in a)Object.prototype.hasOwnProperty.call(a,s)&&(e[s]=a[s]);for(n&&n(i,a);c.length;)c.shift().call(null,t);if(a[0])return r[0]=0,t(0)};var r={},o={2:0};return t.e=function(e,n){if(0===o[e])return n.call(null,t);if(void 0!==o[e])o[e].push(n);else{o[e]=[n];var r=document.getElementsByTagName(\"head\")[0],i=document.createElement(\"script\");i.type=\"text/javascript\",i.charset=\"utf-8\",i.async=!0,i.src=t.p+\"\"+e+\".\"+({0:\"common\",1:\"main\"}[e]||e)+\".js\",r.appendChild(i)}},t.m=e,t.c=r,t.p=\"\",t(0)}([function(e,t,n){n(4),n(511),n(180),n(463),n(160),e.exports=n(2)},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(t,\"__esModule\",{value:!0});var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(2),a={},s=function(){function e(t){r(this,e),this._ee=new i,this._connect(t)}return o(e,[{key:\"_connect\",value:function(e){var t=this;this._conn=new WebSocket(e),this._conn.onmessage=function(e){var n=JSON.parse(e.data);t._ee.emit(n.event,n.data)},this._conn.onopen=function(){t._ee.emit(\"open\",null)},this._conn.onclose=function(e){t._ee.emit(\"close\",e)},this._conn.onerror=function(e){t._ee.emit(\"error\",e)},this._url=e}},{key:\"reconnect\",value:function(){this._conn.close(),this._connect(this._url)}},{key:\"on\",value:function(e,t){this._ee.on(e,t)}},{key:\"off\",value:function(e,t){this._ee.off(e,t)}},{key:\"once\",value:function(e,t){this._ee.once(e,t)}},{key:\"send\",value:function(e,t){var n=JSON.stringify({event:e,data:t});this._conn.send(n)}}],[{key:\"forEndpoint\",value:function(t){if(a[t])return a[t];var n=document.location,r=\"ws://\"+n.hostname+\":\"+n.port+t,o=new e(r);return a[t]=o,o}},{key:\"instance\",value:function(){return e.forEndpoint(window.WS_SERVER_ADDRESS)}}]),e}();t.FancyWebSocket=s},function(e,t,n){\"use strict\";function r(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(){}var i=Object.prototype.hasOwnProperty,a=\"function\"!=typeof Object.create&&\"~\";o.prototype._events=void 0,o.prototype.eventNames=function(){var e,t=this._events,n=[];if(!t)return n;for(e in t)i.call(t,e)&&n.push(a?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(e,t){var n=a?a+e:e,r=this._events&&this._events[n];if(t)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,s=new Array(i);o<i;o++)s[o]=r[o].fn;return s},o.prototype.emit=function(e,t,n,r,o,i){var s=a?a+e:e;if(!this._events||!this._events[s])return!1;var u,l,c=this._events[s],p=arguments.length;if(\"function\"==typeof c.fn){switch(c.once&&this.removeListener(e,c.fn,void 0,!0),p){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,t),!0;case 3:return c.fn.call(c.context,t,n),!0;case 4:return c.fn.call(c.context,t,n,r),!0;case 5:return c.fn.call(c.context,t,n,r,o),!0;case 6:return c.fn.call(c.context,t,n,r,o,i),!0}for(l=1,u=new Array(p-1);l<p;l++)u[l-1]=arguments[l];c.fn.apply(c.context,u)}else{var f,d=c.length;for(l=0;l<d;l++)switch(c[l].once&&this.removeListener(e,c[l].fn,void 0,!0),p){case 1:c[l].fn.call(c[l].context);break;case 2:c[l].fn.call(c[l].context,t);break;case 3:c[l].fn.call(c[l].context,t,n);break;default:if(!u)for(f=1,u=new Array(p-1);f<p;f++)u[f-1]=arguments[f];c[l].fn.apply(c[l].context,u)}}return!0},o.prototype.on=function(e,t,n){var o=new r(t,n||this),i=a?a+e:e;return this._events||(this._events=a?{}:Object.create(null)),this._events[i]?this._events[i].fn?this._events[i]=[this._events[i],o]:this._events[i].push(o):this._events[i]=o,this},o.prototype.once=function(e,t,n){var o=new r(t,n||this,!0),i=a?a+e:e;return this._events||(this._events=a?{}:Object.create(null)),this._events[i]?this._events[i].fn?this._events[i]=[this._events[i],o]:this._events[i].push(o):this._events[i]=o,this},o.prototype.removeListener=function(e,t,n,r){var o=a?a+e:e;if(!this._events||!this._events[o])return this;var i=this._events[o],s=[];if(t)if(i.fn)(i.fn!==t||r&&!i.once||n&&i.context!==n)&&s.push(i);else for(var u=0,l=i.length;u<l;u++)(i[u].fn!==t||r&&!i[u].once||n&&i[u].context!==n)&&s.push(i[u]);return s.length?this._events[o]=1===s.length?s[0]:s:delete this._events[o],this},o.prototype.removeAllListeners=function(e){return this._events?(e?delete this._events[a?a+e:e]:this._events=a?{}:Object.create(null),this):this},o.prototype.off=o.prototype.removeListener,o.prototype.addListener=o.prototype.on,o.prototype.setMaxListeners=function(){return this},o.prefixed=a,e.exports=o},,function(e,t,n){e.exports=n(5)},function(e,t,n){(function(t){\"use strict\";var r=n(7),o=n(11),i=n(25),a=n(40),s=n(15),u=n(20),l=n(14),c=n(35),p=n(43),f=n(45),d=n(94),h=n(22),v=n(70),m=n(31),y=n(125),g=n(32),b=n(157),E=n(16),_=n(114),O=n(159);d.inject();var N=l.createElement,w=l.createFactory,C=l.cloneElement;\"production\"!==t.env.NODE_ENV&&(N=c.createElement,w=c.createFactory,C=c.cloneElement);var P=m.measure(\"React\",\"render\",v.render),x={Children:{map:o.map,forEach:o.forEach,count:o.count,only:O},Component:i,DOM:p,PropTypes:y,initializeTouchEvents:function(e){r.useTouchEvents=e},createClass:a.createClass,createElement:N,cloneElement:C,createFactory:w,createMixin:function(e){return e},constructAndRenderComponent:v.constructAndRenderComponent,constructAndRenderComponentByID:v.constructAndRenderComponentByID,findDOMNode:_,render:P,renderToString:b.renderToString,renderToStaticMarkup:b.renderToStaticMarkup,unmountComponentAtNode:v.unmountComponentAtNode,isValidElement:l.isValidElement,withContext:s.withContext,__spread:E};if(\"undefined\"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&\"function\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({CurrentOwner:u,InstanceHandles:h,Mount:v,Reconciler:g,TextComponent:f}),\"production\"!==t.env.NODE_ENV){var T=n(54);if(T.canUseDOM&&window.top===window.self){navigator.userAgent.indexOf(\"Chrome\")>-1&&\"undefined\"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&console.debug(\"Download the React DevTools for a better development experience: https://fb.me/react-devtools\");for(var D=[Array.isArray,Array.prototype.every,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.map,Date.now,Function.prototype.bind,Object.keys,String.prototype.split,String.prototype.trim,Object.create,Object.freeze],M=0;M<D.length;M++)if(!D[M]){console.error(\"One or more ES5 shim/shams expected by React are not available: https://fb.me/react-warning-polyfills\");break}}}x.version=\"0.13.3\",e.exports=x}).call(t,n(6))},function(e,t){function n(){throw new Error(\"setTimeout has not been defined\")}function r(){throw new Error(\"clearTimeout has not been defined\")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){v&&d&&(v=!1,d.length?h=d.concat(h):m=-1,h.length&&s())}function s(){if(!v){var e=o(a);v=!0;for(var t=h.length;t;){for(d=h,h=[];++m<t;)d&&d[m].run();m=-1,t=h.length}d=null,v=!1,i(e)}}function u(e,t){this.fun=e,this.array=t}function l(){}var c,p,f=e.exports={};!function(){try{c=\"function\"==typeof setTimeout?setTimeout:n}catch(e){c=n}try{p=\"function\"==typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var d,h=[],v=!1,m=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];h.push(new u(e,t)),1!==h.length||v||o(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\"browser\",f.browser=!0,f.env={},f.argv=[],f.version=\"\",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(e){return[]},f.binding=function(e){throw new Error(\"process.binding is not supported\")},f.cwd=function(){return\"/\"},f.chdir=function(e){throw new Error(\"process.chdir is not supported\")},f.umask=function(){return 0}},function(e,t,n){(function(t){\"use strict\";function r(e){return e===y.topMouseUp||e===y.topTouchEnd||e===y.topTouchCancel}function o(e){return e===y.topMouseMove||e===y.topTouchMove}function i(e){return e===y.topMouseDown||e===y.topTouchStart}function a(e,n){var r=e._dispatchListeners,o=e._dispatchIDs;if(\"production\"!==t.env.NODE_ENV&&d(e),Array.isArray(r))for(var i=0;i<r.length&&!e.isPropagationStopped();i++)n(e,r[i],o[i]);else r&&n(e,r,o)}function s(e,t,n){e.currentTarget=m.Mount.getNode(n);var r=t(e,n);return e.currentTarget=null,r}function u(e,t){a(e,t),e._dispatchListeners=null,e._dispatchIDs=null}function l(e){var n=e._dispatchListeners,r=e._dispatchIDs;if(\"production\"!==t.env.NODE_ENV&&d(e),Array.isArray(n)){for(var o=0;o<n.length&&!e.isPropagationStopped();o++)if(n[o](e,r[o]))return r[o]}else if(n&&n(e,r))return r;return null}function c(e){var t=l(e);return e._dispatchIDs=null,e._dispatchListeners=null,t}function p(e){\"production\"!==t.env.NODE_ENV&&d(e);var n=e._dispatchListeners,r=e._dispatchIDs;\"production\"!==t.env.NODE_ENV?v(!Array.isArray(n),\"executeDirectDispatch(...): Invalid `event`.\"):v(!Array.isArray(n));var o=n?n(e,r):null;return e._dispatchListeners=null,e._dispatchIDs=null,o}function f(e){return!!e._dispatchListeners}var d,h=n(8),v=n(10),m={Mount:null,injectMount:function(e){m.Mount=e,\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?v(e&&e.getNode,\"EventPluginUtils.injection.injectMount(...): Injected Mount module is missing getNode.\"):v(e&&e.getNode))}},y=h.topLevelTypes;\"production\"!==t.env.NODE_ENV&&(d=function(e){var n=e._dispatchListeners,r=e._dispatchIDs,o=Array.isArray(n),i=Array.isArray(r),a=i?r.length:r?1:0,s=o?n.length:n?1:0;\"production\"!==t.env.NODE_ENV?v(i===o&&a===s,\"EventPluginUtils: Invalid `event`.\"):v(i===o&&a===s)});var g={isEndish:r,isMoveish:o,isStartish:i,executeDirectDispatch:p,executeDispatch:s,executeDispatchesInOrder:u,executeDispatchesInOrderStopAtTrue:c,hasDispatches:f,injection:m,useTouchEvents:!1};e.exports=g}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(9),o=r({bubbled:null,captured:null}),i=r({topBlur:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topError:null,topFocus:null,topInput:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topReset:null,topScroll:null,topSelectionChange:null,topSubmit:null,topTextInput:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topWheel:null}),a={topLevelTypes:i,PropagationPhases:o};e.exports=a},function(e,t,n){(function(t){\"use strict\";var r=n(10),o=function(e){var n,o={};\"production\"!==t.env.NODE_ENV?r(e instanceof Object&&!Array.isArray(e),\"keyMirror(...): Argument must be an object.\"):r(e instanceof Object&&!Array.isArray(e));for(n in e)e.hasOwnProperty(n)&&(o[n]=n);return o};e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var n=function(e,n,r,o,i,a,s,u){if(\"production\"!==t.env.NODE_ENV&&void 0===n)throw new Error(\"invariant requires an error message argument\");if(!e){var l;if(void 0===n)l=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[r,o,i,a,s,u],p=0;l=new Error(\"Invariant Violation: \"+n.replace(/%s/g,function(){return c[p++]}))}throw l.framesToPop=1,l}};e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,t){this.forEachFunction=e,this.forEachContext=t}function o(e,t,n,r){var o=e;o.forEachFunction.call(o.forEachContext,t,r)}function i(e,t,n){if(null==e)return e;var i=r.getPooled(t,n);d(e,o,i),r.release(i)}function a(e,t,n){this.mapResult=e,this.mapFunction=t,this.mapContext=n}function s(e,n,r,o){var i=e,a=i.mapResult,s=!a.hasOwnProperty(r);if(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?h(s,\"ReactChildren.map(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.\",r):null),s){var u=i.mapFunction.call(i.mapContext,n,o);a[r]=u}}function u(e,t,n){if(null==e)return e;var r={},o=a.getPooled(r,t,n);return d(e,s,o),a.release(o),f.create(r)}function l(e,t,n,r){return null}function c(e,t){return d(e,l,null)}var p=n(12),f=n(13),d=n(21),h=n(18),v=p.twoArgumentPooler,m=p.threeArgumentPooler;p.addPoolingTo(r,v),p.addPoolingTo(a,m);var y={forEach:i,map:u,count:c};e.exports=y}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(10),o=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},i=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},a=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},s=function(e,t,n,r,o){var i=this;if(i.instancePool.length){var a=i.instancePool.pop();return i.call(a,e,t,n,r,o),a}return new i(e,t,n,r,o)},u=function(e){var n=this;\"production\"!==t.env.NODE_ENV?r(e instanceof n,\"Trying to release an instance into a pool of a different type.\"):r(e instanceof n),e.destructor&&e.destructor(),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},l=10,c=o,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||c,n.poolSize||(n.poolSize=l),n.release=u,n},f={addPoolingTo:p,oneArgumentPooler:o,twoArgumentPooler:i,threeArgumentPooler:a,fiveArgumentPooler:s};e.exports=f}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(14),o=n(18);if(\"production\"!==t.env.NODE_ENV){var i=\"_reactFragment\",a=\"_reactDidWarn\",s=!1;try{var u=function(){return 1};Object.defineProperty({},i,{enumerable:!1,value:!0}),Object.defineProperty({},\"key\",{enumerable:!0,get:u}),s=!0}catch(e){}var l=function(e,n){Object.defineProperty(e,n,{enumerable:!0,get:function(){return\"production\"!==t.env.NODE_ENV?o(this[a],\"A ReactFragment is an opaque type. Accessing any of its properties is deprecated. Pass it to one of the React.Children helpers.\"):null,this[a]=!0,this[i][n]},set:function(e){\"production\"!==t.env.NODE_ENV?o(this[a],\"A ReactFragment is an immutable opaque type. Mutating its properties is deprecated.\"):null,this[a]=!0,this[i][n]=e}})},c={},p=function(e){var t=\"\";for(var n in e)t+=n+\":\"+typeof e[n]+\",\";var r=!!c[t];return c[t]=!0,r}}var f={create:function(e){if(\"production\"!==t.env.NODE_ENV){if(\"object\"!=typeof e||!e||Array.isArray(e))return\"production\"!==t.env.NODE_ENV?o(!1,\"React.addons.createFragment only accepts a single object.\",e):null,e;if(r.isValidElement(e))return\"production\"!==t.env.NODE_ENV?o(!1,\"React.addons.createFragment does not accept a ReactElement without a wrapper object.\"):null,e;if(s){var n={};Object.defineProperty(n,i,{enumerable:!1,value:e}),Object.defineProperty(n,a,{writable:!0,enumerable:!1,value:!1});for(var u in e)l(n,u);return Object.preventExtensions(n),n}}return e},extract:function(e){return\"production\"!==t.env.NODE_ENV&&s?e[i]?e[i]:(\"production\"!==t.env.NODE_ENV?o(p(e),\"Any use of a keyed object should be wrapped in React.addons.createFragment(object) before being passed as a child.\"):null,e):e},extractIfFragment:function(e){if(\"production\"!==t.env.NODE_ENV&&s){if(e[i])return e[i];for(var n in e)if(e.hasOwnProperty(n)&&r.isValidElement(e[n]))return f.extract(e)}return e}};e.exports=f}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n){Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:function(){return this._store?this._store[n]:null},set:function(e){\"production\"!==t.env.NODE_ENV?u(!1,\"Don't set the %s property of the React element. Instead, specify the correct value when initially creating the element.\",n):null,this._store[n]=e}})}function o(e){try{var t={props:!0};for(var n in t)r(e,n);c=!0}catch(e){}}var i=n(15),a=n(20),s=n(16),u=n(18),l={key:!0,ref:!0},c=!1,p=function(e,n,r,o,i,a){if(this.type=e,this.key=n,this.ref=r,this._owner=o,this._context=i,\"production\"!==t.env.NODE_ENV){this._store={props:a,originalProps:s({},a)};try{Object.defineProperty(this._store,\"validated\",{configurable:!1,enumerable:!1,writable:!0})}catch(e){}if(this._store.validated=!1,c)return void Object.freeze(this)}this.props=a};p.prototype={_isReactElement:!0},\"production\"!==t.env.NODE_ENV&&o(p.prototype),p.createElement=function(e,t,n){var r,o={},s=null,u=null;if(null!=t){u=void 0===t.ref?null:t.ref,s=void 0===t.key?null:\"\"+t.key;for(r in t)t.hasOwnProperty(r)&&!l.hasOwnProperty(r)&&(o[r]=t[r])}var c=arguments.length-2;if(1===c)o.children=n;else if(c>1){for(var f=Array(c),d=0;d<c;d++)f[d]=arguments[d+2];o.children=f}if(e&&e.defaultProps){var h=e.defaultProps;for(r in h)\"undefined\"==typeof o[r]&&(o[r]=h[r])}return new p(e,s,u,a.current,i.current,o)},p.createFactory=function(e){var t=p.createElement.bind(null,e);return t.type=e,t},p.cloneAndReplaceProps=function(e,n){var r=new p(e.type,e.key,e.ref,e._owner,e._context,n);return\"production\"!==t.env.NODE_ENV&&(r._store.validated=e._store.validated),r},p.cloneElement=function(e,t,n){var r,o=s({},e.props),i=e.key,u=e.ref,c=e._owner;if(null!=t){void 0!==t.ref&&(u=t.ref,c=a.current),void 0!==t.key&&(i=\"\"+t.key);for(r in t)t.hasOwnProperty(r)&&!l.hasOwnProperty(r)&&(o[r]=t[r])}var f=arguments.length-2;if(1===f)o.children=n;else if(f>1){for(var d=Array(f),h=0;h<f;h++)d[h]=arguments[h+2];o.children=d}return new p(e.type,i,u,c,e._context,o)},p.isValidElement=function(e){var t=!(!e||!e._isReactElement);return t},e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(16),o=n(17),i=n(18),a=!1,s={current:o,withContext:function(e,n){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?i(a,\"withContext is deprecated and will be removed in a future version. Use a wrapper component with getChildContext instead.\"):null,a=!0);var o,u=s.current;s.current=r({},u,e);try{o=n()}finally{s.current=u}return o}};e.exports=s}).call(t,n(6))},function(e,t){\"use strict\";function n(e,t){if(null==e)throw new TypeError(\"Object.assign target cannot be null or undefined\");for(var n=Object(e),r=Object.prototype.hasOwnProperty,o=1;o<arguments.length;o++){var i=arguments[o];if(null!=i){var a=Object(i);for(var s in a)r.call(a,s)&&(n[s]=a[s])}}return n}e.exports=n},function(e,t,n){(function(t){\"use strict\";var n={};\"production\"!==t.env.NODE_ENV&&Object.freeze(n),e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(19),o=r;\"production\"!==t.env.NODE_ENV&&(o=function(e,t){for(var n=[],r=2,o=arguments.length;r<o;r++)n.push(arguments[r]);if(void 0===t)throw new Error(\"`warning(condition, format, ...args)` requires a warning message argument\");if(t.length<10||/^[s\\W]*$/.test(t))throw new Error(\"The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: \"+t);if(0!==t.indexOf(\"Failed Composite propType: \")&&!e){var i=0,a=\"Warning: \"+t.replace(/%s/g,function(){return n[i++]});console.warn(a);try{throw new Error(a)}catch(e){}}}),e.exports=o}).call(t,n(6))},function(e,t){function n(e){return function(){return e}}function r(){}r.thatReturns=n,r.thatReturnsFalse=n(!1),r.thatReturnsTrue=n(!0),r.thatReturnsNull=n(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t){\"use strict\";var n={current:null};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e){return y[e]}function o(e,t){return e&&null!=e.key?a(e.key):t.toString(36)}function i(e){return(\"\"+e).replace(g,r)}function a(e){return\"$\"+i(e)}function s(e,n,r,i,u){var p=typeof e;if(\"undefined\"!==p&&\"boolean\"!==p||(e=null),null===e||\"string\"===p||\"number\"===p||l.isValidElement(e))return i(u,e,\"\"===n?v+o(e,0):n,r),1;var y,g,E,_=0;if(Array.isArray(e))for(var O=0;O<e.length;O++)y=e[O],g=(\"\"!==n?n+m:v)+o(y,O),E=r+_,_+=s(y,g,E,i,u);else{var N=f(e);if(N){var w,C=N.call(e);if(N!==e.entries)for(var P=0;!(w=C.next()).done;)y=w.value,g=(\"\"!==n?n+m:v)+o(y,P++),E=r+_,_+=s(y,g,E,i,u);else for(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?h(b,\"Using Maps as children is not yet fully supported. It is an experimental feature that might be removed. Convert it to a sequence / iterable of keyed ReactElements instead.\"):null,b=!0);!(w=C.next()).done;){var x=w.value;x&&(y=x[1],g=(\"\"!==n?n+m:v)+a(x[0])+m+o(y,0),E=r+_,_+=s(y,g,E,i,u))}}else if(\"object\"===p){\"production\"!==t.env.NODE_ENV?d(1!==e.nodeType,\"traverseAllChildren(...): Encountered an invalid child; DOM elements are not valid children of React components.\"):d(1!==e.nodeType);var T=c.extract(e);for(var D in T)T.hasOwnProperty(D)&&(y=T[D],g=(\"\"!==n?n+m:v)+a(D)+m+o(y,0),E=r+_,_+=s(y,g,E,i,u))}}return _}function u(e,t,n){return null==e?0:s(e,\"\",0,t,n)}var l=n(14),c=n(13),p=n(22),f=n(24),d=n(10),h=n(18),v=p.SEPARATOR,m=\":\",y={\"=\":\"=0\",\".\":\"=1\",\":\":\"=2\"},g=/[=.:]/g,b=!1;e.exports=u}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return d+e.toString(36)}function o(e,t){return e.charAt(t)===d||t===e.length}function i(e){return\"\"===e||e.charAt(0)===d&&e.charAt(e.length-1)!==d}function a(e,t){return 0===t.indexOf(e)&&o(t,e.length)}function s(e){return e?e.substr(0,e.lastIndexOf(d)):\"\"}function u(e,n){if(\"production\"!==t.env.NODE_ENV?f(i(e)&&i(n),\"getNextDescendantID(%s, %s): Received an invalid React DOM ID.\",e,n):f(i(e)&&i(n)),\"production\"!==t.env.NODE_ENV?f(a(e,n),\"getNextDescendantID(...): React has made an invalid assumption about the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.\",e,n):f(a(e,n)),e===n)return e;var r,s=e.length+h;for(r=s;r<n.length&&!o(n,r);r++);return n.substr(0,r)}function l(e,n){var r=Math.min(e.length,n.length);if(0===r)return\"\";for(var a=0,s=0;s<=r;s++)if(o(e,s)&&o(n,s))a=s;else if(e.charAt(s)!==n.charAt(s))break;var u=e.substr(0,a);return\"production\"!==t.env.NODE_ENV?f(i(u),\"getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s\",e,n,u):f(i(u)),u}function c(e,n,r,o,i,l){e=e||\"\",n=n||\"\",\"production\"!==t.env.NODE_ENV?f(e!==n,\"traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.\",e):f(e!==n);var c=a(n,e);\"production\"!==t.env.NODE_ENV?f(c||a(e,n),\"traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do not have a parent path.\",e,n):f(c||a(e,n));for(var p=0,d=c?s:u,h=e;;h=d(h,n)){var m;if(i&&h===e||l&&h===n||(m=r(h,c,o)),m===!1||h===n)break;\"production\"!==t.env.NODE_ENV?f(p++<v,\"traverseParentPath(%s, %s, ...): Detected an infinite loop while traversing the React DOM ID tree. This may be due to malformed IDs: %s\",e,n):f(p++<v)}}var p=n(23),f=n(10),d=\".\",h=d.length,v=100,m={createReactRootID:function(){return r(p.createReactRootIndex())},createReactID:function(e,t){return e+t},getReactRootIDFromNodeID:function(e){if(e&&e.charAt(0)===d&&e.length>1){var t=e.indexOf(d,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var i=l(e,t);i!==e&&c(e,i,n,r,!1,!0),i!==t&&c(i,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c(\"\",e,t,n,!0,!1),c(e,\"\",t,n,!1,!0))},traverseAncestors:function(e,t,n){c(\"\",e,t,n,!0,!1)},_getFirstCommonAncestorID:l,_getNextDescendantID:u,isAncestorIDOf:a,SEPARATOR:d};e.exports=m}).call(t,n(6))},function(e,t){\"use strict\";var n={injectCreateReactRootIndex:function(e){r.createReactRootIndex=e}},r={createReactRootIndex:null,injection:n};e.exports=r},function(e,t){\"use strict\";function n(e){var t=e&&(r&&e[r]||e[o]);if(\"function\"==typeof t)return t}var r=\"function\"==typeof Symbol&&Symbol.iterator,o=\"@@iterator\";e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e,t){this.props=e,this.context=t}var o=n(26),i=n(10),a=n(18);if(r.prototype.setState=function(e,n){\"production\"!==t.env.NODE_ENV?i(\"object\"==typeof e||\"function\"==typeof e||null==e,\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\"):i(\"object\"==typeof e||\"function\"==typeof e||null==e),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?a(null!=e,\"setState(...): You passed an undefined or null state object; instead, use forceUpdate().\"):null),o.enqueueSetState(this,e),n&&o.enqueueCallback(this,n)},r.prototype.forceUpdate=function(e){o.enqueueForceUpdate(this),e&&o.enqueueCallback(this,e)},\"production\"!==t.env.NODE_ENV){var s={getDOMNode:[\"getDOMNode\",\"Use React.findDOMNode(component) instead.\"],isMounted:[\"isMounted\",\"Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks.\"],replaceProps:[\"replaceProps\",\"Instead, call React.render again at the top level.\"],replaceState:[\"replaceState\",\"Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236).\"],setProps:[\"setProps\",\"Instead, call React.render again at the top level.\"]},u=function(e,n){try{Object.defineProperty(r.prototype,e,{get:function(){\"production\"!==t.env.NODE_ENV?a(!1,\"%s(...) is deprecated in plain JavaScript React classes. %s\",n[0],n[1]):null}})}catch(e){}};for(var l in s)s.hasOwnProperty(l)&&u(l,s[l])}e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){e!==i.currentlyMountingInstance&&l.enqueueUpdate(e)}function o(e,n){\"production\"!==t.env.NODE_ENV?p(null==a.current,\"%s(...): Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state.\",n):p(null==a.current);var r=u.get(e);return r?r===i.currentlyUnmountingInstance?null:r:(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?f(!n,\"%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op.\",n,n):null),null)}var i=n(27),a=n(20),s=n(14),u=n(28),l=n(29),c=n(16),p=n(10),f=n(18),d={enqueueCallback:function(e,n){\"production\"!==t.env.NODE_ENV?p(\"function\"==typeof n,\"enqueueCallback(...): You called `setProps`, `replaceProps`, `setState`, `replaceState`, or `forceUpdate` with a callback that isn't callable.\"):p(\"function\"==typeof n);var a=o(e);return a&&a!==i.currentlyMountingInstance?(a._pendingCallbacks?a._pendingCallbacks.push(n):a._pendingCallbacks=[n],void r(a)):null},enqueueCallbackInternal:function(e,n){\"production\"!==t.env.NODE_ENV?p(\"function\"==typeof n,\"enqueueCallback(...): You called `setProps`, `replaceProps`, `setState`, `replaceState`, or `forceUpdate` with a callback that isn't callable.\"):p(\"function\"==typeof n),e._pendingCallbacks?e._pendingCallbacks.push(n):e._pendingCallbacks=[n],r(e)},enqueueForceUpdate:function(e){var t=o(e,\"forceUpdate\");t&&(t._pendingForceUpdate=!0,r(t))},enqueueReplaceState:function(e,t){var n=o(e,\"replaceState\");n&&(n._pendingStateQueue=[t],n._pendingReplaceState=!0,r(n))},enqueueSetState:function(e,t){var n=o(e,\"setState\");if(n){var i=n._pendingStateQueue||(n._pendingStateQueue=[]);i.push(t),r(n)}},enqueueSetProps:function(e,n){var i=o(e,\"setProps\");if(i){\"production\"!==t.env.NODE_ENV?p(i._isTopLevel,\"setProps(...): You called `setProps` on a component with a parent. This is an anti-pattern since props will get reactively updated when rendered. Instead, change the owner's `render` method to pass the correct value as props to the component where it is created.\"):p(i._isTopLevel);var a=i._pendingElement||i._currentElement,u=c({},a.props,n);i._pendingElement=s.cloneAndReplaceProps(a,u),r(i)}},enqueueReplaceProps:function(e,n){var i=o(e,\"replaceProps\");if(i){\"production\"!==t.env.NODE_ENV?p(i._isTopLevel,\"replaceProps(...): You called `replaceProps` on a component with a parent. This is an anti-pattern since props will get reactively updated when rendered. Instead, change the owner's `render` method to pass the correct value as props to the component where it is created.\"):p(i._isTopLevel);var a=i._pendingElement||i._currentElement;i._pendingElement=s.cloneAndReplaceProps(a,n),r(i)}},enqueueElementInternal:function(e,t){e._pendingElement=t,r(e)}};e.exports=d}).call(t,n(6))},function(e,t){\"use strict\";var n={currentlyMountingInstance:null,currentlyUnmountingInstance:null};e.exports=n},function(e,t){\"use strict\";var n={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(){\"production\"!==t.env.NODE_ENV?y(T.ReactReconcileTransaction&&O,\"ReactUpdates: must inject a reconcile transaction class and batching strategy\"):y(T.ReactReconcileTransaction&&O)}function o(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=c.getPooled(),this.reconcileTransaction=T.ReactReconcileTransaction.getPooled()}function i(e,t,n,o,i){r(),O.batchedUpdates(e,t,n,o,i)}function a(e,t){return e._mountOrder-t._mountOrder}function s(e){var n=e.dirtyComponentsLength;\"production\"!==t.env.NODE_ENV?y(n===b.length,\"Expected flush transaction's stored dirty-components length (%s) to match dirty-components array length (%s).\",n,b.length):y(n===b.length),b.sort(a);for(var r=0;r<n;r++){var o=b[r],i=o._pendingCallbacks;if(o._pendingCallbacks=null,h.performUpdateIfNecessary(o,e.reconcileTransaction),i)for(var s=0;s<i.length;s++)e.callbackQueue.enqueue(i[s],o.getPublicInstance())}}function u(e){return r(),\"production\"!==t.env.NODE_ENV?g(null==f.current,\"enqueueUpdate(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\"):null,O.isBatchingUpdates?void b.push(e):void O.batchedUpdates(u,e)}function l(e,n){\"production\"!==t.env.NODE_ENV?y(O.isBatchingUpdates,\"ReactUpdates.asap: Can't enqueue an asap callback in a context whereupdates are not being batched.\"):y(O.isBatchingUpdates),E.enqueue(e,n),_=!0}var c=n(30),p=n(12),f=n(20),d=n(31),h=n(32),v=n(39),m=n(16),y=n(10),g=n(18),b=[],E=c.getPooled(),_=!1,O=null,N={initialize:function(){this.dirtyComponentsLength=b.length},close:function(){this.dirtyComponentsLength!==b.length?(b.splice(0,this.dirtyComponentsLength),P()):b.length=0}},w={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},C=[N,w];m(o.prototype,v.Mixin,{getTransactionWrappers:function(){return C},destructor:function(){this.dirtyComponentsLength=null,c.release(this.callbackQueue),this.callbackQueue=null,T.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return v.Mixin.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),p.addPoolingTo(o);var P=function(){for(;b.length||_;){if(b.length){var e=o.getPooled();e.perform(s,null,e),o.release(e)}if(_){_=!1;var t=E;E=c.getPooled(),t.notifyAll(),c.release(t)}}};P=d.measure(\"ReactUpdates\",\"flushBatchedUpdates\",P);var x={injectReconcileTransaction:function(e){\"production\"!==t.env.NODE_ENV?y(e,\"ReactUpdates: must provide a reconcile transaction class\"):y(e),T.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){\"production\"!==t.env.NODE_ENV?y(e,\"ReactUpdates: must provide a batching strategy\"):y(e),\n\"production\"!==t.env.NODE_ENV?y(\"function\"==typeof e.batchedUpdates,\"ReactUpdates: must provide a batchedUpdates() function\"):y(\"function\"==typeof e.batchedUpdates),\"production\"!==t.env.NODE_ENV?y(\"boolean\"==typeof e.isBatchingUpdates,\"ReactUpdates: must provide an isBatchingUpdates boolean attribute\"):y(\"boolean\"==typeof e.isBatchingUpdates),O=e}},T={ReactReconcileTransaction:null,batchedUpdates:i,enqueueUpdate:u,flushBatchedUpdates:P,injection:x,asap:l};e.exports=T}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){this._callbacks=null,this._contexts=null}var o=n(12),i=n(16),a=n(10);i(r.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var e=this._callbacks,n=this._contexts;if(e){\"production\"!==t.env.NODE_ENV?a(e.length===n.length,\"Mismatched list of contexts in callback queue\"):a(e.length===n.length),this._callbacks=null,this._contexts=null;for(var r=0,o=e.length;r<o;r++)e[r].call(n[r]);e.length=0,n.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),o.addPoolingTo(r),e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function n(e,t,n){return n}var r={enableMeasure:!1,storedMeasure:n,measureMethods:function(e,n,o){if(\"production\"!==t.env.NODE_ENV)for(var i in o)o.hasOwnProperty(i)&&(e[i]=r.measure(n,o[i],e[i]))},measure:function(e,n,o){if(\"production\"!==t.env.NODE_ENV){var i=null,a=function(){return r.enableMeasure?(i||(i=r.storedMeasure(e,n,o)),i.apply(this,arguments)):o.apply(this,arguments)};return a.displayName=e+\"_\"+n,a}return o},injection:{injectMeasure:function(e){r.storedMeasure=e}}};e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){o.attachRefs(this,this._currentElement)}var o=n(33),i=n(35),a={mountComponent:function(e,n,o,a){var s=e.mountComponent(n,o,a);return\"production\"!==t.env.NODE_ENV&&i.checkAndWarnForMutatedProps(e._currentElement),o.getReactMountReady().enqueue(r,e),s},unmountComponent:function(e){o.detachRefs(e,e._currentElement),e.unmountComponent()},receiveComponent:function(e,n,a,s){var u=e._currentElement;if(n!==u||null==n._owner){\"production\"!==t.env.NODE_ENV&&i.checkAndWarnForMutatedProps(n);var l=o.shouldUpdateRefs(u,n);l&&o.detachRefs(e,u),e.receiveComponent(n,a,s),l&&a.getReactMountReady().enqueue(r,e)}},performUpdateIfNecessary:function(e,t){e.performUpdateIfNecessary(t)}};e.exports=a}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t,n){\"function\"==typeof e?e(t.getPublicInstance()):i.addComponentAsRefTo(t,e,n)}function o(e,t,n){\"function\"==typeof e?e(null):i.removeComponentAsRefFrom(t,e,n)}var i=n(34),a={};a.attachRefs=function(e,t){var n=t.ref;null!=n&&r(n,e,t._owner)},a.shouldUpdateRefs=function(e,t){return t._owner!==e._owner||t.ref!==e.ref},a.detachRefs=function(e,t){var n=t.ref;null!=n&&o(n,e,t._owner)},e.exports=a},function(e,t,n){(function(t){\"use strict\";var r=n(10),o={isValidOwner:function(e){return!(!e||\"function\"!=typeof e.attachRef||\"function\"!=typeof e.detachRef)},addComponentAsRefTo:function(e,n,i){\"production\"!==t.env.NODE_ENV?r(o.isValidOwner(i),\"addComponentAsRefTo(...): Only a ReactOwner can have refs. This usually means that you're trying to add a ref to a component that doesn't have an owner (that is, was not created inside of another component's `render` method). Try rendering this component inside of a new top-level component which will hold the ref.\"):r(o.isValidOwner(i)),i.attachRef(n,e)},removeComponentAsRefFrom:function(e,n,i){\"production\"!==t.env.NODE_ENV?r(o.isValidOwner(i),\"removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This usually means that you're trying to remove a ref to a component that doesn't have an owner (that is, was not created inside of another component's `render` method). Try rendering this component inside of a new top-level component which will hold the ref.\"):r(o.isValidOwner(i)),i.getPublicInstance().refs[n]===e.getPublicInstance()&&i.detachRef(n)}};e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){if(b.current){var e=b.current.getName();if(e)return\" Check the render method of `\"+e+\"`.\"}return\"\"}function o(e){var t=e&&e.getPublicInstance();if(t){var n=t.constructor;if(n)return n.displayName||n.name||void 0}}function i(){var e=b.current;return e&&o(e)||void 0}function a(e,t){e._store.validated||null!=e.key||(e._store.validated=!0,u('Each child in an array or iterator should have a unique \"key\" prop.',e,t))}function s(e,t,n){P.test(e)&&u(\"Child objects should have non-numeric keys so ordering is preserved.\",t,n)}function u(e,n,r){var a=i(),s=\"string\"==typeof r?r:r.displayName||r.name,u=a||s,l=w[e]||(w[e]={});if(!l.hasOwnProperty(u)){l[u]=!0;var c=a?\" Check the render method of \"+a+\".\":s?\" Check the React.render call using <\"+s+\">.\":\"\",p=\"\";if(n&&n._owner&&n._owner!==b.current){var f=o(n._owner);p=\" It was passed a child from \"+f+\".\"}\"production\"!==t.env.NODE_ENV?N(!1,e+\"%s%s See https://fb.me/react-warning-keys for more information.\",c,p):null}}function l(e,t){if(Array.isArray(e))for(var n=0;n<e.length;n++){var r=e[n];v.isValidElement(r)&&a(r,t)}else if(v.isValidElement(e))e._store.validated=!0;else if(e){var o=_(e);if(o){if(o!==e.entries)for(var i,u=o.call(e);!(i=u.next()).done;)v.isValidElement(i.value)&&a(i.value,t)}else if(\"object\"==typeof e){var l=m.extractIfFragment(e);for(var c in l)l.hasOwnProperty(c)&&s(c,l[c],t)}}}function c(e,n,o,i){for(var a in n)if(n.hasOwnProperty(a)){var s;try{\"production\"!==t.env.NODE_ENV?O(\"function\"==typeof n[a],\"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.\",e||\"React class\",g[i],a):O(\"function\"==typeof n[a]),s=n[a](o,a,e,i)}catch(e){s=e}if(s instanceof Error&&!(s.message in C)){C[s.message]=!0;var u=r(this);\"production\"!==t.env.NODE_ENV?N(!1,\"Failed propType: %s%s\",s.message,u):null}}}function p(e,n){var r=n.type,o=\"string\"==typeof r?r:r.displayName,i=n._owner?n._owner.getPublicInstance().constructor.displayName:null,a=e+\"|\"+o+\"|\"+i;if(!x.hasOwnProperty(a)){x[a]=!0;var s=\"\";o&&(s=\" <\"+o+\" />\");var u=\"\";i&&(u=\" The element was created by \"+i+\".\"),\"production\"!==t.env.NODE_ENV?N(!1,\"Don't set .props.%s of the React component%s. Instead, specify the correct value when initially creating the element or use React.cloneElement to make a new element with updated props.%s\",e,s,u):null}}function f(e,t){return e!==e?t!==t:0===e&&0===t?1/e===1/t:e===t}function d(e){if(e._store){var t=e._store.originalProps,n=e.props;for(var r in n)n.hasOwnProperty(r)&&(t.hasOwnProperty(r)&&f(t[r],n[r])||(p(r,e),t[r]=n[r]))}}function h(e){if(null!=e.type){var n=E.getComponentClassForElement(e),r=n.displayName||n.name;n.propTypes&&c(r,n.propTypes,e.props,y.prop),\"function\"==typeof n.getDefaultProps&&(\"production\"!==t.env.NODE_ENV?N(n.getDefaultProps.isReactClassApproved,\"getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.\"):null)}}var v=n(14),m=n(13),y=n(36),g=n(37),b=n(20),E=n(38),_=n(24),O=n(10),N=n(18),w={},C={},P=/^\\d+$/,x={},T={checkAndWarnForMutatedProps:d,createElement:function(e,n,r){\"production\"!==t.env.NODE_ENV?N(null!=e,\"React.createElement: type should not be null or undefined. It should be a string (for DOM elements) or a ReactClass (for composite components).\"):null;var o=v.createElement.apply(this,arguments);if(null==o)return o;for(var i=2;i<arguments.length;i++)l(arguments[i],e);return h(o),o},createFactory:function(e){var n=T.createElement.bind(null,e);if(n.type=e,\"production\"!==t.env.NODE_ENV)try{Object.defineProperty(n,\"type\",{enumerable:!1,get:function(){return\"production\"!==t.env.NODE_ENV?N(!1,\"Factory.type is deprecated. Access the class directly before passing it to createFactory.\"):null,Object.defineProperty(this,\"type\",{value:e}),e}})}catch(e){}return n},cloneElement:function(e,t,n){for(var r=v.cloneElement.apply(this,arguments),o=2;o<arguments.length;o++)l(arguments[o],r.type);return h(r),r}};e.exports=T}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(9),o=r({prop:null,context:null,childContext:null});e.exports=o},function(e,t,n){(function(t){\"use strict\";var n={};\"production\"!==t.env.NODE_ENV&&(n={prop:\"prop\",context:\"context\",childContext:\"child context\"}),e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){if(\"function\"==typeof e.type)return e.type;var t=e.type,n=p[t];return null==n&&(p[t]=n=l(t)),n}function o(e){return\"production\"!==t.env.NODE_ENV?u(c,\"There is no registered component for the tag %s\",e.type):u(c),new c(e.type,e.props)}function i(e){return new f(e)}function a(e){return e instanceof f}var s=n(16),u=n(10),l=null,c=null,p={},f=null,d={injectGenericComponentClass:function(e){c=e},injectTextComponentClass:function(e){f=e},injectComponentClasses:function(e){s(p,e)},injectAutoWrapper:function(e){l=e}},h={getComponentClassForElement:r,createInternalComponent:o,createInstanceForText:i,isTextComponent:a,injection:d};e.exports=h}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(10),o={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,n,o,i,a,s,u,l){\"production\"!==t.env.NODE_ENV?r(!this.isInTransaction(),\"Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction.\"):r(!this.isInTransaction());var c,p;try{this._isInTransaction=!0,c=!0,this.initializeAll(0),p=e.call(n,o,i,a,s,u,l),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return p},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=i.OBSERVED_ERROR,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===i.OBSERVED_ERROR)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){\"production\"!==t.env.NODE_ENV?r(this.isInTransaction(),\"Transaction.closeAll(): Cannot close transaction when none are open.\"):r(this.isInTransaction());for(var n=this.transactionWrappers,o=e;o<n.length;o++){var a,s=n[o],u=this.wrapperInitData[o];try{a=!0,u!==i.OBSERVED_ERROR&&s.close&&s.close.call(this,u),a=!1}finally{if(a)try{this.closeAll(o+1)}catch(e){}}}this.wrapperInitData.length=0}},i={Mixin:o,OBSERVED_ERROR:{}};e.exports=i}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n,r){for(var o in n)n.hasOwnProperty(o)&&(\"production\"!==t.env.NODE_ENV?C(\"function\"==typeof n[o],\"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.\",e.displayName||\"ReactClass\",b[r],o):null)}function o(e,n){var r=D.hasOwnProperty(n)?D[n]:null;k.hasOwnProperty(n)&&(\"production\"!==t.env.NODE_ENV?O(r===x.OVERRIDE_BASE,\"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.\",n):O(r===x.OVERRIDE_BASE)),e.hasOwnProperty(n)&&(\"production\"!==t.env.NODE_ENV?O(r===x.DEFINE_MANY||r===x.DEFINE_MANY_MERGED,\"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",n):O(r===x.DEFINE_MANY||r===x.DEFINE_MANY_MERGED))}function i(e,n){if(n){\"production\"!==t.env.NODE_ENV?O(\"function\"!=typeof n,\"ReactClass: You're attempting to use a component class as a mixin. Instead, just use a regular object.\"):O(\"function\"!=typeof n),\"production\"!==t.env.NODE_ENV?O(!h.isValidElement(n),\"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.\"):O(!h.isValidElement(n));var r=e.prototype;n.hasOwnProperty(P)&&M.mixins(e,n.mixins);for(var i in n)if(n.hasOwnProperty(i)&&i!==P){var a=n[i];if(o(r,i),M.hasOwnProperty(i))M[i](e,a);else{var s=D.hasOwnProperty(i),c=r.hasOwnProperty(i),p=a&&a.__reactDontBind,f=\"function\"==typeof a,d=f&&!s&&!c&&!p;if(d)r.__reactAutoBindMap||(r.__reactAutoBindMap={}),r.__reactAutoBindMap[i]=a,r[i]=a;else if(c){var v=D[i];\"production\"!==t.env.NODE_ENV?O(s&&(v===x.DEFINE_MANY_MERGED||v===x.DEFINE_MANY),\"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.\",v,i):O(s&&(v===x.DEFINE_MANY_MERGED||v===x.DEFINE_MANY)),v===x.DEFINE_MANY_MERGED?r[i]=u(r[i],a):v===x.DEFINE_MANY&&(r[i]=l(r[i],a))}else r[i]=a,\"production\"!==t.env.NODE_ENV&&\"function\"==typeof a&&n.displayName&&(r[i].displayName=n.displayName+\"_\"+i)}}}}function a(e,n){if(n)for(var r in n){var o=n[r];if(n.hasOwnProperty(r)){var i=r in M;\"production\"!==t.env.NODE_ENV?O(!i,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\\'t be on the \"statics\" key. Define it as an instance property instead; it will still be accessible on the constructor.',r):O(!i);var a=r in e;\"production\"!==t.env.NODE_ENV?O(!a,\"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.\",r):O(!a),e[r]=o}}}function s(e,n){\"production\"!==t.env.NODE_ENV?O(e&&n&&\"object\"==typeof e&&\"object\"==typeof n,\"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.\"):O(e&&n&&\"object\"==typeof e&&\"object\"==typeof n);for(var r in n)n.hasOwnProperty(r)&&(\"production\"!==t.env.NODE_ENV?O(void 0===e[r],\"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.\",r):O(void 0===e[r]),e[r]=n[r]);return e}function u(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return s(o,n),s(o,r),o}}function l(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function c(e,n){var r=n.bind(e);if(\"production\"!==t.env.NODE_ENV){r.__reactBoundContext=e,r.__reactBoundMethod=n,r.__reactBoundArguments=null;var o=e.constructor.displayName,i=r.bind;r.bind=function(a){for(var s=[],u=1,l=arguments.length;u<l;u++)s.push(arguments[u]);if(a!==e&&null!==a)\"production\"!==t.env.NODE_ENV?C(!1,\"bind(): React component methods may only be bound to the component instance. See %s\",o):null;else if(!s.length)return\"production\"!==t.env.NODE_ENV?C(!1,\"bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s\",o):null,r;var c=i.apply(r,arguments);return c.__reactBoundContext=e,c.__reactBoundMethod=n,c.__reactBoundArguments=s,c}}return r}function p(e){for(var t in e.__reactAutoBindMap)if(e.__reactAutoBindMap.hasOwnProperty(t)){var n=e.__reactAutoBindMap[t];e[t]=c(e,v.guard(n,e.constructor.displayName+\".\"+t))}}var f=n(25),d=n(20),h=n(14),v=n(41),m=n(28),y=n(27),g=n(36),b=n(37),E=n(26),_=n(16),O=n(10),N=n(9),w=n(42),C=n(18),P=w({mixins:null}),x=N({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),T=[],D={mixins:x.DEFINE_MANY,statics:x.DEFINE_MANY,propTypes:x.DEFINE_MANY,contextTypes:x.DEFINE_MANY,childContextTypes:x.DEFINE_MANY,getDefaultProps:x.DEFINE_MANY_MERGED,getInitialState:x.DEFINE_MANY_MERGED,getChildContext:x.DEFINE_MANY_MERGED,render:x.DEFINE_ONCE,componentWillMount:x.DEFINE_MANY,componentDidMount:x.DEFINE_MANY,componentWillReceiveProps:x.DEFINE_MANY,shouldComponentUpdate:x.DEFINE_ONCE,componentWillUpdate:x.DEFINE_MANY,componentDidUpdate:x.DEFINE_MANY,componentWillUnmount:x.DEFINE_MANY,updateComponent:x.OVERRIDE_BASE},M={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)i(e,t[n])},childContextTypes:function(e,n){\"production\"!==t.env.NODE_ENV&&r(e,n,g.childContext),e.childContextTypes=_({},e.childContextTypes,n)},contextTypes:function(e,n){\"production\"!==t.env.NODE_ENV&&r(e,n,g.context),e.contextTypes=_({},e.contextTypes,n)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=u(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,n){\"production\"!==t.env.NODE_ENV&&r(e,n,g.prop),e.propTypes=_({},e.propTypes,n)},statics:function(e,t){a(e,t)}},S={enumerable:!1,get:function(){var e=this.displayName||this.name||\"Component\";return\"production\"!==t.env.NODE_ENV?C(!1,\"%s.type is deprecated. Use %s directly to access the class.\",e,e):null,Object.defineProperty(this,\"type\",{value:this}),this}},k={replaceState:function(e,t){E.enqueueReplaceState(this,e),t&&E.enqueueCallback(this,t)},isMounted:function(){if(\"production\"!==t.env.NODE_ENV){var e=d.current;null!==e&&(\"production\"!==t.env.NODE_ENV?C(e._warnedAboutRefsInRender,\"%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.\",e.getName()||\"A component\"):null,e._warnedAboutRefsInRender=!0)}var n=m.get(this);return n&&n!==y.currentlyMountingInstance},setProps:function(e,t){E.enqueueSetProps(this,e),t&&E.enqueueCallback(this,t)},replaceProps:function(e,t){E.enqueueReplaceProps(this,e),t&&E.enqueueCallback(this,t)}},I=function(){};_(I.prototype,f.prototype,k);var R={createClass:function(e){var n=function(e,r){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?C(this instanceof n,\"Something is calling a React component directly. Use a factory or JSX instead. See: https://fb.me/react-legacyfactory\"):null),this.__reactAutoBindMap&&p(this),this.props=e,this.context=r,this.state=null;var o=this.getInitialState?this.getInitialState():null;\"production\"!==t.env.NODE_ENV&&\"undefined\"==typeof o&&this.getInitialState._isMockFunction&&(o=null),\"production\"!==t.env.NODE_ENV?O(\"object\"==typeof o&&!Array.isArray(o),\"%s.getInitialState(): must return an object or null\",n.displayName||\"ReactCompositeComponent\"):O(\"object\"==typeof o&&!Array.isArray(o)),this.state=o};n.prototype=new I,n.prototype.constructor=n,T.forEach(i.bind(null,n)),i(n,e),n.getDefaultProps&&(n.defaultProps=n.getDefaultProps()),\"production\"!==t.env.NODE_ENV&&(n.getDefaultProps&&(n.getDefaultProps.isReactClassApproved={}),n.prototype.getInitialState&&(n.prototype.getInitialState.isReactClassApproved={})),\"production\"!==t.env.NODE_ENV?O(n.prototype.render,\"createClass(...): Class specification must implement a `render` method.\"):O(n.prototype.render),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?C(!n.prototype.componentShouldUpdate,\"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.\",e.displayName||\"A component\"):null);for(var r in D)n.prototype[r]||(n.prototype[r]=null);if(n.type=n,\"production\"!==t.env.NODE_ENV)try{Object.defineProperty(n,\"type\",S)}catch(e){}return n},injection:{injectMixin:function(e){T.push(e)}}};e.exports=R}).call(t,n(6))},function(e,t){\"use strict\";var n={guard:function(e,t){return e}};e.exports=n},function(e,t){var n=function(e){var t;for(t in e)if(e.hasOwnProperty(t))return t;return null};e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e){return\"production\"!==t.env.NODE_ENV?i.createFactory(e):o.createFactory(e)}var o=n(14),i=n(35),a=n(44),s=a({a:\"a\",abbr:\"abbr\",address:\"address\",area:\"area\",article:\"article\",aside:\"aside\",audio:\"audio\",b:\"b\",base:\"base\",bdi:\"bdi\",bdo:\"bdo\",big:\"big\",blockquote:\"blockquote\",body:\"body\",br:\"br\",button:\"button\",canvas:\"canvas\",caption:\"caption\",cite:\"cite\",code:\"code\",col:\"col\",colgroup:\"colgroup\",data:\"data\",datalist:\"datalist\",dd:\"dd\",del:\"del\",details:\"details\",dfn:\"dfn\",dialog:\"dialog\",div:\"div\",dl:\"dl\",dt:\"dt\",em:\"em\",embed:\"embed\",fieldset:\"fieldset\",figcaption:\"figcaption\",figure:\"figure\",footer:\"footer\",form:\"form\",h1:\"h1\",h2:\"h2\",h3:\"h3\",h4:\"h4\",h5:\"h5\",h6:\"h6\",head:\"head\",header:\"header\",hr:\"hr\",html:\"html\",i:\"i\",iframe:\"iframe\",img:\"img\",input:\"input\",ins:\"ins\",kbd:\"kbd\",keygen:\"keygen\",label:\"label\",legend:\"legend\",li:\"li\",link:\"link\",main:\"main\",map:\"map\",mark:\"mark\",menu:\"menu\",menuitem:\"menuitem\",meta:\"meta\",meter:\"meter\",nav:\"nav\",noscript:\"noscript\",object:\"object\",ol:\"ol\",optgroup:\"optgroup\",option:\"option\",output:\"output\",p:\"p\",param:\"param\",picture:\"picture\",pre:\"pre\",progress:\"progress\",q:\"q\",rp:\"rp\",rt:\"rt\",ruby:\"ruby\",s:\"s\",samp:\"samp\",script:\"script\",section:\"section\",select:\"select\",small:\"small\",source:\"source\",span:\"span\",strong:\"strong\",style:\"style\",sub:\"sub\",summary:\"summary\",sup:\"sup\",table:\"table\",tbody:\"tbody\",td:\"td\",textarea:\"textarea\",tfoot:\"tfoot\",th:\"th\",thead:\"thead\",time:\"time\",title:\"title\",tr:\"tr\",track:\"track\",u:\"u\",ul:\"ul\",var:\"var\",video:\"video\",wbr:\"wbr\",circle:\"circle\",clipPath:\"clipPath\",defs:\"defs\",ellipse:\"ellipse\",g:\"g\",line:\"line\",linearGradient:\"linearGradient\",mask:\"mask\",path:\"path\",pattern:\"pattern\",polygon:\"polygon\",polyline:\"polyline\",radialGradient:\"radialGradient\",rect:\"rect\",stop:\"stop\",svg:\"svg\",text:\"text\",tspan:\"tspan\"},r);e.exports=s}).call(t,n(6))},function(e,t){\"use strict\";function n(e,t,n){if(!e)return null;var o={};for(var i in e)r.call(e,i)&&(o[i]=t.call(n,e[i],i,e));return o}var r=Object.prototype.hasOwnProperty;e.exports=n},function(e,t,n){\"use strict\";var r=n(46),o=n(50),i=n(90),a=n(16),s=n(49),u=function(e){};a(u.prototype,{construct:function(e){this._currentElement=e,this._stringText=\"\"+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t,n){this._rootNodeID=e;var o=s(this._stringText);return t.renderToStaticMarkup?o:\"<span \"+r.createMarkupForID(e)+\">\"+o+\"</span>\"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=\"\"+e;n!==this._stringText&&(this._stringText=n,i.BackendIDOperations.updateTextContentByID(this._rootNodeID,n))}},unmountComponent:function(){o.unmountIDFromEnvironment(this._rootNodeID)}}),e.exports=u},function(e,t,n){(function(t){\"use strict\";function r(e,t){return null==t||o.hasBooleanValue[e]&&!t||o.hasNumericValue[e]&&isNaN(t)||o.hasPositiveNumericValue[e]&&t<1||o.hasOverloadedBooleanValue[e]&&t===!1}var o=n(47),i=n(48),a=n(18);if(\"production\"!==t.env.NODE_ENV)var s={children:!0,dangerouslySetInnerHTML:!0,key:!0,ref:!0},u={},l=function(e){if(!(s.hasOwnProperty(e)&&s[e]||u.hasOwnProperty(e)&&u[e])){u[e]=!0;var n=e.toLowerCase(),r=o.isCustomAttribute(n)?n:o.getPossibleStandardName.hasOwnProperty(n)?o.getPossibleStandardName[n]:null;\"production\"!==t.env.NODE_ENV?a(null==r,\"Unknown DOM property %s. Did you mean %s?\",e,r):null}};var c={createMarkupForID:function(e){return o.ID_ATTRIBUTE_NAME+\"=\"+i(e)},createMarkupForProperty:function(e,n){if(o.isStandardName.hasOwnProperty(e)&&o.isStandardName[e]){if(r(e,n))return\"\";var a=o.getAttributeName[e];return o.hasBooleanValue[e]||o.hasOverloadedBooleanValue[e]&&n===!0?a:a+\"=\"+i(n)}return o.isCustomAttribute(e)?null==n?\"\":e+\"=\"+i(n):(\"production\"!==t.env.NODE_ENV&&l(e),null)},setValueForProperty:function(e,n,i){if(o.isStandardName.hasOwnProperty(n)&&o.isStandardName[n]){var a=o.getMutationMethod[n];if(a)a(e,i);else if(r(n,i))this.deleteValueForProperty(e,n);else if(o.mustUseAttribute[n])e.setAttribute(o.getAttributeName[n],\"\"+i);else{var s=o.getPropertyName[n];o.hasSideEffects[n]&&\"\"+e[s]==\"\"+i||(e[s]=i)}}else o.isCustomAttribute(n)?null==i?e.removeAttribute(n):e.setAttribute(n,\"\"+i):\"production\"!==t.env.NODE_ENV&&l(n)},deleteValueForProperty:function(e,n){if(o.isStandardName.hasOwnProperty(n)&&o.isStandardName[n]){var r=o.getMutationMethod[n];if(r)r(e,void 0);else if(o.mustUseAttribute[n])e.removeAttribute(o.getAttributeName[n]);else{var i=o.getPropertyName[n],a=o.getDefaultValueForProperty(e.nodeName,i);o.hasSideEffects[n]&&\"\"+e[i]===a||(e[i]=a)}}else o.isCustomAttribute(n)?e.removeAttribute(n):\"production\"!==t.env.NODE_ENV&&l(n)}};e.exports=c}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,t){return(e&t)===t}var o=n(10),i={MUST_USE_ATTRIBUTE:1,MUST_USE_PROPERTY:2,HAS_SIDE_EFFECTS:4,HAS_BOOLEAN_VALUE:8,HAS_NUMERIC_VALUE:16,HAS_POSITIVE_NUMERIC_VALUE:48,HAS_OVERLOADED_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var n=e.Properties||{},a=e.DOMAttributeNames||{},u=e.DOMPropertyNames||{},l=e.DOMMutationMethods||{};e.isCustomAttribute&&s._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var c in n){\"production\"!==t.env.NODE_ENV?o(!s.isStandardName.hasOwnProperty(c),\"injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.\",c):o(!s.isStandardName.hasOwnProperty(c)),s.isStandardName[c]=!0;var p=c.toLowerCase();if(s.getPossibleStandardName[p]=c,a.hasOwnProperty(c)){var f=a[c];s.getPossibleStandardName[f]=c,s.getAttributeName[c]=f}else s.getAttributeName[c]=p;s.getPropertyName[c]=u.hasOwnProperty(c)?u[c]:c,l.hasOwnProperty(c)?s.getMutationMethod[c]=l[c]:s.getMutationMethod[c]=null;var d=n[c];s.mustUseAttribute[c]=r(d,i.MUST_USE_ATTRIBUTE),s.mustUseProperty[c]=r(d,i.MUST_USE_PROPERTY),s.hasSideEffects[c]=r(d,i.HAS_SIDE_EFFECTS),s.hasBooleanValue[c]=r(d,i.HAS_BOOLEAN_VALUE),s.hasNumericValue[c]=r(d,i.HAS_NUMERIC_VALUE),s.hasPositiveNumericValue[c]=r(d,i.HAS_POSITIVE_NUMERIC_VALUE),s.hasOverloadedBooleanValue[c]=r(d,i.HAS_OVERLOADED_BOOLEAN_VALUE),\"production\"!==t.env.NODE_ENV?o(!s.mustUseAttribute[c]||!s.mustUseProperty[c],\"DOMProperty: Cannot require using both attribute and property: %s\",c):o(!s.mustUseAttribute[c]||!s.mustUseProperty[c]),\"production\"!==t.env.NODE_ENV?o(s.mustUseProperty[c]||!s.hasSideEffects[c],\"DOMProperty: Properties that have side effects must use property: %s\",c):o(s.mustUseProperty[c]||!s.hasSideEffects[c]),\"production\"!==t.env.NODE_ENV?o(!!s.hasBooleanValue[c]+!!s.hasNumericValue[c]+!!s.hasOverloadedBooleanValue[c]<=1,\"DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s\",c):o(!!s.hasBooleanValue[c]+!!s.hasNumericValue[c]+!!s.hasOverloadedBooleanValue[c]<=1)}}},a={},s={ID_ATTRIBUTE_NAME:\"data-reactid\",isStandardName:{},getPossibleStandardName:{},getAttributeName:{},getPropertyName:{},getMutationMethod:{},mustUseAttribute:{},mustUseProperty:{},hasSideEffects:{},hasBooleanValue:{},hasNumericValue:{},hasPositiveNumericValue:{},hasOverloadedBooleanValue:{},_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<s._isCustomAttributeFunctions.length;t++){var n=s._isCustomAttributeFunctions[t];if(n(e))return!0}return!1},getDefaultValueForProperty:function(e,t){var n,r=a[e];return r||(a[e]=r={}),t in r||(n=document.createElement(e),r[t]=n[t]),r[t]},injection:i};e.exports=s}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return'\"'+o(e)+'\"'}var o=n(49);e.exports=r},function(e,t){\"use strict\";function n(e){return o[e]}function r(e){return(\"\"+e).replace(i,n)}var o={\"&\":\"&amp;\",\">\":\"&gt;\",\"<\":\"&lt;\",'\"':\"&quot;\",\"'\":\"&#x27;\"},i=/[&><\"']/g;e.exports=r},function(e,t,n){\"use strict\";var r=n(51),o=n(70),i={processChildrenUpdates:r.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkupByID:r.dangerouslyReplaceNodeWithMarkupByID,unmountIDFromEnvironment:function(e){o.purgeID(e)}};e.exports=i},function(e,t,n){(function(t){\"use strict\";var r=n(52),o=n(61),i=n(46),a=n(70),s=n(31),u=n(10),l=n(69),c={dangerouslySetInnerHTML:\"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.\",style:\"`style` must be set using `updateStylesByID()`.\"},p={updatePropertyByID:function(e,n,r){var o=a.getNode(e);\"production\"!==t.env.NODE_ENV?u(!c.hasOwnProperty(n),\"updatePropertyByID(...): %s\",c[n]):u(!c.hasOwnProperty(n)),null!=r?i.setValueForProperty(o,n,r):i.deleteValueForProperty(o,n)},deletePropertyByID:function(e,n,r){var o=a.getNode(e);\"production\"!==t.env.NODE_ENV?u(!c.hasOwnProperty(n),\"updatePropertyByID(...): %s\",c[n]):u(!c.hasOwnProperty(n)),i.deleteValueForProperty(o,n,r)},updateStylesByID:function(e,t){var n=a.getNode(e);r.setValueForStyles(n,t)},updateInnerHTMLByID:function(e,t){var n=a.getNode(e);l(n,t)},updateTextContentByID:function(e,t){var n=a.getNode(e);o.updateTextContent(n,t)},dangerouslyReplaceNodeWithMarkupByID:function(e,t){var n=a.getNode(e);o.dangerouslyReplaceNodeWithMarkup(n,t)},dangerouslyProcessChildrenUpdates:function(e,t){for(var n=0;n<e.length;n++)e[n].parentNode=a.getNode(e[n].parentID);o.processUpdates(e,t)}};s.measureMethods(p,\"ReactDOMIDOperations\",{updatePropertyByID:\"updatePropertyByID\",deletePropertyByID:\"deletePropertyByID\",updateStylesByID:\"updateStylesByID\",updateInnerHTMLByID:\"updateInnerHTMLByID\",updateTextContentByID:\"updateTextContentByID\",dangerouslyReplaceNodeWithMarkupByID:\"dangerouslyReplaceNodeWithMarkupByID\",dangerouslyProcessChildrenUpdates:\"dangerouslyProcessChildrenUpdates\"}),e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(53),o=n(54),i=n(55),a=n(57),s=n(58),u=n(60),l=n(18),c=u(function(e){return s(e)}),p=\"cssFloat\";if(o.canUseDOM&&void 0===document.documentElement.style.cssFloat&&(p=\"styleFloat\"),\"production\"!==t.env.NODE_ENV)var f=/^(?:webkit|moz|o)[A-Z]/,d=/;\\s*$/,h={},v={},m=function(e){h.hasOwnProperty(e)&&h[e]||(h[e]=!0,\"production\"!==t.env.NODE_ENV?l(!1,\"Unsupported style property %s. Did you mean %s?\",e,i(e)):null)},y=function(e){h.hasOwnProperty(e)&&h[e]||(h[e]=!0,\"production\"!==t.env.NODE_ENV?l(!1,\"Unsupported vendor-prefixed style property %s. Did you mean %s?\",e,e.charAt(0).toUpperCase()+e.slice(1)):null)},g=function(e,n){v.hasOwnProperty(n)&&v[n]||(v[n]=!0,\"production\"!==t.env.NODE_ENV?l(!1,'Style property values shouldn\\'t contain a semicolon. Try \"%s: %s\" instead.',e,n.replace(d,\"\")):null)},b=function(e,t){e.indexOf(\"-\")>-1?m(e):f.test(e)?y(e):d.test(t)&&g(e,t)};var E={createMarkupForStyles:function(e){var n=\"\";for(var r in e)if(e.hasOwnProperty(r)){var o=e[r];\"production\"!==t.env.NODE_ENV&&b(r,o),null!=o&&(n+=c(r)+\":\",n+=a(r,o)+\";\")}return n||null},setValueForStyles:function(e,n){var o=e.style;for(var i in n)if(n.hasOwnProperty(i)){\"production\"!==t.env.NODE_ENV&&b(i,n[i]);var s=a(i,n[i]);if(\"float\"===i&&(i=p),s)o[i]=s;else{var u=r.shorthandPropertyExpansions[i];if(u)for(var l in u)o[l]=\"\";else o[i]=\"\"}}}};e.exports=E}).call(t,n(6))},function(e,t){\"use strict\";function n(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={boxFlex:!0,boxFlexGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0},o=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(r).forEach(function(e){o.forEach(function(t){r[n(t,e)]=r[e]})});var i={background:{backgroundImage:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundColor:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0}},a={isUnitlessNumber:r,shorthandPropertyExpansions:i};e.exports=a},function(e,t){\"use strict\";var n=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:n,canUseWorkers:\"undefined\"!=typeof Worker,canUseEventListeners:n&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:n&&!!window.screen,isInWorker:!n};e.exports=r},function(e,t,n){\"use strict\";function r(e){return o(e.replace(i,\"ms-\"))}var o=n(56),i=/^-ms-/;e.exports=r},function(e,t){function n(e){return e.replace(r,function(e,t){return t.toUpperCase()})}var r=/-(.)/g;e.exports=n},function(e,t,n){\n\"use strict\";function r(e,t){var n=null==t||\"boolean\"==typeof t||\"\"===t;if(n)return\"\";var r=isNaN(t);return r||0===t||i.hasOwnProperty(e)&&i[e]?\"\"+t:(\"string\"==typeof t&&(t=t.trim()),t+\"px\")}var o=n(53),i=o.isUnitlessNumber;e.exports=r},function(e,t,n){\"use strict\";function r(e){return o(e).replace(i,\"-ms-\")}var o=n(59),i=/^ms-/;e.exports=r},function(e,t){function n(e){return e.replace(r,\"-$1\").toLowerCase()}var r=/([A-Z])/g;e.exports=n},function(e,t){\"use strict\";function n(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e,t,n){e.insertBefore(t,e.childNodes[n]||null)}var o=n(62),i=n(67),a=n(68),s=n(10),u={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:a,processUpdates:function(e,n){for(var u,l=null,c=null,p=0;p<e.length;p++)if(u=e[p],u.type===i.MOVE_EXISTING||u.type===i.REMOVE_NODE){var f=u.fromIndex,d=u.parentNode.childNodes[f],h=u.parentID;\"production\"!==t.env.NODE_ENV?s(d,\"processUpdates(): Unable to find child %s of element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID `%s`.\",f,h):s(d),l=l||{},l[h]=l[h]||[],l[h][f]=d,c=c||[],c.push(d)}var v=o.dangerouslyRenderMarkup(n);if(c)for(var m=0;m<c.length;m++)c[m].parentNode.removeChild(c[m]);for(var y=0;y<e.length;y++)switch(u=e[y],u.type){case i.INSERT_MARKUP:r(u.parentNode,v[u.markupIndex],u.toIndex);break;case i.MOVE_EXISTING:r(u.parentNode,l[u.parentID][u.fromIndex],u.toIndex);break;case i.TEXT_CONTENT:a(u.parentNode,u.textContent);break;case i.REMOVE_NODE:}}};e.exports=u}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return e.substring(1,e.indexOf(\" \"))}var o=n(54),i=n(63),a=n(19),s=n(66),u=n(10),l=/^(<[^ \\/>]+)/,c=\"data-danger-index\",p={dangerouslyRenderMarkup:function(e){\"production\"!==t.env.NODE_ENV?u(o.canUseDOM,\"dangerouslyRenderMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.\"):u(o.canUseDOM);for(var n,p={},f=0;f<e.length;f++)\"production\"!==t.env.NODE_ENV?u(e[f],\"dangerouslyRenderMarkup(...): Missing markup.\"):u(e[f]),n=r(e[f]),n=s(n)?n:\"*\",p[n]=p[n]||[],p[n][f]=e[f];var d=[],h=0;for(n in p)if(p.hasOwnProperty(n)){var v,m=p[n];for(v in m)if(m.hasOwnProperty(v)){var y=m[v];m[v]=y.replace(l,\"$1 \"+c+'=\"'+v+'\" ')}for(var g=i(m.join(\"\"),a),b=0;b<g.length;++b){var E=g[b];E.hasAttribute&&E.hasAttribute(c)?(v=+E.getAttribute(c),E.removeAttribute(c),\"production\"!==t.env.NODE_ENV?u(!d.hasOwnProperty(v),\"Danger: Assigning to an already-occupied result index.\"):u(!d.hasOwnProperty(v)),d[v]=E,h+=1):\"production\"!==t.env.NODE_ENV&&console.error(\"Danger: Discarding unexpected node:\",E)}}return\"production\"!==t.env.NODE_ENV?u(h===d.length,\"Danger: Did not assign to every index of resultList.\"):u(h===d.length),\"production\"!==t.env.NODE_ENV?u(d.length===e.length,\"Danger: Expected markup to render %s nodes, but rendered %s.\",e.length,d.length):u(d.length===e.length),d},dangerouslyReplaceNodeWithMarkup:function(e,n){\"production\"!==t.env.NODE_ENV?u(o.canUseDOM,\"dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.\"):u(o.canUseDOM),\"production\"!==t.env.NODE_ENV?u(n,\"dangerouslyReplaceNodeWithMarkup(...): Missing markup.\"):u(n),\"production\"!==t.env.NODE_ENV?u(\"html\"!==e.tagName.toLowerCase(),\"dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See React.renderToString().\"):u(\"html\"!==e.tagName.toLowerCase());var r=i(n,a)[0];e.parentNode.replaceChild(r,e)}};e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){function r(e){var t=e.match(c);return t&&t[1].toLowerCase()}function o(e,n){var o=l;\"production\"!==t.env.NODE_ENV?u(!!l,\"createNodesFromMarkup dummy not initialized\"):u(!!l);var i=r(e),c=i&&s(i);if(c){o.innerHTML=c[1]+e+c[2];for(var p=c[0];p--;)o=o.lastChild}else o.innerHTML=e;var f=o.getElementsByTagName(\"script\");f.length&&(\"production\"!==t.env.NODE_ENV?u(n,\"createNodesFromMarkup(...): Unexpected <script> element rendered.\"):u(n),a(f).forEach(n));for(var d=a(o.childNodes);o.lastChild;)o.removeChild(o.lastChild);return d}var i=n(54),a=n(64),s=n(66),u=n(10),l=i.canUseDOM?document.createElement(\"div\"):null,c=/^\\s*<(\\w+)/;e.exports=o}).call(t,n(6))},function(e,t,n){function r(e){return!!e&&(\"object\"==typeof e||\"function\"==typeof e)&&\"length\"in e&&!(\"setInterval\"in e)&&\"number\"!=typeof e.nodeType&&(Array.isArray(e)||\"callee\"in e||\"item\"in e)}function o(e){return r(e)?Array.isArray(e)?e.slice():i(e):[e]}var i=n(65);e.exports=o},function(e,t,n){(function(t){function r(e){var n=e.length;if(\"production\"!==t.env.NODE_ENV?o(!Array.isArray(e)&&(\"object\"==typeof e||\"function\"==typeof e),\"toArray: Array-like object expected\"):o(!Array.isArray(e)&&(\"object\"==typeof e||\"function\"==typeof e)),\"production\"!==t.env.NODE_ENV?o(\"number\"==typeof n,\"toArray: Object needs a length property\"):o(\"number\"==typeof n),\"production\"!==t.env.NODE_ENV?o(0===n||n-1 in e,\"toArray: Object should have keys for indices\"):o(0===n||n-1 in e),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var r=Array(n),i=0;i<n;i++)r[i]=e[i];return r}var o=n(10);e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){function r(e){return\"production\"!==t.env.NODE_ENV?i(!!a,\"Markup wrapping node not initialized\"):i(!!a),f.hasOwnProperty(e)||(e=\"*\"),s.hasOwnProperty(e)||(\"*\"===e?a.innerHTML=\"<link />\":a.innerHTML=\"<\"+e+\"></\"+e+\">\",s[e]=!a.firstChild),s[e]?f[e]:null}var o=n(54),i=n(10),a=o.canUseDOM?document.createElement(\"div\"):null,s={circle:!0,clipPath:!0,defs:!0,ellipse:!0,g:!0,line:!0,linearGradient:!0,path:!0,polygon:!0,polyline:!0,radialGradient:!0,rect:!0,stop:!0,text:!0},u=[1,'<select multiple=\"true\">',\"</select>\"],l=[1,\"<table>\",\"</table>\"],c=[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],p=[1,\"<svg>\",\"</svg>\"],f={\"*\":[1,\"?<div>\",\"</div>\"],area:[1,\"<map>\",\"</map>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],param:[1,\"<object>\",\"</object>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],optgroup:u,option:u,caption:l,colgroup:l,tbody:l,tfoot:l,thead:l,td:c,th:c,circle:p,clipPath:p,defs:p,ellipse:p,g:p,line:p,linearGradient:p,path:p,polygon:p,polyline:p,radialGradient:p,rect:p,stop:p,text:p};e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(9),o=r({INSERT_MARKUP:null,MOVE_EXISTING:null,REMOVE_NODE:null,TEXT_CONTENT:null});e.exports=o},function(e,t,n){\"use strict\";var r=n(54),o=n(49),i=n(69),a=function(e,t){e.textContent=t};r.canUseDOM&&(\"textContent\"in document.documentElement||(a=function(e,t){i(e,o(t))})),e.exports=a},function(e,t,n){\"use strict\";var r=n(54),o=/^[ \\r\\n\\t\\f]/,i=/<(!--|link|noscript|meta|script|style)[ \\r\\n\\t\\f\\/>]/,a=function(e,t){e.innerHTML=t};if(\"undefined\"!=typeof MSApp&&MSApp.execUnsafeLocalFunction&&(a=function(e,t){MSApp.execUnsafeLocalFunction(function(){e.innerHTML=t})}),r.canUseDOM){var s=document.createElement(\"div\");s.innerHTML=\" \",\"\"===s.innerHTML&&(a=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),o.test(t)||\"<\"===t[0]&&i.test(t)){e.innerHTML=\"\\ufeff\"+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t})}e.exports=a},function(e,t,n){(function(t){\"use strict\";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){var t=S(e);return t&&Y.getID(t)}function i(e){var n=a(e);if(n)if(F.hasOwnProperty(n)){var r=F[n];r!==e&&(\"production\"!==t.env.NODE_ENV?I(!c(r,n),\"ReactMount: Two valid but unequal nodes with the same `%s`: %s\",V,n):I(!c(r,n)),F[n]=e)}else F[n]=e;return n}function a(e){return e&&e.getAttribute&&e.getAttribute(V)||\"\"}function s(e,t){var n=a(e);n!==t&&delete F[n],e.setAttribute(V,t),F[t]=e}function u(e){return F.hasOwnProperty(e)&&c(F[e],e)||(F[e]=Y.findReactNodeByID(e)),F[e]}function l(e){var t=N.get(e)._rootNodeID;return _.isNullComponentID(t)?null:(F.hasOwnProperty(t)&&c(F[t],t)||(F[t]=Y.findReactNodeByID(t)),F[t])}function c(e,n){if(e){\"production\"!==t.env.NODE_ENV?I(a(e)===n,\"ReactMount: Unexpected modification of `%s`\",V):I(a(e)===n);var r=Y.findReactContainerForID(n);if(r&&M(r,e))return!0}return!1}function p(e){delete F[e]}function f(e){var t=F[e];return!(!t||!c(t,e))&&void(z=t)}function d(e){z=null,O.traverseAncestors(e,f);var t=z;return z=null,t}function h(e,t,n,r,o){var i=P.mountComponent(e,t,r,D);e._isTopLevel=!0,Y._mountImageIntoNode(i,n,o)}function v(e,t,n,r){var o=T.ReactReconcileTransaction.getPooled();o.perform(h,null,e,t,n,o,r),T.ReactReconcileTransaction.release(o)}var m=n(47),y=n(71),g=n(20),b=n(14),E=n(35),_=n(79),O=n(22),N=n(28),w=n(80),C=n(31),P=n(32),x=n(26),T=n(29),D=n(17),M=n(82),S=n(85),k=n(86),I=n(10),R=n(69),A=n(89),j=n(18),L=O.SEPARATOR,V=m.ID_ATTRIBUTE_NAME,F={},U=1,B=9,K={},W={};if(\"production\"!==t.env.NODE_ENV)var H={};var q=[],z=null,Y={_instancesByReactRootID:K,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,n,r,i){return\"production\"!==t.env.NODE_ENV&&E.checkAndWarnForMutatedProps(n),Y.scrollMonitor(r,function(){x.enqueueElementInternal(e,n),i&&x.enqueueCallbackInternal(e,i)}),\"production\"!==t.env.NODE_ENV&&(H[o(r)]=S(r)),e},_registerComponent:function(e,n){\"production\"!==t.env.NODE_ENV?I(n&&(n.nodeType===U||n.nodeType===B),\"_registerComponent(...): Target container is not a DOM element.\"):I(n&&(n.nodeType===U||n.nodeType===B)),y.ensureScrollValueMonitoring();var r=Y.registerContainer(n);return K[r]=e,r},_renderNewRootComponent:function(e,n,r){\"production\"!==t.env.NODE_ENV?j(null==g.current,\"_renderNewRootComponent(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\"):null;var o=k(e,null),i=Y._registerComponent(o,n);return T.batchedUpdates(v,o,i,n,r),\"production\"!==t.env.NODE_ENV&&(H[i]=S(n)),o},render:function(e,n,r){\"production\"!==t.env.NODE_ENV?I(b.isValidElement(e),\"React.render(): Invalid component element.%s\",\"string\"==typeof e?\" Instead of passing an element string, make sure to instantiate it by passing it to React.createElement.\":\"function\"==typeof e?\" Instead of passing a component class, make sure to instantiate it by passing it to React.createElement.\":null!=e&&void 0!==e.props?\" This may be caused by unintentionally loading two independent copies of React.\":\"\"):I(b.isValidElement(e));var i=K[o(n)];if(i){var a=i._currentElement;if(A(a,e))return Y._updateRootComponent(i,e,n,r).getPublicInstance();Y.unmountComponentAtNode(n)}var s=S(n),u=s&&Y.isRenderedByReact(s);if(\"production\"!==t.env.NODE_ENV&&(!u||s.nextSibling))for(var l=s;l;){if(Y.isRenderedByReact(l)){\"production\"!==t.env.NODE_ENV?j(!1,\"render(): Target node has markup rendered by React, but there are unrelated nodes as well. This is most commonly caused by white-space inserted around server-rendered markup.\"):null;break}l=l.nextSibling}var c=u&&!i,p=Y._renderNewRootComponent(e,n,c).getPublicInstance();return r&&r.call(p),p},constructAndRenderComponent:function(e,t,n){var r=b.createElement(e,t);return Y.render(r,n)},constructAndRenderComponentByID:function(e,n,r){var o=document.getElementById(r);return\"production\"!==t.env.NODE_ENV?I(o,'Tried to get element with id of \"%s\" but it is not present on the page.',r):I(o),Y.constructAndRenderComponent(e,n,o)},registerContainer:function(e){var t=o(e);return t&&(t=O.getReactRootIDFromNodeID(t)),t||(t=O.createReactRootID()),W[t]=e,t},unmountComponentAtNode:function(e){\"production\"!==t.env.NODE_ENV?j(null==g.current,\"unmountComponentAtNode(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\"):null,\"production\"!==t.env.NODE_ENV?I(e&&(e.nodeType===U||e.nodeType===B),\"unmountComponentAtNode(...): Target container is not a DOM element.\"):I(e&&(e.nodeType===U||e.nodeType===B));var n=o(e),r=K[n];return!!r&&(Y.unmountComponentFromNode(r,e),delete K[n],delete W[n],\"production\"!==t.env.NODE_ENV&&delete H[n],!0)},unmountComponentFromNode:function(e,t){for(P.unmountComponent(e),t.nodeType===B&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)},findReactContainerForID:function(e){var n=O.getReactRootIDFromNodeID(e),r=W[n];if(\"production\"!==t.env.NODE_ENV){var o=H[n];if(o&&o.parentNode!==r){\"production\"!==t.env.NODE_ENV?I(a(o)===n,\"ReactMount: Root element ID differed from reactRootID.\"):I(a(o)===n);var i=r.firstChild;i&&n===a(i)?H[n]=i:\"production\"!==t.env.NODE_ENV?j(!1,\"ReactMount: Root element has been removed from its original container. New container:\",o.parentNode):null}}return r},findReactNodeByID:function(e){var t=Y.findReactContainerForID(e);return Y.findComponentRoot(t,e)},isRenderedByReact:function(e){if(1!==e.nodeType)return!1;var t=Y.getID(e);return!!t&&t.charAt(0)===L},getFirstReactDOM:function(e){for(var t=e;t&&t.parentNode!==t;){if(Y.isRenderedByReact(t))return t;t=t.parentNode}return null},findComponentRoot:function(e,n){var r=q,o=0,i=d(n)||e;for(r[0]=i.firstChild,r.length=1;o<r.length;){for(var a,s=r[o++];s;){var u=Y.getID(s);u?n===u?a=s:O.isAncestorIDOf(u,n)&&(r.length=o=0,r.push(s.firstChild)):r.push(s.firstChild),s=s.nextSibling}if(a)return r.length=0,a}r.length=0,\"production\"!==t.env.NODE_ENV?I(!1,\"findComponentRoot(..., %s): Unable to find element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID `%s`.\",n,Y.getID(e)):I(!1)},_mountImageIntoNode:function(e,n,o){if(\"production\"!==t.env.NODE_ENV?I(n&&(n.nodeType===U||n.nodeType===B),\"mountComponentIntoNode(...): Target container is not valid.\"):I(n&&(n.nodeType===U||n.nodeType===B)),o){var i=S(n);if(w.canReuseMarkup(e,i))return;var a=i.getAttribute(w.CHECKSUM_ATTR_NAME);i.removeAttribute(w.CHECKSUM_ATTR_NAME);var s=i.outerHTML;i.setAttribute(w.CHECKSUM_ATTR_NAME,a);var u=r(e,s),l=\" (client) \"+e.substring(u-20,u+20)+\"\\n (server) \"+s.substring(u-20,u+20);\"production\"!==t.env.NODE_ENV?I(n.nodeType!==B,\"You're trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\\n%s\",l):I(n.nodeType!==B),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?j(!1,\"React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:\\n%s\",l):null)}\"production\"!==t.env.NODE_ENV?I(n.nodeType!==B,\"You're trying to render a component to the document but you didn't use server rendering. We can't do this without using server rendering due to cross-browser quirks. See React.renderToString() for server rendering.\"):I(n.nodeType!==B),R(n,e)},getReactRootID:o,getID:i,setID:s,getNode:u,getNodeFromInstance:l,purgeID:p};C.measureMethods(Y,\"ReactMount\",{_renderNewRootComponent:\"_renderNewRootComponent\",_mountImageIntoNode:\"_mountImageIntoNode\"}),e.exports=Y}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return Object.prototype.hasOwnProperty.call(e,v)||(e[v]=d++,p[e[v]]={}),p[e[v]]}var o=n(8),i=n(72),a=n(73),s=n(76),u=n(77),l=n(16),c=n(78),p={},f=!1,d=0,h={topBlur:\"blur\",topChange:\"change\",topClick:\"click\",topCompositionEnd:\"compositionend\",topCompositionStart:\"compositionstart\",topCompositionUpdate:\"compositionupdate\",topContextMenu:\"contextmenu\",topCopy:\"copy\",topCut:\"cut\",topDoubleClick:\"dblclick\",topDrag:\"drag\",topDragEnd:\"dragend\",topDragEnter:\"dragenter\",topDragExit:\"dragexit\",topDragLeave:\"dragleave\",topDragOver:\"dragover\",topDragStart:\"dragstart\",topDrop:\"drop\",topFocus:\"focus\",topInput:\"input\",topKeyDown:\"keydown\",topKeyPress:\"keypress\",topKeyUp:\"keyup\",topMouseDown:\"mousedown\",topMouseMove:\"mousemove\",topMouseOut:\"mouseout\",topMouseOver:\"mouseover\",topMouseUp:\"mouseup\",topPaste:\"paste\",topScroll:\"scroll\",topSelectionChange:\"selectionchange\",topTextInput:\"textInput\",topTouchCancel:\"touchcancel\",topTouchEnd:\"touchend\",topTouchMove:\"touchmove\",topTouchStart:\"touchstart\",topWheel:\"wheel\"},v=\"_reactListenersID\"+String(Math.random()).slice(2),m=l({},s,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(m.handleTopLevel),m.ReactEventListener=e}},setEnabled:function(e){m.ReactEventListener&&m.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!m.ReactEventListener||!m.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,i=r(n),s=a.registrationNameDependencies[e],u=o.topLevelTypes,l=0,p=s.length;l<p;l++){var f=s[l];i.hasOwnProperty(f)&&i[f]||(f===u.topWheel?c(\"wheel\")?m.ReactEventListener.trapBubbledEvent(u.topWheel,\"wheel\",n):c(\"mousewheel\")?m.ReactEventListener.trapBubbledEvent(u.topWheel,\"mousewheel\",n):m.ReactEventListener.trapBubbledEvent(u.topWheel,\"DOMMouseScroll\",n):f===u.topScroll?c(\"scroll\",!0)?m.ReactEventListener.trapCapturedEvent(u.topScroll,\"scroll\",n):m.ReactEventListener.trapBubbledEvent(u.topScroll,\"scroll\",m.ReactEventListener.WINDOW_HANDLE):f===u.topFocus||f===u.topBlur?(c(\"focus\",!0)?(m.ReactEventListener.trapCapturedEvent(u.topFocus,\"focus\",n),m.ReactEventListener.trapCapturedEvent(u.topBlur,\"blur\",n)):c(\"focusin\")&&(m.ReactEventListener.trapBubbledEvent(u.topFocus,\"focusin\",n),m.ReactEventListener.trapBubbledEvent(u.topBlur,\"focusout\",n)),i[u.topBlur]=!0,i[u.topFocus]=!0):h.hasOwnProperty(f)&&m.ReactEventListener.trapBubbledEvent(f,h[f],n),i[f]=!0)}},trapBubbledEvent:function(e,t,n){return m.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return m.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!f){var e=u.refreshScrollValues;m.ReactEventListener.monitorScrollValue(e),f=!0}},eventNameDispatchConfigs:i.eventNameDispatchConfigs,registrationNameModules:i.registrationNameModules,putListener:i.putListener,getListener:i.getListener,deleteListener:i.deleteListener,deleteAllListeners:i.deleteAllListeners});e.exports=m},function(e,t,n){(function(t){\"use strict\";function r(){var e=f&&f.traverseTwoPhase&&f.traverseEnterLeave;\"production\"!==t.env.NODE_ENV?u(e,\"InstanceHandle not injected before use!\"):u(e)}var o=n(73),i=n(7),a=n(74),s=n(75),u=n(10),l={},c=null,p=function(e){if(e){var t=i.executeDispatch,n=o.getPluginModuleForEvent(e);n&&n.executeDispatch&&(t=n.executeDispatch),i.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e)}},f=null,d={injection:{injectMount:i.injection.injectMount,injectInstanceHandle:function(e){f=e,\"production\"!==t.env.NODE_ENV&&r()},getInstanceHandle:function(){return\"production\"!==t.env.NODE_ENV&&r(),f},injectEventPluginOrder:o.injectEventPluginOrder,injectEventPluginsByName:o.injectEventPluginsByName},eventNameDispatchConfigs:o.eventNameDispatchConfigs,registrationNameModules:o.registrationNameModules,putListener:function(e,n,r){\"production\"!==t.env.NODE_ENV?u(!r||\"function\"==typeof r,\"Expected %s listener to be a function, instead got type %s\",n,typeof r):u(!r||\"function\"==typeof r);var o=l[n]||(l[n]={});o[e]=r},getListener:function(e,t){var n=l[t];return n&&n[e]},deleteListener:function(e,t){var n=l[t];n&&delete n[e]},deleteAllListeners:function(e){for(var t in l)delete l[t][e]},extractEvents:function(e,t,n,r){for(var i,s=o.plugins,u=0,l=s.length;u<l;u++){var c=s[u];if(c){var p=c.extractEvents(e,t,n,r);p&&(i=a(i,p))}}return i},enqueueEvents:function(e){e&&(c=a(c,e))},processEventQueue:function(){var e=c;c=null,s(e,p),\"production\"!==t.env.NODE_ENV?u(!c,\"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\"):u(!c)},__purge:function(){l={}},__getListenerBank:function(){return l}};e.exports=d}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(){if(s)for(var e in u){var n=u[e],r=s.indexOf(e);if(\"production\"!==t.env.NODE_ENV?a(r>-1,\"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.\",e):a(r>-1),!l.plugins[r]){\"production\"!==t.env.NODE_ENV?a(n.extractEvents,\"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.\",e):a(n.extractEvents),l.plugins[r]=n;var i=n.eventTypes;for(var c in i)\"production\"!==t.env.NODE_ENV?a(o(i[c],n,c),\"EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.\",c,e):a(o(i[c],n,c))}}}function o(e,n,r){\"production\"!==t.env.NODE_ENV?a(!l.eventNameDispatchConfigs.hasOwnProperty(r),\"EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.\",r):a(!l.eventNameDispatchConfigs.hasOwnProperty(r)),l.eventNameDispatchConfigs[r]=e;var o=e.phasedRegistrationNames;if(o){for(var s in o)if(o.hasOwnProperty(s)){var u=o[s];i(u,n,r)}return!0}return!!e.registrationName&&(i(e.registrationName,n,r),!0)}function i(e,n,r){\"production\"!==t.env.NODE_ENV?a(!l.registrationNameModules[e],\"EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.\",e):a(!l.registrationNameModules[e]),l.registrationNameModules[e]=n,l.registrationNameDependencies[e]=n.eventTypes[r].dependencies}var a=n(10),s=null,u={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){\"production\"!==t.env.NODE_ENV?a(!s,\"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\"):a(!s),s=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var n=!1;for(var o in e)if(e.hasOwnProperty(o)){var i=e[o];u.hasOwnProperty(o)&&u[o]===i||(\"production\"!==t.env.NODE_ENV?a(!u[o],\"EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.\",o):a(!u[o]),u[o]=i,n=!0)}n&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.phasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){s=null;for(var e in u)u.hasOwnProperty(e)&&delete u[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};e.exports=l}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n){if(\"production\"!==t.env.NODE_ENV?o(null!=n,\"accumulateInto(...): Accumulated items must not be null or undefined.\"):o(null!=n),null==e)return n;var r=Array.isArray(e),i=Array.isArray(n);return r&&i?(e.push.apply(e,n),e):r?(e.push(n),e):i?[e].concat(n):[e,n]}var o=n(10);e.exports=r}).call(t,n(6))},function(e,t){\"use strict\";var n=function(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)};e.exports=n},function(e,t,n){\"use strict\";function r(e){o.enqueueEvents(e),o.processEventQueue()}var o=n(72),i={handleTopLevel:function(e,t,n,i){var a=o.extractEvents(e,t,n,i);r(a)}};e.exports=i},function(e,t){\"use strict\";var n={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){n.currentScrollLeft=e.x,n.currentScrollTop=e.y}};e.exports=n},function(e,t,n){\"use strict\";/**\n\t * Checks if an event is supported in the current execution environment.\n\t *\n\t * NOTE: This will not work correctly for non-generic events such as `change`,\n\t * `reset`, `load`, `error`, and `select`.\n\t *\n\t * Borrows from Modernizr.\n\t *\n\t * @param {string} eventNameSuffix Event name, e.g. \"click\".\n\t * @param {?boolean} capture Check if the capture phase is supported.\n\t * @return {boolean} True if the event is supported.\n\t * @internal\n\t * @license Modernizr 3.0.0pre (Custom Build) | MIT\n\t */\nfunction r(e,t){if(!i.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var n=\"on\"+e,r=n in document;if(!r){var a=document.createElement(\"div\");a.setAttribute(n,\"return;\"),r=\"function\"==typeof a[n]}return!r&&o&&\"wheel\"===e&&(r=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),r}var o,i=n(54);i.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature(\"\",\"\")!==!0),e.exports=r},function(e,t,n){(function(t){\"use strict\";function r(e){c[e]=!0}function o(e){delete c[e]}function i(e){return!!c[e]}var a,s=n(14),u=n(28),l=n(10),c={},p={injectEmptyComponent:function(e){a=s.createFactory(e)}},f=function(){};f.prototype.componentDidMount=function(){var e=u.get(this);e&&r(e._rootNodeID)},f.prototype.componentWillUnmount=function(){var e=u.get(this);e&&o(e._rootNodeID)},f.prototype.render=function(){return\"production\"!==t.env.NODE_ENV?l(a,\"Trying to return null from a render, but no null placeholder component was injected.\"):l(a),a()};var d=s.createElement(f),h={emptyElement:d,injection:p,isNullComponentID:i};e.exports=h}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(81),o={CHECKSUM_ATTR_NAME:\"data-react-checksum\",addChecksumToMarkup:function(e){var t=r(e);return e.replace(\">\",\" \"+o.CHECKSUM_ATTR_NAME+'=\"'+t+'\">')},canReuseMarkup:function(e,t){var n=t.getAttribute(o.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var i=r(e);return i===n}};e.exports=o},function(e,t){\"use strict\";function n(e){for(var t=1,n=0,o=0;o<e.length;o++)t=(t+e.charCodeAt(o))%r,n=(n+t)%r;return t|n<<16}var r=65521;e.exports=n},function(e,t,n){function r(e,t){return!(!e||!t)&&(e===t||!o(e)&&(o(t)?r(e,t.parentNode):e.contains?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var o=n(83);e.exports=r},function(e,t,n){function r(e){return o(e)&&3==e.nodeType}var o=n(84);e.exports=r},function(e,t){function n(e){return!(!e||!(\"function\"==typeof Node?e instanceof Node:\"object\"==typeof e&&\"number\"==typeof e.nodeType&&\"string\"==typeof e.nodeName))}e.exports=n},function(e,t){\"use strict\";function n(e){return e?e.nodeType===r?e.documentElement:e.firstChild:null}var r=9;e.exports=n},function(e,t,n){(function(t){\"use strict\";function r(e){return\"function\"==typeof e&&\"undefined\"!=typeof e.prototype&&\"function\"==typeof e.prototype.mountComponent&&\"function\"==typeof e.prototype.receiveComponent}function o(e,n){var o;if(null!==e&&e!==!1||(e=a.emptyElement),\"object\"==typeof e){var i=e;\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?c(i&&(\"function\"==typeof i.type||\"string\"==typeof i.type),\"Only functions or strings can be mounted as React components.\"):null),o=n===i.type&&\"string\"==typeof i.type?s.createInternalComponent(i):r(i.type)?new i.type(i):new p}else\"string\"==typeof e||\"number\"==typeof e?o=s.createInstanceForText(e):\"production\"!==t.env.NODE_ENV?l(!1,\"Encountered invalid React node of type %s\",typeof e):l(!1);return\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?c(\"function\"==typeof o.construct&&\"function\"==typeof o.mountComponent&&\"function\"==typeof o.receiveComponent&&\"function\"==typeof o.unmountComponent,\"Only React Components can be mounted.\"):null),o.construct(e),o._mountIndex=0,o._mountImage=null,\"production\"!==t.env.NODE_ENV&&(o._isOwnerNecessary=!1,o._warnedAboutRefsInRender=!1),\"production\"!==t.env.NODE_ENV&&Object.preventExtensions&&Object.preventExtensions(o),o}var i=n(87),a=n(79),s=n(38),u=n(16),l=n(10),c=n(18),p=function(){};u(p.prototype,i.Mixin,{_instantiateReactComponent:o}),e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return\" Check the render method of `\"+n+\"`.\"}return\"\"}var o=n(88),i=n(15),a=n(20),s=n(14),u=n(35),l=n(28),c=n(27),p=n(38),f=n(31),d=n(36),h=n(37),v=n(32),m=n(29),y=n(16),g=n(17),b=n(10),E=n(89),_=n(18),O=1,N={construct:function(e){this._currentElement=e,this._rootNodeID=null,this._instance=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._isTopLevel=!1,this._pendingCallbacks=null},mountComponent:function(e,n,r){this._context=r,this._mountOrder=O++,this._rootNodeID=e;var o=this._processProps(this._currentElement.props),i=this._processContext(this._currentElement._context),a=p.getComponentClassForElement(this._currentElement),s=new a(o,i);\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?_(null!=s.render,\"%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render` in your component or you may have accidentally tried to render an element whose type is a function that isn't a React component.\",a.displayName||a.name||\"Component\"):null),s.props=o,s.context=i,s.refs=g,this._instance=s,l.set(s,this),\"production\"!==t.env.NODE_ENV&&this._warnIfContextsDiffer(this._currentElement._context,r),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?_(!s.getInitialState||s.getInitialState.isReactClassApproved,\"getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(!s.getDefaultProps||s.getDefaultProps.isReactClassApproved,\"getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(!s.propTypes,\"propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(!s.contextTypes,\"contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.\",this.getName()||\"a component\"):null,\"production\"!==t.env.NODE_ENV?_(\"function\"!=typeof s.componentShouldUpdate,\"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.\",this.getName()||\"A component\"):null);var u=s.state;void 0===u&&(s.state=u=null),\"production\"!==t.env.NODE_ENV?b(\"object\"==typeof u&&!Array.isArray(u),\"%s.state: must be set to an object or null\",this.getName()||\"ReactCompositeComponent\"):b(\"object\"==typeof u&&!Array.isArray(u)),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var f,d,h=c.currentlyMountingInstance;c.currentlyMountingInstance=this;try{s.componentWillMount&&(s.componentWillMount(),this._pendingStateQueue&&(s.state=this._processPendingState(s.props,s.context))),f=this._getValidatedChildContext(r),d=this._renderValidatedComponent(f)}finally{c.currentlyMountingInstance=h}this._renderedComponent=this._instantiateReactComponent(d,this._currentElement.type);var m=v.mountComponent(this._renderedComponent,e,n,this._mergeChildContext(r,f));return s.componentDidMount&&n.getReactMountReady().enqueue(s.componentDidMount,s),m},unmountComponent:function(){var e=this._instance;if(e.componentWillUnmount){var t=c.currentlyUnmountingInstance;c.currentlyUnmountingInstance=this;try{e.componentWillUnmount()}finally{c.currentlyUnmountingInstance=t}}v.unmountComponent(this._renderedComponent),this._renderedComponent=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=null,l.remove(e)},_setPropsInternal:function(e,t){var n=this._pendingElement||this._currentElement;this._pendingElement=s.cloneAndReplaceProps(n,y({},n.props,e)),m.enqueueUpdate(this,t)},_maskContext:function(e){var t=null;if(\"string\"==typeof this._currentElement.type)return g;var n=this._currentElement.type.contextTypes;if(!n)return g;t={};for(var r in n)t[r]=e[r];return t},_processContext:function(e){var n=this._maskContext(e);if(\"production\"!==t.env.NODE_ENV){var r=p.getComponentClassForElement(this._currentElement);r.contextTypes&&this._checkPropTypes(r.contextTypes,n,d.context)}return n},_getValidatedChildContext:function(e){var n=this._instance,r=n.getChildContext&&n.getChildContext();if(r){\"production\"!==t.env.NODE_ENV?b(\"object\"==typeof n.constructor.childContextTypes,\"%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().\",this.getName()||\"ReactCompositeComponent\"):b(\"object\"==typeof n.constructor.childContextTypes),\"production\"!==t.env.NODE_ENV&&this._checkPropTypes(n.constructor.childContextTypes,r,d.childContext);for(var o in r)\"production\"!==t.env.NODE_ENV?b(o in n.constructor.childContextTypes,'%s.getChildContext(): key \"%s\" is not defined in childContextTypes.',this.getName()||\"ReactCompositeComponent\",o):b(o in n.constructor.childContextTypes);return r}return null},_mergeChildContext:function(e,t){return t?y({},e,t):e},_processProps:function(e){if(\"production\"!==t.env.NODE_ENV){var n=p.getComponentClassForElement(this._currentElement);n.propTypes&&this._checkPropTypes(n.propTypes,e,d.prop)}return e},_checkPropTypes:function(e,n,o){var i=this.getName();for(var a in e)if(e.hasOwnProperty(a)){var s;try{\"production\"!==t.env.NODE_ENV?b(\"function\"==typeof e[a],\"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.\",i||\"React class\",h[o],a):b(\"function\"==typeof e[a]),s=e[a](n,a,i,o)}catch(e){s=e}if(s instanceof Error){var u=r(this);o===d.prop?\"production\"!==t.env.NODE_ENV?_(!1,\"Failed Composite propType: %s%s\",s.message,u):null:\"production\"!==t.env.NODE_ENV?_(!1,\"Failed Context Types: %s%s\",s.message,u):null}}},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement&&v.receiveComponent(this,this._pendingElement||this._currentElement,e,this._context),(null!==this._pendingStateQueue||this._pendingForceUpdate)&&(\"production\"!==t.env.NODE_ENV&&u.checkAndWarnForMutatedProps(this._currentElement),this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context))},_warnIfContextsDiffer:function(e,n){e=this._maskContext(e),n=this._maskContext(n);for(var r=Object.keys(n).sort(),o=this.getName()||\"ReactCompositeComponent\",i=0;i<r.length;i++){var a=r[i];\"production\"!==t.env.NODE_ENV?_(e[a]===n[a],\"owner-based and parent-based contexts differ (values: `%s` vs `%s`) for key (%s) while mounting %s (see: http://fb.me/react-context-by-parent)\",e[a],n[a],a,o):null}},updateComponent:function(e,n,r,o,i){var a=this._instance,s=a.context,u=a.props;n!==r&&(s=this._processContext(r._context),u=this._processProps(r.props),\"production\"!==t.env.NODE_ENV&&null!=i&&this._warnIfContextsDiffer(r._context,i),a.componentWillReceiveProps&&a.componentWillReceiveProps(u,s));var l=this._processPendingState(u,s),c=this._pendingForceUpdate||!a.shouldComponentUpdate||a.shouldComponentUpdate(u,l,s);\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?_(\"undefined\"!=typeof c,\"%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.\",this.getName()||\"ReactCompositeComponent\"):null),c?(this._pendingForceUpdate=!1,this._performComponentUpdate(r,u,l,s,e,i)):(this._currentElement=r,this._context=i,a.props=u,a.state=l,a.context=s)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,o=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(o&&1===r.length)return r[0];for(var i=y({},o?r[0]:n.state),a=o?1:0;a<r.length;a++){var s=r[a];y(i,\"function\"==typeof s?s.call(n,i,e,t):s)}return i},_performComponentUpdate:function(e,t,n,r,o,i){var a=this._instance,s=a.props,u=a.state,l=a.context;a.componentWillUpdate&&a.componentWillUpdate(t,n,r),this._currentElement=e,this._context=i,a.props=t,a.state=n,a.context=r,this._updateRenderedComponent(o,i),a.componentDidUpdate&&o.getReactMountReady().enqueue(a.componentDidUpdate.bind(a,s,u,l),a)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._getValidatedChildContext(),i=this._renderValidatedComponent(o);if(E(r,i))v.receiveComponent(n,i,e,this._mergeChildContext(t,o));else{var a=this._rootNodeID,s=n._rootNodeID;v.unmountComponent(n),this._renderedComponent=this._instantiateReactComponent(i,this._currentElement.type);var u=v.mountComponent(this._renderedComponent,a,e,this._mergeChildContext(t,o));this._replaceNodeWithMarkupByID(s,u)}},_replaceNodeWithMarkupByID:function(e,t){o.replaceNodeWithMarkupByID(e,t)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance,n=e.render();return\"production\"!==t.env.NODE_ENV&&\"undefined\"==typeof n&&e.render._isMockFunction&&(n=null),n},_renderValidatedComponent:function(e){var n,r=i.current;i.current=this._mergeChildContext(this._currentElement._context,e),a.current=this;try{n=this._renderValidatedComponentWithoutOwnerOrContext()}finally{i.current=r,a.current=null}return\"production\"!==t.env.NODE_ENV?b(null===n||n===!1||s.isValidElement(n),\"%s.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.\",this.getName()||\"ReactCompositeComponent\"):b(null===n||n===!1||s.isValidElement(n)),n},attachRef:function(e,t){var n=this.getPublicInstance(),r=n.refs===g?n.refs={}:n.refs;r[e]=t.getPublicInstance()},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){return this._instance},_instantiateReactComponent:null};f.measureMethods(N,\"ReactCompositeComponent\",{mountComponent:\"mountComponent\",updateComponent:\"updateComponent\",_renderValidatedComponent:\"_renderValidatedComponent\"});var w={Mixin:N};e.exports=w}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var r=n(10),o=!1,i={unmountIDFromEnvironment:null,replaceNodeWithMarkupByID:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){\"production\"!==t.env.NODE_ENV?r(!o,\"ReactCompositeComponent: injectEnvironment() can only be called once.\"):r(!o),i.unmountIDFromEnvironment=e.unmountIDFromEnvironment,i.replaceNodeWithMarkupByID=e.replaceNodeWithMarkupByID,i.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};e.exports=i}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e,n){if(null!=e&&null!=n){var r=typeof e,i=typeof n;if(\"string\"===r||\"number\"===r)return\"string\"===i||\"number\"===i;if(\"object\"===i&&e.type===n.type&&e.key===n.key){var a=e._owner===n._owner,s=null,u=null,l=null;return\"production\"!==t.env.NODE_ENV&&(a||(null!=e._owner&&null!=e._owner.getPublicInstance()&&null!=e._owner.getPublicInstance().constructor&&(s=e._owner.getPublicInstance().constructor.displayName),null!=n._owner&&null!=n._owner.getPublicInstance()&&null!=n._owner.getPublicInstance().constructor&&(u=n._owner.getPublicInstance().constructor.displayName),null!=n.type&&null!=n.type.displayName&&(l=n.type.displayName),null!=n.type&&\"string\"==typeof n.type&&(l=n.type),\"string\"==typeof n.type&&\"input\"!==n.type&&\"textarea\"!==n.type||(null!=e._owner&&e._owner._isOwnerNecessary===!1||null!=n._owner&&n._owner._isOwnerNecessary===!1)&&(null!=e._owner&&(e._owner._isOwnerNecessary=!0),null!=n._owner&&(n._owner._isOwnerNecessary=!0),\"production\"!==t.env.NODE_ENV?o(!1,\"<%s /> is being rendered by both %s and %s using the same key (%s) in the same place. Currently, this means that they don't preserve state. This behavior should be very rare so we're considering deprecating it. Please contact the React team and explain your use case so that we can take that into consideration.\",l||\"Unknown Component\",s||\"[Unknown]\",u||\"[Unknown]\",e.key):null))),a}}return!1}var o=n(18);e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){e&&(null!=e.dangerouslySetInnerHTML&&(\"production\"!==t.env.NODE_ENV?y(null==e.children,\"Can only set one of `children` or `props.dangerouslySetInnerHTML`.\"):y(null==e.children),\"production\"!==t.env.NODE_ENV?y(\"object\"==typeof e.dangerouslySetInnerHTML&&\"__html\"in e.dangerouslySetInnerHTML,\"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\"):y(\"object\"==typeof e.dangerouslySetInnerHTML&&\"__html\"in e.dangerouslySetInnerHTML)),\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?E(null==e.innerHTML,\"Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`.\"):null,\"production\"!==t.env.NODE_ENV?E(!e.contentEditable||null==e.children,\"A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.\"):null),\"production\"!==t.env.NODE_ENV?y(null==e.style||\"object\"==typeof e.style,\"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.\"):y(null==e.style||\"object\"==typeof e.style))}function o(e,n,r,o){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?E(\"onScroll\"!==n||g(\"scroll\",!0),\"This browser doesn't support the `onScroll` event\"):null);var i=f.findReactContainerForID(e);if(i){var a=i.nodeType===P?i.ownerDocument:i;O(n,a)}o.getPutListenerQueue().enqueuePutListener(e,n,r)}function i(e){S.call(M,e)||(\"production\"!==t.env.NODE_ENV?y(D.test(e),\"Invalid tag: %s\",e):y(D.test(e)),M[e]=!0)}function a(e){i(e),this._tag=e,this._renderedChildren=null,this._previousStyleCopy=null,this._rootNodeID=null}var s=n(52),u=n(47),l=n(46),c=n(71),p=n(50),f=n(70),d=n(91),h=n(31),v=n(16),m=n(49),y=n(10),g=n(78),b=n(42),E=n(18),_=c.deleteListener,O=c.listenTo,N=c.registrationNameModules,w={string:!0,number:!0},C=b({style:null}),P=1,x=null,T={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},D=/^[a-zA-Z][a-zA-Z:_\\.\\-\\d]*$/,M={},S={}.hasOwnProperty;a.displayName=\"ReactDOMComponent\",a.Mixin={construct:function(e){this._currentElement=e},mountComponent:function(e,t,n){this._rootNodeID=e,r(this._currentElement.props);var o=T[this._tag]?\"\":\"</\"+this._tag+\">\";return this._createOpenTagMarkupAndPutListeners(t)+this._createContentMarkup(t,n)+o},_createOpenTagMarkupAndPutListeners:function(e){var t=this._currentElement.props,n=\"<\"+this._tag;for(var r in t)if(t.hasOwnProperty(r)){var i=t[r];if(null!=i)if(N.hasOwnProperty(r))o(this._rootNodeID,r,i,e);else{r===C&&(i&&(i=this._previousStyleCopy=v({},t.style)),i=s.createMarkupForStyles(i));var a=l.createMarkupForProperty(r,i);a&&(n+=\" \"+a)}}if(e.renderToStaticMarkup)return n+\">\";var u=l.createMarkupForID(this._rootNodeID);return n+\" \"+u+\">\"},_createContentMarkup:function(e,t){var n=\"\";\"listing\"!==this._tag&&\"pre\"!==this._tag&&\"textarea\"!==this._tag||(n=\"\\n\");var r=this._currentElement.props,o=r.dangerouslySetInnerHTML;if(null!=o){if(null!=o.__html)return n+o.__html}else{var i=w[typeof r.children]?r.children:null,a=null!=i?null:r.children;if(null!=i)return n+m(i);if(null!=a){var s=this.mountChildren(a,e,t);return n+s.join(\"\")}}return n},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,o){r(this._currentElement.props),this._updateDOMProperties(t.props,e),this._updateDOMChildren(t.props,e,o)},_updateDOMProperties:function(e,t){var n,r,i,a=this._currentElement.props;for(n in e)if(!a.hasOwnProperty(n)&&e.hasOwnProperty(n))if(n===C){var s=this._previousStyleCopy;for(r in s)s.hasOwnProperty(r)&&(i=i||{},i[r]=\"\");this._previousStyleCopy=null}else N.hasOwnProperty(n)?_(this._rootNodeID,n):(u.isStandardName[n]||u.isCustomAttribute(n))&&x.deletePropertyByID(this._rootNodeID,n);for(n in a){var l=a[n],c=n===C?this._previousStyleCopy:e[n];if(a.hasOwnProperty(n)&&l!==c)if(n===C)if(l?l=this._previousStyleCopy=v({},l):this._previousStyleCopy=null,c){for(r in c)!c.hasOwnProperty(r)||l&&l.hasOwnProperty(r)||(i=i||{},i[r]=\"\");for(r in l)l.hasOwnProperty(r)&&c[r]!==l[r]&&(i=i||{},i[r]=l[r])}else i=l;else N.hasOwnProperty(n)?o(this._rootNodeID,n,l,t):(u.isStandardName[n]||u.isCustomAttribute(n))&&x.updatePropertyByID(this._rootNodeID,n,l)}i&&x.updateStylesByID(this._rootNodeID,i)},_updateDOMChildren:function(e,t,n){var r=this._currentElement.props,o=w[typeof e.children]?e.children:null,i=w[typeof r.children]?r.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,s=r.dangerouslySetInnerHTML&&r.dangerouslySetInnerHTML.__html,u=null!=o?null:e.children,l=null!=i?null:r.children,c=null!=o||null!=a,p=null!=i||null!=s;null!=u&&null==l?this.updateChildren(null,t,n):c&&!p&&this.updateTextContent(\"\"),null!=i?o!==i&&this.updateTextContent(\"\"+i):null!=s?a!==s&&x.updateInnerHTMLByID(this._rootNodeID,s):null!=l&&this.updateChildren(l,t,n)},unmountComponent:function(){this.unmountChildren(),c.deleteAllListeners(this._rootNodeID),p.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null}},h.measureMethods(a,\"ReactDOMComponent\",{mountComponent:\"mountComponent\",updateComponent:\"updateComponent\"}),v(a.prototype,a.Mixin,d.Mixin),a.injection={injectIDOperations:function(e){a.BackendIDOperations=x=e}},e.exports=a}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t,n){h.push({parentID:e,parentNode:null,type:c.INSERT_MARKUP,markupIndex:v.push(t)-1,textContent:null,fromIndex:null,toIndex:n})}function o(e,t,n){h.push({parentID:e,parentNode:null,type:c.MOVE_EXISTING,markupIndex:null,textContent:null,fromIndex:t,toIndex:n})}function i(e,t){h.push({parentID:e,parentNode:null,type:c.REMOVE_NODE,markupIndex:null,textContent:null,fromIndex:t,toIndex:null})}function a(e,t){h.push({parentID:e,parentNode:null,type:c.TEXT_CONTENT,markupIndex:null,textContent:t,fromIndex:null,toIndex:null})}function s(){h.length&&(l.processChildrenUpdates(h,v),u())}function u(){h.length=0,v.length=0}var l=n(88),c=n(67),p=n(32),f=n(92),d=0,h=[],v=[],m={Mixin:{mountChildren:function(e,t,n){var r=f.instantiateChildren(e,t,n);this._renderedChildren=r;var o=[],i=0;for(var a in r)if(r.hasOwnProperty(a)){var s=r[a],u=this._rootNodeID+a,l=p.mountComponent(s,u,t,n);s._mountIndex=i,o.push(l),i++}return o},updateTextContent:function(e){d++;var t=!0;try{var n=this._renderedChildren;f.unmountChildren(n);for(var r in n)n.hasOwnProperty(r)&&this._unmountChildByName(n[r],r);this.setTextContent(e),t=!1}finally{d--,d||(t?u():s())}},updateChildren:function(e,t,n){d++;var r=!0;try{this._updateChildren(e,t,n),r=!1}finally{d--,d||(r?u():s())}},_updateChildren:function(e,t,n){var r=this._renderedChildren,o=f.updateChildren(r,e,t,n);if(this._renderedChildren=o,o||r){var i,a=0,s=0;for(i in o)if(o.hasOwnProperty(i)){var u=r&&r[i],l=o[i];u===l?(this.moveChild(u,s,a),a=Math.max(u._mountIndex,a),u._mountIndex=s):(u&&(a=Math.max(u._mountIndex,a),this._unmountChildByName(u,i)),this._mountChildByNameAtIndex(l,i,s,t,n)),s++}for(i in r)!r.hasOwnProperty(i)||o&&o.hasOwnProperty(i)||this._unmountChildByName(r[i],i)}},unmountChildren:function(){var e=this._renderedChildren;f.unmountChildren(e),this._renderedChildren=null},moveChild:function(e,t,n){e._mountIndex<n&&o(this._rootNodeID,e._mountIndex,t)},createChild:function(e,t){r(this._rootNodeID,t,e._mountIndex)},removeChild:function(e){i(this._rootNodeID,e._mountIndex)},setTextContent:function(e){a(this._rootNodeID,e)},_mountChildByNameAtIndex:function(e,t,n,r,o){var i=this._rootNodeID+t,a=p.mountComponent(e,i,r,o);e._mountIndex=n,this.createChild(e,a)},_unmountChildByName:function(e,t){this.removeChild(e),e._mountIndex=null}}};e.exports=m},function(e,t,n){\"use strict\";var r=n(32),o=n(93),i=n(86),a=n(89),s={instantiateChildren:function(e,t,n){var r=o(e);for(var a in r)if(r.hasOwnProperty(a)){var s=r[a],u=i(s,null);r[a]=u}return r},updateChildren:function(e,t,n,s){var u=o(t);if(!u&&!e)return null;var l;for(l in u)if(u.hasOwnProperty(l)){var c=e&&e[l],p=c&&c._currentElement,f=u[l];if(a(p,f))r.receiveComponent(c,f,n,s),u[l]=c;else{c&&r.unmountComponent(c,l);var d=i(f,null);u[l]=d}}for(l in e)!e.hasOwnProperty(l)||u&&u.hasOwnProperty(l)||r.unmountComponent(e[l]);return u},unmountChildren:function(e){for(var t in e){var n=e[t];r.unmountComponent(n)}}};e.exports=s},function(e,t,n){(function(t){\"use strict\";function r(e,n,r){var o=e,i=!o.hasOwnProperty(r);\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?a(i,\"flattenChildren(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.\",r):null),i&&null!=n&&(o[r]=n)}function o(e){if(null==e)return e;var t={};return i(e,r,t),t}var i=n(21),a=n(18);e.exports=o}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return h.createClass({tagName:e.toUpperCase(),render:function(){return new T(e,null,null,null,null,this.props)}})}function o(){if(M.EventEmitter.injectReactEventListener(D),M.EventPluginHub.injectEventPluginOrder(u),M.EventPluginHub.injectInstanceHandle(S),M.EventPluginHub.injectMount(k),M.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:j,EnterLeaveEventPlugin:l,ChangeEventPlugin:a,MobileSafariClickEventPlugin:f,SelectEventPlugin:R,BeforeInputEventPlugin:i}),M.NativeComponent.injectGenericComponentClass(y),M.NativeComponent.injectTextComponentClass(x),M.NativeComponent.injectAutoWrapper(r),M.Class.injectMixin(d),M.NativeComponent.injectComponentClasses({button:g,form:b,iframe:O,img:E,input:N,option:w,select:C,textarea:P,html:V(\"html\"),head:V(\"head\"),body:V(\"body\")}),M.DOMProperty.injectDOMPropertyConfig(p),M.DOMProperty.injectDOMPropertyConfig(L),M.EmptyComponent.injectEmptyComponent(\"noscript\"),M.Updates.injectReconcileTransaction(I),M.Updates.injectBatchingStrategy(m),M.RootIndex.injectCreateReactRootIndex(c.canUseDOM?s.createReactRootIndex:A.createReactRootIndex),M.Component.injectEnvironment(v),M.DOMComponent.injectIDOperations(_),\"production\"!==t.env.NODE_ENV){var e=c.canUseDOM&&window.location.href||\"\";if(/[?&]react_perf\\b/.test(e)){var o=n(153);o.start()}}}var i=n(95),a=n(103),s=n(105),u=n(106),l=n(107),c=n(54),p=n(111),f=n(112),d=n(113),h=n(40),v=n(50),m=n(115),y=n(90),g=n(116),b=n(119),E=n(121),_=n(51),O=n(122),N=n(123),w=n(126),C=n(127),P=n(128),x=n(45),T=n(14),D=n(129),M=n(132),S=n(22),k=n(70),I=n(133),R=n(139),A=n(141),j=n(142),L=n(151),V=n(152);e.exports={inject:o}}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){var e=window.opera;return\"object\"==typeof e&&\"function\"==typeof e.version&&parseInt(e.version(),10)<=12}function o(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function i(e){switch(e){case T.topCompositionStart:return D.compositionStart;case T.topCompositionEnd:return D.compositionEnd;case T.topCompositionUpdate:return D.compositionUpdate}}function a(e,t){return e===T.topKeyDown&&t.keyCode===_}function s(e,t){switch(e){case T.topKeyUp:return E.indexOf(t.keyCode)!==-1;case T.topKeyDown:return t.keyCode!==_;case T.topKeyPress:case T.topMouseDown:case T.topBlur:return!0;default:return!1}}function u(e){var t=e.detail;return\"object\"==typeof t&&\"data\"in t?t.data:null}function l(e,t,n,r){var o,l;if(O?o=i(e):S?s(e,r)&&(o=D.compositionEnd):a(e,r)&&(o=D.compositionStart),!o)return null;C&&(S||o!==D.compositionStart?o===D.compositionEnd&&S&&(l=S.getData()):S=m.getPooled(t));var c=y.getPooled(o,n,r);if(l)c.data=l;else{var p=u(r);null!==p&&(c.data=p)}return h.accumulateTwoPhaseDispatches(c),c}function c(e,t){switch(e){case T.topCompositionEnd:return u(t);case T.topKeyPress:var n=t.which;return n!==P?null:(M=!0,x);case T.topTextInput:var r=t.data;return r===x&&M?null:r;default:return null}}function p(e,t){if(S){if(e===T.topCompositionEnd||s(e,t)){var n=S.getData();return m.release(S),S=null,n}return null}switch(e){case T.topPaste:return null;case T.topKeyPress:return t.which&&!o(t)?String.fromCharCode(t.which):null;case T.topCompositionEnd:return C?null:t.data;default:return null}}function f(e,t,n,r){var o;if(o=w?c(e,r):p(e,r),!o)return null;var i=g.getPooled(D.beforeInput,n,r);return i.data=o,h.accumulateTwoPhaseDispatches(i),i}var d=n(8),h=n(96),v=n(54),m=n(97),y=n(99),g=n(102),b=n(42),E=[9,13,27,32],_=229,O=v.canUseDOM&&\"CompositionEvent\"in window,N=null;v.canUseDOM&&\"documentMode\"in document&&(N=document.documentMode);var w=v.canUseDOM&&\"TextEvent\"in window&&!N&&!r(),C=v.canUseDOM&&(!O||N&&N>8&&N<=11),P=32,x=String.fromCharCode(P),T=d.topLevelTypes,D={beforeInput:{phasedRegistrationNames:{bubbled:b({onBeforeInput:null}),captured:b({onBeforeInputCapture:null})},dependencies:[T.topCompositionEnd,T.topKeyPress,T.topTextInput,T.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:b({onCompositionEnd:null}),captured:b({onCompositionEndCapture:null})},dependencies:[T.topBlur,T.topCompositionEnd,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:b({onCompositionStart:null}),captured:b({onCompositionStartCapture:null})},dependencies:[T.topBlur,T.topCompositionStart,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:b({onCompositionUpdate:null}),captured:b({onCompositionUpdateCapture:null})},dependencies:[T.topBlur,T.topCompositionUpdate,T.topKeyDown,T.topKeyPress,T.topKeyUp,T.topMouseDown]}},M=!1,S=null,k={eventTypes:D,extractEvents:function(e,t,n,r){return[l(e,t,n,r),f(e,t,n,r)]}};e.exports=k},function(e,t,n){(function(t){\"use strict\";function r(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return m(e,r)}function o(e,n,o){if(\"production\"!==t.env.NODE_ENV&&!e)throw new Error(\"Dispatching id must not be null\");var i=n?v.bubbled:v.captured,a=r(e,o,i);a&&(o._dispatchListeners=d(o._dispatchListeners,a),o._dispatchIDs=d(o._dispatchIDs,e))}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&f.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker,o,e)}function a(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=m(e,r);o&&(n._dispatchListeners=d(n._dispatchListeners,o),n._dispatchIDs=d(n._dispatchIDs,e))}}function s(e){e&&e.dispatchConfig.registrationName&&a(e.dispatchMarker,null,e)}function u(e){h(e,i)}function l(e,t,n,r){f.injection.getInstanceHandle().traverseEnterLeave(n,r,a,e,t)}function c(e){h(e,s)}var p=n(8),f=n(72),d=n(74),h=n(75),v=p.PropagationPhases,m=f.getListener,y={accumulateTwoPhaseDispatches:u,accumulateDirectDispatches:c,accumulateEnterLeaveDispatches:l};e.exports=y}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var o=n(12),i=n(16),a=n(98);i(r.prototype,{getText:function(){return\"value\"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=o.slice(e,s),this._fallbackText}}),o.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(){return!i&&o.canUseDOM&&(i=\"textContent\"in document.documentElement?\"textContent\":\"innerText\"),i}var o=n(54),i=null;e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i={data:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){this.dispatchConfig=e,this.dispatchMarker=t,this.nativeEvent=n;var r=this.constructor.Interface;for(var o in r)if(r.hasOwnProperty(o)){var i=r[o];i?this[o]=i(n):this[o]=n[o]}var s=null!=n.defaultPrevented?n.defaultPrevented:n.returnValue===!1;\ns?this.isDefaultPrevented=a.thatReturnsTrue:this.isDefaultPrevented=a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse}var o=n(12),i=n(16),a=n(19),s=n(101),u={type:null,target:s,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};i(r.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e.preventDefault?e.preventDefault():e.returnValue=!1,this.isDefaultPrevented=a.thatReturnsTrue},stopPropagation:function(){var e=this.nativeEvent;e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this.isPropagationStopped=a.thatReturnsTrue},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;this.dispatchConfig=null,this.dispatchMarker=null,this.nativeEvent=null}}),r.Interface=u,r.augmentClass=function(e,t){var n=this,r=Object.create(n.prototype);i(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=i({},n.Interface,t),e.augmentClass=n.augmentClass,o.addPoolingTo(e,o.threeArgumentPooler)},o.addPoolingTo(r,o.threeArgumentPooler),e.exports=r},function(e,t){\"use strict\";function n(e){var t=e.target||e.srcElement||window;return 3===t.nodeType?t.parentNode:t}e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i={data:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e){return\"SELECT\"===e.nodeName||\"INPUT\"===e.nodeName&&\"file\"===e.type}function o(e){var t=N.getPooled(T.change,M,e);E.accumulateTwoPhaseDispatches(t),O.batchedUpdates(i,t)}function i(e){b.enqueueEvents(e),b.processEventQueue()}function a(e,t){D=e,M=t,D.attachEvent(\"onchange\",o)}function s(){D&&(D.detachEvent(\"onchange\",o),D=null,M=null)}function u(e,t,n){if(e===x.topChange)return n}function l(e,t,n){e===x.topFocus?(s(),a(t,n)):e===x.topBlur&&s()}function c(e,t){D=e,M=t,S=e.value,k=Object.getOwnPropertyDescriptor(e.constructor.prototype,\"value\"),Object.defineProperty(D,\"value\",A),D.attachEvent(\"onpropertychange\",f)}function p(){D&&(delete D.value,D.detachEvent(\"onpropertychange\",f),D=null,M=null,S=null,k=null)}function f(e){if(\"value\"===e.propertyName){var t=e.srcElement.value;t!==S&&(S=t,o(e))}}function d(e,t,n){if(e===x.topInput)return n}function h(e,t,n){e===x.topFocus?(p(),c(t,n)):e===x.topBlur&&p()}function v(e,t,n){if((e===x.topSelectionChange||e===x.topKeyUp||e===x.topKeyDown)&&D&&D.value!==S)return S=D.value,M}function m(e){return\"INPUT\"===e.nodeName&&(\"checkbox\"===e.type||\"radio\"===e.type)}function y(e,t,n){if(e===x.topClick)return n}var g=n(8),b=n(72),E=n(96),_=n(54),O=n(29),N=n(100),w=n(78),C=n(104),P=n(42),x=g.topLevelTypes,T={change:{phasedRegistrationNames:{bubbled:P({onChange:null}),captured:P({onChangeCapture:null})},dependencies:[x.topBlur,x.topChange,x.topClick,x.topFocus,x.topInput,x.topKeyDown,x.topKeyUp,x.topSelectionChange]}},D=null,M=null,S=null,k=null,I=!1;_.canUseDOM&&(I=w(\"change\")&&(!(\"documentMode\"in document)||document.documentMode>8));var R=!1;_.canUseDOM&&(R=w(\"input\")&&(!(\"documentMode\"in document)||document.documentMode>9));var A={get:function(){return k.get.call(this)},set:function(e){S=\"\"+e,k.set.call(this,e)}},j={eventTypes:T,extractEvents:function(e,t,n,o){var i,a;if(r(t)?I?i=u:a=l:C(t)?R?i=d:(i=v,a=h):m(t)&&(i=y),i){var s=i(e,t,n);if(s){var c=N.getPooled(T.change,s,o);return E.accumulateTwoPhaseDispatches(c),c}}a&&a(e,t,n)}};e.exports=j},function(e,t){\"use strict\";function n(e){return e&&(\"INPUT\"===e.nodeName&&r[e.type]||\"TEXTAREA\"===e.nodeName)}var r={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};e.exports=n},function(e,t){\"use strict\";var n=0,r={createReactRootIndex:function(){return n++}};e.exports=r},function(e,t,n){\"use strict\";var r=n(42),o=[r({ResponderEventPlugin:null}),r({SimpleEventPlugin:null}),r({TapEventPlugin:null}),r({EnterLeaveEventPlugin:null}),r({ChangeEventPlugin:null}),r({SelectEventPlugin:null}),r({BeforeInputEventPlugin:null}),r({AnalyticsEventPlugin:null}),r({MobileSafariClickEventPlugin:null})];e.exports=o},function(e,t,n){\"use strict\";var r=n(8),o=n(96),i=n(108),a=n(70),s=n(42),u=r.topLevelTypes,l=a.getFirstReactDOM,c={mouseEnter:{registrationName:s({onMouseEnter:null}),dependencies:[u.topMouseOut,u.topMouseOver]},mouseLeave:{registrationName:s({onMouseLeave:null}),dependencies:[u.topMouseOut,u.topMouseOver]}},p=[null,null],f={eventTypes:c,extractEvents:function(e,t,n,r){if(e===u.topMouseOver&&(r.relatedTarget||r.fromElement))return null;if(e!==u.topMouseOut&&e!==u.topMouseOver)return null;var s;if(t.window===t)s=t;else{var f=t.ownerDocument;s=f?f.defaultView||f.parentWindow:window}var d,h;if(e===u.topMouseOut?(d=t,h=l(r.relatedTarget||r.toElement)||s):(d=s,h=t),d===h)return null;var v=d?a.getID(d):\"\",m=h?a.getID(h):\"\",y=i.getPooled(c.mouseLeave,v,r);y.type=\"mouseleave\",y.target=d,y.relatedTarget=h;var g=i.getPooled(c.mouseEnter,m,r);return g.type=\"mouseenter\",g.target=h,g.relatedTarget=d,o.accumulateEnterLeaveDispatches(y,g,v,m),p[0]=y,p[1]=g,p}};e.exports=f},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i=n(77),a=n(110),s={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:a,button:function(e){var t=e.button;return\"which\"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return\"pageX\"in e?e.pageX:e.clientX+i.currentScrollLeft},pageY:function(e){return\"pageY\"in e?e.pageY:e.clientY+i.currentScrollTop}};o.augmentClass(r,s),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i=n(101),a={view:function(e){if(e.view)return e.view;var t=i(e);if(null!=t&&t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};o.augmentClass(r,a),e.exports=r},function(e,t){\"use strict\";function n(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=o[e];return!!r&&!!n[r]}function r(e){return n}var o={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};e.exports=r},function(e,t,n){\"use strict\";var r,o=n(47),i=n(54),a=o.injection.MUST_USE_ATTRIBUTE,s=o.injection.MUST_USE_PROPERTY,u=o.injection.HAS_BOOLEAN_VALUE,l=o.injection.HAS_SIDE_EFFECTS,c=o.injection.HAS_NUMERIC_VALUE,p=o.injection.HAS_POSITIVE_NUMERIC_VALUE,f=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(i.canUseDOM){var d=document.implementation;r=d&&d.hasFeature&&d.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\",\"1.1\")}var h={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\\d_.\\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:a|u,allowTransparency:a,alt:null,async:u,autoComplete:null,autoPlay:u,cellPadding:null,cellSpacing:null,charSet:a,checked:s|u,classID:a,className:r?a:s,cols:a|p,colSpan:null,content:null,contentEditable:null,contextMenu:a,controls:s|u,coords:null,crossOrigin:null,data:null,dateTime:a,defer:u,dir:null,disabled:a|u,download:f,draggable:null,encType:null,form:a,formAction:a,formEncType:a,formMethod:a,formNoValidate:u,formTarget:a,frameBorder:a,headers:null,height:a,hidden:a|u,high:null,href:null,hrefLang:null,htmlFor:null,httpEquiv:null,icon:null,id:s,label:null,lang:null,list:a,loop:s|u,low:null,manifest:a,marginHeight:null,marginWidth:null,max:null,maxLength:a,media:a,mediaGroup:null,method:null,min:null,multiple:s|u,muted:s|u,name:null,noValidate:u,open:u,optimum:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:s|u,rel:null,required:u,role:a,rows:a|p,rowSpan:null,sandbox:null,scope:null,scoped:u,scrolling:null,seamless:a|u,selected:s|u,shape:null,size:a|p,sizes:a,span:p,spellCheck:null,src:null,srcDoc:s,srcSet:a,start:c,step:null,style:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:s|l,width:a,wmode:a,autoCapitalize:null,autoCorrect:null,itemProp:a,itemScope:a|u,itemType:a,itemID:a,itemRef:a,property:null,unselectable:a},DOMAttributeNames:{acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},DOMPropertyNames:{autoCapitalize:\"autocapitalize\",autoComplete:\"autocomplete\",autoCorrect:\"autocorrect\",autoFocus:\"autofocus\",autoPlay:\"autoplay\",encType:\"encoding\",hrefLang:\"hreflang\",radioGroup:\"radiogroup\",spellCheck:\"spellcheck\",srcDoc:\"srcdoc\",srcSet:\"srcset\"}};e.exports=h},function(e,t,n){\"use strict\";var r=n(8),o=n(19),i=r.topLevelTypes,a={eventTypes:null,extractEvents:function(e,t,n,r){if(e===i.topTouchStart){var a=r.target;a&&!a.onclick&&(a.onclick=o)}}};e.exports=a},function(e,t,n){\"use strict\";var r=n(114),o={getDOMNode:function(){return r(this)}};e.exports=o},function(e,t,n){(function(t){\"use strict\";function r(e){if(\"production\"!==t.env.NODE_ENV){var n=o.current;null!==n&&(\"production\"!==t.env.NODE_ENV?l(n._warnedAboutRefsInRender,\"%s is accessing getDOMNode or findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.\",n.getName()||\"A component\"):null,n._warnedAboutRefsInRender=!0)}return null==e?null:u(e)?e:i.has(e)?a.getNodeFromInstance(e):(\"production\"!==t.env.NODE_ENV?s(null==e.render||\"function\"!=typeof e.render,\"Component (with keys: %s) contains `render` method but is not mounted in the DOM\",Object.keys(e)):s(null==e.render||\"function\"!=typeof e.render),void(\"production\"!==t.env.NODE_ENV?s(!1,\"Element appears to be neither ReactComponent nor DOMNode (keys: %s)\",Object.keys(e)):s(!1)))}var o=n(20),i=n(28),a=n(70),s=n(10),u=n(84),l=n(18);e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){this.reinitializeTransaction()}var o=n(29),i=n(39),a=n(16),s=n(19),u={initialize:s,close:function(){f.isBatchingUpdates=!1}},l={initialize:s,close:o.flushBatchedUpdates.bind(o)},c=[l,u];a(r.prototype,i.Mixin,{getTransactionWrappers:function(){return c}});var p=new r,f={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o){var i=f.isBatchingUpdates;f.isBatchingUpdates=!0,i?e(t,n,r,o):p.perform(e,null,t,n,r,o)}};e.exports=f},function(e,t,n){\"use strict\";var r=n(117),o=n(113),i=n(40),a=n(14),s=n(9),u=a.createFactory(\"button\"),l=s({onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0}),c=i.createClass({displayName:\"ReactDOMButton\",tagName:\"BUTTON\",mixins:[r,o],render:function(){var e={};for(var t in this.props)!this.props.hasOwnProperty(t)||this.props.disabled&&l[t]||(e[t]=this.props[t]);return u(e,this.props.children)}});e.exports=c},function(e,t,n){\"use strict\";var r=n(118),o={componentDidMount:function(){this.props.autoFocus&&r(this.getDOMNode())}};e.exports=o},function(e,t){\"use strict\";function n(e){try{e.focus()}catch(e){}}e.exports=n},function(e,t,n){\"use strict\";var r=n(8),o=n(120),i=n(113),a=n(40),s=n(14),u=s.createFactory(\"form\"),l=a.createClass({displayName:\"ReactDOMForm\",tagName:\"FORM\",mixins:[i,o],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topReset,\"reset\"),this.trapBubbledEvent(r.topLevelTypes.topSubmit,\"submit\")}});e.exports=l},function(e,t,n){(function(t){\"use strict\";function r(e){e.remove()}var o=n(71),i=n(74),a=n(75),s=n(10),u={trapBubbledEvent:function(e,n){\"production\"!==t.env.NODE_ENV?s(this.isMounted(),\"Must be mounted to trap events\"):s(this.isMounted());var r=this.getDOMNode();\"production\"!==t.env.NODE_ENV?s(r,\"LocalEventTrapMixin.trapBubbledEvent(...): Requires node to be rendered.\"):s(r);var a=o.trapBubbledEvent(e,n,r);this._localEventListeners=i(this._localEventListeners,a)},componentWillUnmount:function(){this._localEventListeners&&a(this._localEventListeners,r)}};e.exports=u}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(8),o=n(120),i=n(113),a=n(40),s=n(14),u=s.createFactory(\"img\"),l=a.createClass({displayName:\"ReactDOMImg\",tagName:\"IMG\",mixins:[i,o],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topLoad,\"load\"),this.trapBubbledEvent(r.topLevelTypes.topError,\"error\")}});e.exports=l},function(e,t,n){\"use strict\";var r=n(8),o=n(120),i=n(113),a=n(40),s=n(14),u=s.createFactory(\"iframe\"),l=a.createClass({displayName:\"ReactDOMIframe\",tagName:\"IFRAME\",mixins:[i,o],render:function(){return u(this.props)},componentDidMount:function(){this.trapBubbledEvent(r.topLevelTypes.topLoad,\"load\")}});e.exports=l},function(e,t,n){(function(t){\"use strict\";function r(){this.isMounted()&&this.forceUpdate()}var o=n(117),i=n(46),a=n(124),s=n(113),u=n(40),l=n(14),c=n(70),p=n(29),f=n(16),d=n(10),h=l.createFactory(\"input\"),v={},m=u.createClass({displayName:\"ReactDOMInput\",tagName:\"INPUT\",mixins:[o,a.Mixin,s],getInitialState:function(){var e=this.props.defaultValue;return{initialChecked:this.props.defaultChecked||!1,initialValue:null!=e?e:null}},render:function(){var e=f({},this.props);e.defaultChecked=null,e.defaultValue=null;var t=a.getValue(this);e.value=null!=t?t:this.state.initialValue;var n=a.getChecked(this);return e.checked=null!=n?n:this.state.initialChecked,e.onChange=this._handleChange,h(e,this.props.children)},componentDidMount:function(){var e=c.getID(this.getDOMNode());v[e]=this},componentWillUnmount:function(){var e=this.getDOMNode(),t=c.getID(e);delete v[t]},componentDidUpdate:function(e,t,n){var r=this.getDOMNode();null!=this.props.checked&&i.setValueForProperty(r,\"checked\",this.props.checked||!1);var o=a.getValue(this);null!=o&&i.setValueForProperty(r,\"value\",\"\"+o)},_handleChange:function(e){var n,o=a.getOnChange(this);o&&(n=o.call(this,e)),p.asap(r,this);var i=this.props.name;if(\"radio\"===this.props.type&&null!=i){for(var s=this.getDOMNode(),u=s;u.parentNode;)u=u.parentNode;for(var l=u.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+i)+'][type=\"radio\"]'),f=0,h=l.length;f<h;f++){var m=l[f];if(m!==s&&m.form===s.form){var y=c.getID(m);\"production\"!==t.env.NODE_ENV?d(y,\"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\"):d(y);var g=v[y];\"production\"!==t.env.NODE_ENV?d(g,\"ReactDOMInput: Unknown radio button ID %s.\",y):d(g),p.asap(r,g)}}}return n}});e.exports=m}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){\"production\"!==t.env.NODE_ENV?l(null==e.props.checkedLink||null==e.props.valueLink,\"Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa.\"):l(null==e.props.checkedLink||null==e.props.valueLink)}function o(e){r(e),\"production\"!==t.env.NODE_ENV?l(null==e.props.value&&null==e.props.onChange,\"Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink.\"):l(null==e.props.value&&null==e.props.onChange)}function i(e){r(e),\"production\"!==t.env.NODE_ENV?l(null==e.props.checked&&null==e.props.onChange,\"Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink\"):l(null==e.props.checked&&null==e.props.onChange)}function a(e){this.props.valueLink.requestChange(e.target.value)}function s(e){this.props.checkedLink.requestChange(e.target.checked)}var u=n(125),l=n(10),c={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},p={Mixin:{propTypes:{value:function(e,t,n){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.\")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error(\"You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.\")},onChange:u.func}},getValue:function(e){return e.props.valueLink?(o(e),e.props.valueLink.value):e.props.value},getChecked:function(e){return e.props.checkedLink?(i(e),e.props.checkedLink.value):e.props.checked},getOnChange:function(e){return e.props.valueLink?(o(e),a):e.props.checkedLink?(i(e),s):e.props.onChange}};e.exports=p}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){function t(t,n,r,o,i){if(o=o||_,null==n[r]){var a=b[i];return t?new Error(\"Required \"+a+\" `\"+r+\"` was not specified in \"+(\"`\"+o+\"`.\")):null}return e(n,r,o,i)}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function o(e){function t(t,n,r,o){var i=t[n],a=v(i);if(a!==e){var s=b[o],u=m(i);return new Error(\"Invalid \"+s+\" `\"+n+\"` of type `\"+u+\"` \"+(\"supplied to `\"+r+\"`, expected `\"+e+\"`.\"))}return null}return r(t)}function i(){return r(E.thatReturns(null))}function a(e){function t(t,n,r,o){var i=t[n];if(!Array.isArray(i)){var a=b[o],s=v(i);return new Error(\"Invalid \"+a+\" `\"+n+\"` of type \"+(\"`\"+s+\"` supplied to `\"+r+\"`, expected an array.\"))}for(var u=0;u<i.length;u++){var l=e(i,u,r,o);if(l instanceof Error)return l}return null}return r(t)}function s(){function e(e,t,n,r){if(!y.isValidElement(e[t])){var o=b[r];return new Error(\"Invalid \"+o+\" `\"+t+\"` supplied to \"+(\"`\"+n+\"`, expected a ReactElement.\"))}return null}return r(e)}function u(e){function t(t,n,r,o){if(!(t[n]instanceof e)){var i=b[o],a=e.name||_;return new Error(\"Invalid \"+i+\" `\"+n+\"` supplied to \"+(\"`\"+r+\"`, expected instance of `\"+a+\"`.\"))}return null}return r(t)}function l(e){function t(t,n,r,o){for(var i=t[n],a=0;a<e.length;a++)if(i===e[a])return null;var s=b[o],u=JSON.stringify(e);return new Error(\"Invalid \"+s+\" `\"+n+\"` of value `\"+i+\"` \"+(\"supplied to `\"+r+\"`, expected one of \"+u+\".\"))}return r(t)}function c(e){function t(t,n,r,o){var i=t[n],a=v(i);if(\"object\"!==a){var s=b[o];return new Error(\"Invalid \"+s+\" `\"+n+\"` of type \"+(\"`\"+a+\"` supplied to `\"+r+\"`, expected an object.\"))}for(var u in i)if(i.hasOwnProperty(u)){var l=e(i,u,r,o);if(l instanceof Error)return l}return null}return r(t)}function p(e){function t(t,n,r,o){for(var i=0;i<e.length;i++){var a=e[i];if(null==a(t,n,r,o))return null}var s=b[o];return new Error(\"Invalid \"+s+\" `\"+n+\"` supplied to \"+(\"`\"+r+\"`.\"))}return r(t)}function f(){function e(e,t,n,r){if(!h(e[t])){var o=b[r];return new Error(\"Invalid \"+o+\" `\"+t+\"` supplied to \"+(\"`\"+n+\"`, expected a ReactNode.\"))}return null}return r(e)}function d(e){function t(t,n,r,o){var i=t[n],a=v(i);if(\"object\"!==a){var s=b[o];return new Error(\"Invalid \"+s+\" `\"+n+\"` of type `\"+a+\"` \"+(\"supplied to `\"+r+\"`, expected `object`.\"))}for(var u in e){var l=e[u];if(l){var c=l(i,u,r,o);if(c)return c}}return null}return r(t)}function h(e){switch(typeof e){case\"number\":case\"string\":case\"undefined\":return!0;case\"boolean\":return!e;case\"object\":if(Array.isArray(e))return e.every(h);if(null===e||y.isValidElement(e))return!0;e=g.extractIfFragment(e);for(var t in e)if(!h(e[t]))return!1;return!0;default:return!1}}function v(e){var t=typeof e;return Array.isArray(e)?\"array\":e instanceof RegExp?\"object\":t}function m(e){var t=v(e);if(\"object\"===t){if(e instanceof Date)return\"date\";if(e instanceof RegExp)return\"regexp\"}return t}var y=n(14),g=n(13),b=n(37),E=n(19),_=\"<<anonymous>>\",O=s(),N=f(),w={array:o(\"array\"),bool:o(\"boolean\"),func:o(\"function\"),number:o(\"number\"),object:o(\"object\"),string:o(\"string\"),any:i(),arrayOf:a,element:O,instanceOf:u,node:N,objectOf:c,oneOf:l,oneOfType:p,shape:d};e.exports=w},function(e,t,n){(function(t){\"use strict\";var r=n(113),o=n(40),i=n(14),a=n(18),s=i.createFactory(\"option\"),u=o.createClass({displayName:\"ReactDOMOption\",tagName:\"OPTION\",mixins:[r],componentWillMount:function(){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?a(null==this.props.selected,\"Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>.\"):null)},render:function(){return s(this.props,this.props.children)}});e.exports=u}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){if(this._pendingUpdate){this._pendingUpdate=!1;var e=s.getValue(this);null!=e&&this.isMounted()&&i(this,e)}}function o(e,t,n){if(null==e[t])return null;if(e.multiple){if(!Array.isArray(e[t]))return new Error(\"The `\"+t+\"` prop supplied to <select> must be an array if `multiple` is true.\")}else if(Array.isArray(e[t]))return new Error(\"The `\"+t+\"` prop supplied to <select> must be a scalar value if `multiple` is false.\")}function i(e,t){var n,r,o,i=e.getDOMNode().options;if(e.props.multiple){for(n={},r=0,o=t.length;r<o;r++)n[\"\"+t[r]]=!0;for(r=0,o=i.length;r<o;r++){var a=n.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(n=\"\"+t,r=0,o=i.length;r<o;r++)if(i[r].value===n)return void(i[r].selected=!0);i.length&&(i[0].selected=!0)}}var a=n(117),s=n(124),u=n(113),l=n(40),c=n(14),p=n(29),f=n(16),d=c.createFactory(\"select\"),h=l.createClass({displayName:\"ReactDOMSelect\",tagName:\"SELECT\",mixins:[a,s.Mixin,u],propTypes:{defaultValue:o,value:o},render:function(){var e=f({},this.props);return e.onChange=this._handleChange,e.value=null,d(e,this.props.children)},componentWillMount:function(){this._pendingUpdate=!1},componentDidMount:function(){var e=s.getValue(this);null!=e?i(this,e):null!=this.props.defaultValue&&i(this,this.props.defaultValue)},componentDidUpdate:function(e){var t=s.getValue(this);null!=t?(this._pendingUpdate=!1,i(this,t)):!e.multiple!=!this.props.multiple&&(null!=this.props.defaultValue?i(this,this.props.defaultValue):i(this,this.props.multiple?[]:\"\"))},_handleChange:function(e){var t,n=s.getOnChange(this);return n&&(t=n.call(this,e)),this._pendingUpdate=!0,p.asap(r,this),t}});e.exports=h},function(e,t,n){(function(t){\"use strict\";function r(){this.isMounted()&&this.forceUpdate()}var o=n(117),i=n(46),a=n(124),s=n(113),u=n(40),l=n(14),c=n(29),p=n(16),f=n(10),d=n(18),h=l.createFactory(\"textarea\"),v=u.createClass({displayName:\"ReactDOMTextarea\",tagName:\"TEXTAREA\",mixins:[o,a.Mixin,s],getInitialState:function(){var e=this.props.defaultValue,n=this.props.children;null!=n&&(\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?d(!1,\"Use the `defaultValue` or `value` props instead of setting children on <textarea>.\"):null),\"production\"!==t.env.NODE_ENV?f(null==e,\"If you supply `defaultValue` on a <textarea>, do not pass children.\"):f(null==e),Array.isArray(n)&&(\"production\"!==t.env.NODE_ENV?f(n.length<=1,\"<textarea> can only have at most one child.\"):f(n.length<=1),n=n[0]),e=\"\"+n),null==e&&(e=\"\");var r=a.getValue(this);return{initialValue:\"\"+(null!=r?r:e)}},render:function(){var e=p({},this.props);return\"production\"!==t.env.NODE_ENV?f(null==e.dangerouslySetInnerHTML,\"`dangerouslySetInnerHTML` does not make sense on <textarea>.\"):f(null==e.dangerouslySetInnerHTML),e.defaultValue=null,e.value=null,e.onChange=this._handleChange,h(e,this.state.initialValue)},componentDidUpdate:function(e,t,n){var r=a.getValue(this);if(null!=r){var o=this.getDOMNode();i.setValueForProperty(o,\"value\",\"\"+r)}},_handleChange:function(e){var t,n=a.getOnChange(this);return n&&(t=n.call(this,e)),c.asap(r,this),t}});e.exports=v}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){var t=p.getID(e),n=c.getReactRootIDFromNodeID(t),r=p.findReactContainerForID(n),o=p.getFirstReactDOM(r);return o}function o(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function i(e){for(var t=p.getFirstReactDOM(h(e.nativeEvent))||window,n=t;n;)e.ancestors.push(n),n=r(n);for(var o=0,i=e.ancestors.length;o<i;o++){t=e.ancestors[o];var a=p.getID(t)||\"\";m._handleTopLevel(e.topLevelType,t,a,e.nativeEvent)}}function a(e){var t=v(window);e(t)}var s=n(130),u=n(54),l=n(12),c=n(22),p=n(70),f=n(29),d=n(16),h=n(101),v=n(131);d(o.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(o,l.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:u.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?s.listen(r,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){var r=n;return r?s.capture(r,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);s.listen(window,\"scroll\",t)},dispatchEvent:function(e,t){if(m._enabled){var n=o.getPooled(e,t);try{f.batchedUpdates(i,n)}finally{o.release(n)}}}};e.exports=m},function(e,t,n){(function(t){var r=n(19),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0},capture:function(e,n,o){return e.addEventListener?(e.addEventListener(n,o,!0),{remove:function(){e.removeEventListener(n,o,!0)}}):(\"production\"!==t.env.NODE_ENV&&console.error(\"Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events.\"),{remove:r})},registerDefault:function(){}};e.exports=o}).call(t,n(6))},function(e,t){\"use strict\";function n(e){return e===window?{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}e.exports=n},function(e,t,n){\"use strict\";var r=n(47),o=n(72),i=n(88),a=n(40),s=n(79),u=n(71),l=n(38),c=n(90),p=n(31),f=n(23),d=n(29),h={Component:i.injection,Class:a.injection,DOMComponent:c.injection,DOMProperty:r.injection,EmptyComponent:s.injection,EventPluginHub:o.injection,EventEmitter:u.injection,NativeComponent:l.injection,Perf:p.injection,RootIndex:f.injection,Updates:d.injection};e.exports=h},function(e,t,n){\"use strict\";function r(){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=o.getPooled(null),this.putListenerQueue=u.getPooled()}var o=n(30),i=n(12),a=n(71),s=n(134),u=n(138),l=n(39),c=n(16),p={initialize:s.getSelectionInformation,close:s.restoreSelection},f={initialize:function(){var e=a.isEnabled();return a.setEnabled(!1),e},close:function(e){a.setEnabled(e)}},d={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},h={initialize:function(){this.putListenerQueue.reset()},close:function(){this.putListenerQueue.putListeners()}},v=[h,p,f,d],m={getTransactionWrappers:function(){return v},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){o.release(this.reactMountReady),this.reactMountReady=null,u.release(this.putListenerQueue),this.putListenerQueue=null}};c(r.prototype,l.Mixin,m),i.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(e){return i(document.documentElement,e)}var o=n(135),i=n(82),a=n(118),s=n(137),u={hasSelectionCapabilities:function(e){return e&&(\"INPUT\"===e.nodeName&&\"text\"===e.type||\"TEXTAREA\"===e.nodeName||\"true\"===e.contentEditable)},getSelectionInformation:function(){var e=s();return{focusedElem:e,selectionRange:u.hasSelectionCapabilities(e)?u.getSelection(e):null}},restoreSelection:function(e){var t=s(),n=e.focusedElem,o=e.selectionRange;t!==n&&r(n)&&(u.hasSelectionCapabilities(n)&&u.setSelection(n,o),a(n))},getSelection:function(e){var t;if(\"selectionStart\"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&\"INPUT\"===e.nodeName){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart(\"character\",-e.value.length),end:-n.moveEnd(\"character\",-e.value.length)})}else t=o.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if(\"undefined\"==typeof r&&(r=n),\"selectionStart\"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length);else if(document.selection&&\"INPUT\"===e.nodeName){var i=e.createTextRange();i.collapse(!0),i.moveStart(\"character\",n),i.moveEnd(\"character\",r-n),i.select()}else o.setOffsets(e,t)}};e.exports=u},function(e,t,n){\"use strict\";function r(e,t,n,r){return e===n&&t===r}function o(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint(\"EndToStart\",n);var i=o.text.length,a=i+r;return{start:i,end:a}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,i=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0),u=r(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),l=u?0:s.toString().length,c=s.cloneRange();c.selectNodeContents(e),c.setEnd(s.startContainer,s.startOffset);var p=r(c.startContainer,c.startOffset,c.endContainer,c.endOffset),f=p?0:c.toString().length,d=f+l,h=document.createRange();h.setStart(n,o),h.setEnd(i,a);var v=h.collapsed;return{start:v?d:f,end:v?f:d}}function a(e,t){var n,r,o=document.selection.createRange().duplicate();\"undefined\"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart(\"character\",n),o.setEndPoint(\"EndToStart\",o),o.moveEnd(\"character\",r-n),o.select()}function s(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),i=\"undefined\"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>i){var a=i;i=o,o=a}var s=l(e,o),u=l(e,i);if(s&&u){var p=document.createRange();p.setStart(s.node,s.offset),n.removeAllRanges(),o>i?(n.addRange(p),n.extend(u.node,u.offset)):(p.setEnd(u.node,u.offset),n.addRange(p))}}}var u=n(54),l=n(136),c=n(98),p=u.canUseDOM&&\"selection\"in document&&!(\"getSelection\"in window),f={getOffsets:p?o:i,setOffsets:p?a:s};e.exports=f},function(e,t){\"use strict\";function n(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function o(e,t){for(var o=n(e),i=0,a=0;o;){if(3===o.nodeType){if(a=i+o.textContent.length,i<=t&&a>=t)return{node:o,offset:t-i};i=a}o=n(r(o))}}e.exports=o},function(e,t){function n(){try{return document.activeElement||document.body}catch(e){return document.body}}e.exports=n},function(e,t,n){\"use strict\";function r(){this.listenersToPut=[]}var o=n(12),i=n(71),a=n(16);a(r.prototype,{enqueuePutListener:function(e,t,n){this.listenersToPut.push({rootNodeID:e,propKey:t,propValue:n})},putListeners:function(){for(var e=0;e<this.listenersToPut.length;e++){var t=this.listenersToPut[e];i.putListener(t.rootNodeID,t.propKey,t.propValue)}},reset:function(){this.listenersToPut.length=0},destructor:function(){this.reset()}}),o.addPoolingTo(r),e.exports=r},function(e,t,n){\"use strict\";function r(e){if(\"selectionStart\"in e&&s.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function o(e){if(g||null==v||v!==l())return null;var t=r(v);if(!y||!f(y,t)){y=t;var n=u.getPooled(h.select,m,e);return n.type=\"select\",n.target=v,a.accumulateTwoPhaseDispatches(n),n}}var i=n(8),a=n(96),s=n(134),u=n(100),l=n(137),c=n(104),p=n(42),f=n(140),d=i.topLevelTypes,h={select:{phasedRegistrationNames:{bubbled:p({onSelect:null}),captured:p({onSelectCapture:null})},dependencies:[d.topBlur,d.topContextMenu,d.topFocus,d.topKeyDown,d.topMouseDown,d.topMouseUp,d.topSelectionChange]}},v=null,m=null,y=null,g=!1,b={eventTypes:h,extractEvents:function(e,t,n,r){switch(e){\ncase d.topFocus:(c(t)||\"true\"===t.contentEditable)&&(v=t,m=n,y=null);break;case d.topBlur:v=null,m=null,y=null;break;case d.topMouseDown:g=!0;break;case d.topContextMenu:case d.topMouseUp:return g=!1,o(r);case d.topSelectionChange:case d.topKeyDown:case d.topKeyUp:return o(r)}}};e.exports=b},function(e,t){\"use strict\";function n(e,t){if(e===t)return!0;var n;for(n in e)if(e.hasOwnProperty(n)&&(!t.hasOwnProperty(n)||e[n]!==t[n]))return!1;for(n in t)if(t.hasOwnProperty(n)&&!e.hasOwnProperty(n))return!1;return!0}e.exports=n},function(e,t){\"use strict\";var n=Math.pow(2,53),r={createReactRootIndex:function(){return Math.ceil(Math.random()*n)}};e.exports=r},function(e,t,n){(function(t){\"use strict\";var r=n(8),o=n(7),i=n(96),a=n(143),s=n(100),u=n(144),l=n(145),c=n(108),p=n(148),f=n(149),d=n(109),h=n(150),v=n(146),m=n(10),y=n(42),g=n(18),b=r.topLevelTypes,E={blur:{phasedRegistrationNames:{bubbled:y({onBlur:!0}),captured:y({onBlurCapture:!0})}},click:{phasedRegistrationNames:{bubbled:y({onClick:!0}),captured:y({onClickCapture:!0})}},contextMenu:{phasedRegistrationNames:{bubbled:y({onContextMenu:!0}),captured:y({onContextMenuCapture:!0})}},copy:{phasedRegistrationNames:{bubbled:y({onCopy:!0}),captured:y({onCopyCapture:!0})}},cut:{phasedRegistrationNames:{bubbled:y({onCut:!0}),captured:y({onCutCapture:!0})}},doubleClick:{phasedRegistrationNames:{bubbled:y({onDoubleClick:!0}),captured:y({onDoubleClickCapture:!0})}},drag:{phasedRegistrationNames:{bubbled:y({onDrag:!0}),captured:y({onDragCapture:!0})}},dragEnd:{phasedRegistrationNames:{bubbled:y({onDragEnd:!0}),captured:y({onDragEndCapture:!0})}},dragEnter:{phasedRegistrationNames:{bubbled:y({onDragEnter:!0}),captured:y({onDragEnterCapture:!0})}},dragExit:{phasedRegistrationNames:{bubbled:y({onDragExit:!0}),captured:y({onDragExitCapture:!0})}},dragLeave:{phasedRegistrationNames:{bubbled:y({onDragLeave:!0}),captured:y({onDragLeaveCapture:!0})}},dragOver:{phasedRegistrationNames:{bubbled:y({onDragOver:!0}),captured:y({onDragOverCapture:!0})}},dragStart:{phasedRegistrationNames:{bubbled:y({onDragStart:!0}),captured:y({onDragStartCapture:!0})}},drop:{phasedRegistrationNames:{bubbled:y({onDrop:!0}),captured:y({onDropCapture:!0})}},focus:{phasedRegistrationNames:{bubbled:y({onFocus:!0}),captured:y({onFocusCapture:!0})}},input:{phasedRegistrationNames:{bubbled:y({onInput:!0}),captured:y({onInputCapture:!0})}},keyDown:{phasedRegistrationNames:{bubbled:y({onKeyDown:!0}),captured:y({onKeyDownCapture:!0})}},keyPress:{phasedRegistrationNames:{bubbled:y({onKeyPress:!0}),captured:y({onKeyPressCapture:!0})}},keyUp:{phasedRegistrationNames:{bubbled:y({onKeyUp:!0}),captured:y({onKeyUpCapture:!0})}},load:{phasedRegistrationNames:{bubbled:y({onLoad:!0}),captured:y({onLoadCapture:!0})}},error:{phasedRegistrationNames:{bubbled:y({onError:!0}),captured:y({onErrorCapture:!0})}},mouseDown:{phasedRegistrationNames:{bubbled:y({onMouseDown:!0}),captured:y({onMouseDownCapture:!0})}},mouseMove:{phasedRegistrationNames:{bubbled:y({onMouseMove:!0}),captured:y({onMouseMoveCapture:!0})}},mouseOut:{phasedRegistrationNames:{bubbled:y({onMouseOut:!0}),captured:y({onMouseOutCapture:!0})}},mouseOver:{phasedRegistrationNames:{bubbled:y({onMouseOver:!0}),captured:y({onMouseOverCapture:!0})}},mouseUp:{phasedRegistrationNames:{bubbled:y({onMouseUp:!0}),captured:y({onMouseUpCapture:!0})}},paste:{phasedRegistrationNames:{bubbled:y({onPaste:!0}),captured:y({onPasteCapture:!0})}},reset:{phasedRegistrationNames:{bubbled:y({onReset:!0}),captured:y({onResetCapture:!0})}},scroll:{phasedRegistrationNames:{bubbled:y({onScroll:!0}),captured:y({onScrollCapture:!0})}},submit:{phasedRegistrationNames:{bubbled:y({onSubmit:!0}),captured:y({onSubmitCapture:!0})}},touchCancel:{phasedRegistrationNames:{bubbled:y({onTouchCancel:!0}),captured:y({onTouchCancelCapture:!0})}},touchEnd:{phasedRegistrationNames:{bubbled:y({onTouchEnd:!0}),captured:y({onTouchEndCapture:!0})}},touchMove:{phasedRegistrationNames:{bubbled:y({onTouchMove:!0}),captured:y({onTouchMoveCapture:!0})}},touchStart:{phasedRegistrationNames:{bubbled:y({onTouchStart:!0}),captured:y({onTouchStartCapture:!0})}},wheel:{phasedRegistrationNames:{bubbled:y({onWheel:!0}),captured:y({onWheelCapture:!0})}}},_={topBlur:E.blur,topClick:E.click,topContextMenu:E.contextMenu,topCopy:E.copy,topCut:E.cut,topDoubleClick:E.doubleClick,topDrag:E.drag,topDragEnd:E.dragEnd,topDragEnter:E.dragEnter,topDragExit:E.dragExit,topDragLeave:E.dragLeave,topDragOver:E.dragOver,topDragStart:E.dragStart,topDrop:E.drop,topError:E.error,topFocus:E.focus,topInput:E.input,topKeyDown:E.keyDown,topKeyPress:E.keyPress,topKeyUp:E.keyUp,topLoad:E.load,topMouseDown:E.mouseDown,topMouseMove:E.mouseMove,topMouseOut:E.mouseOut,topMouseOver:E.mouseOver,topMouseUp:E.mouseUp,topPaste:E.paste,topReset:E.reset,topScroll:E.scroll,topSubmit:E.submit,topTouchCancel:E.touchCancel,topTouchEnd:E.touchEnd,topTouchMove:E.touchMove,topTouchStart:E.touchStart,topWheel:E.wheel};for(var O in _)_[O].dependencies=[O];var N={eventTypes:E,executeDispatch:function(e,n,r){var i=o.executeDispatch(e,n,r);\"production\"!==t.env.NODE_ENV?g(\"boolean\"!=typeof i,\"Returning `false` from an event handler is deprecated and will be ignored in a future release. Instead, manually call e.stopPropagation() or e.preventDefault(), as appropriate.\"):null,i===!1&&(e.stopPropagation(),e.preventDefault())},extractEvents:function(e,n,r,o){var y=_[e];if(!y)return null;var g;switch(e){case b.topInput:case b.topLoad:case b.topError:case b.topReset:case b.topSubmit:g=s;break;case b.topKeyPress:if(0===v(o))return null;case b.topKeyDown:case b.topKeyUp:g=l;break;case b.topBlur:case b.topFocus:g=u;break;case b.topClick:if(2===o.button)return null;case b.topContextMenu:case b.topDoubleClick:case b.topMouseDown:case b.topMouseMove:case b.topMouseOut:case b.topMouseOver:case b.topMouseUp:g=c;break;case b.topDrag:case b.topDragEnd:case b.topDragEnter:case b.topDragExit:case b.topDragLeave:case b.topDragOver:case b.topDragStart:case b.topDrop:g=p;break;case b.topTouchCancel:case b.topTouchEnd:case b.topTouchMove:case b.topTouchStart:g=f;break;case b.topScroll:g=d;break;case b.topWheel:g=h;break;case b.topCopy:case b.topCut:case b.topPaste:g=a}\"production\"!==t.env.NODE_ENV?m(g,\"SimpleEventPlugin: Unhandled event type, `%s`.\",e):m(g);var E=g.getPooled(y,r,o);return i.accumulateTwoPhaseDispatches(E),E}};e.exports=N}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(100),i={clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i={relatedTarget:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i=n(146),a=n(147),s=n(110),u={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:s,charCode:function(e){return\"keypress\"===e.type?i(e):0},keyCode:function(e){return\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0},which:function(e){return\"keypress\"===e.type?i(e):\"keydown\"===e.type||\"keyup\"===e.type?e.keyCode:0}};o.augmentClass(r,u),e.exports=r},function(e,t){\"use strict\";function n(e){var t,n=e.keyCode;return\"charCode\"in e?(t=e.charCode,0===t&&13===n&&(t=13)):t=n,t>=32||13===t?t:0}e.exports=n},function(e,t,n){\"use strict\";function r(e){if(e.key){var t=i[e.key]||e.key;if(\"Unidentified\"!==t)return t}if(\"keypress\"===e.type){var n=o(e);return 13===n?\"Enter\":String.fromCharCode(n)}return\"keydown\"===e.type||\"keyup\"===e.type?a[e.keyCode]||\"Unidentified\":\"\"}var o=n(146),i={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},a={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"};e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(108),i={dataTransfer:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(109),i=n(110),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:i};o.augmentClass(r,a),e.exports=r},function(e,t,n){\"use strict\";function r(e,t,n){o.call(this,e,t,n)}var o=n(108),i={deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){\"use strict\";var r=n(47),o=r.injection.MUST_USE_ATTRIBUTE,i={Properties:{clipPath:o,cx:o,cy:o,d:o,dx:o,dy:o,fill:o,fillOpacity:o,fontFamily:o,fontSize:o,fx:o,fy:o,gradientTransform:o,gradientUnits:o,markerEnd:o,markerMid:o,markerStart:o,offset:o,opacity:o,patternContentUnits:o,patternUnits:o,points:o,preserveAspectRatio:o,r:o,rx:o,ry:o,spreadMethod:o,stopColor:o,stopOpacity:o,stroke:o,strokeDasharray:o,strokeLinecap:o,strokeOpacity:o,strokeWidth:o,textAnchor:o,transform:o,version:o,viewBox:o,x1:o,x2:o,x:o,y1:o,y2:o,y:o},DOMAttributeNames:{clipPath:\"clip-path\",fillOpacity:\"fill-opacity\",fontFamily:\"font-family\",fontSize:\"font-size\",gradientTransform:\"gradientTransform\",gradientUnits:\"gradientUnits\",markerEnd:\"marker-end\",markerMid:\"marker-mid\",markerStart:\"marker-start\",patternContentUnits:\"patternContentUnits\",patternUnits:\"patternUnits\",preserveAspectRatio:\"preserveAspectRatio\",spreadMethod:\"spreadMethod\",stopColor:\"stop-color\",stopOpacity:\"stop-opacity\",strokeDasharray:\"stroke-dasharray\",strokeLinecap:\"stroke-linecap\",strokeOpacity:\"stroke-opacity\",strokeWidth:\"stroke-width\",textAnchor:\"text-anchor\",viewBox:\"viewBox\"}};e.exports=i},function(e,t,n){(function(t){\"use strict\";function r(e){var n=i.createFactory(e),r=o.createClass({tagName:e.toUpperCase(),displayName:\"ReactFullPageComponent\"+e,componentWillUnmount:function(){\"production\"!==t.env.NODE_ENV?a(!1,\"%s tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg <html>, <head>, and <body>) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.\",this.constructor.displayName):a(!1)},render:function(){return n(this.props)}});return r}var o=n(40),i=n(14),a=n(10);e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return Math.floor(100*e)/100}function o(e,t,n){e[t]=(e[t]||0)+n}var i=n(47),a=n(154),s=n(70),u=n(31),l=n(155),c={_allMeasurements:[],_mountStack:[0],_injected:!1,start:function(){c._injected||u.injection.injectMeasure(c.measure),c._allMeasurements.length=0,u.enableMeasure=!0},stop:function(){u.enableMeasure=!1},getLastMeasurements:function(){return c._allMeasurements},printExclusive:function(e){e=e||c._allMeasurements;var t=a.getExclusiveSummary(e);console.table(t.map(function(e){return{\"Component class name\":e.componentName,\"Total inclusive time (ms)\":r(e.inclusive),\"Exclusive mount time (ms)\":r(e.exclusive),\"Exclusive render time (ms)\":r(e.render),\"Mount time per instance (ms)\":r(e.exclusive/e.count),\"Render time per instance (ms)\":r(e.render/e.count),Instances:e.count}}))},printInclusive:function(e){e=e||c._allMeasurements;var t=a.getInclusiveSummary(e);console.table(t.map(function(e){return{\"Owner > component\":e.componentName,\"Inclusive time (ms)\":r(e.time),Instances:e.count}})),console.log(\"Total time:\",a.getTotalTime(e).toFixed(2)+\" ms\")},getMeasurementsSummaryMap:function(e){var t=a.getInclusiveSummary(e,!0);return t.map(function(e){return{\"Owner > component\":e.componentName,\"Wasted time (ms)\":e.time,Instances:e.count}})},printWasted:function(e){e=e||c._allMeasurements,console.table(c.getMeasurementsSummaryMap(e)),console.log(\"Total time:\",a.getTotalTime(e).toFixed(2)+\" ms\")},printDOM:function(e){e=e||c._allMeasurements;var t=a.getDOMSummary(e);console.table(t.map(function(e){var t={};return t[i.ID_ATTRIBUTE_NAME]=e.id,t.type=e.type,t.args=JSON.stringify(e.args),t})),console.log(\"Total time:\",a.getTotalTime(e).toFixed(2)+\" ms\")},_recordWrite:function(e,t,n,r){var o=c._allMeasurements[c._allMeasurements.length-1].writes;o[e]=o[e]||[],o[e].push({type:t,time:n,args:r})},measure:function(e,t,n){return function(){for(var r=[],i=0,a=arguments.length;i<a;i++)r.push(arguments[i]);var u,p,f;if(\"_renderNewRootComponent\"===t||\"flushBatchedUpdates\"===t)return c._allMeasurements.push({exclusive:{},inclusive:{},render:{},counts:{},writes:{},displayNames:{},totalTime:0}),f=l(),p=n.apply(this,r),c._allMeasurements[c._allMeasurements.length-1].totalTime=l()-f,p;if(\"_mountImageIntoNode\"===t||\"ReactDOMIDOperations\"===e){if(f=l(),p=n.apply(this,r),u=l()-f,\"_mountImageIntoNode\"===t){var d=s.getID(r[1]);c._recordWrite(d,t,u,r[0])}else\"dangerouslyProcessChildrenUpdates\"===t?r[0].forEach(function(e){var t={};null!==e.fromIndex&&(t.fromIndex=e.fromIndex),null!==e.toIndex&&(t.toIndex=e.toIndex),null!==e.textContent&&(t.textContent=e.textContent),null!==e.markupIndex&&(t.markup=r[1][e.markupIndex]),c._recordWrite(e.parentID,e.type,u,t)}):c._recordWrite(r[0],t,u,Array.prototype.slice.call(r,1));return p}if(\"ReactCompositeComponent\"!==e||\"mountComponent\"!==t&&\"updateComponent\"!==t&&\"_renderValidatedComponent\"!==t)return n.apply(this,r);if(\"string\"==typeof this._currentElement.type)return n.apply(this,r);var h=\"mountComponent\"===t?r[0]:this._rootNodeID,v=\"_renderValidatedComponent\"===t,m=\"mountComponent\"===t,y=c._mountStack,g=c._allMeasurements[c._allMeasurements.length-1];if(v?o(g.counts,h,1):m&&y.push(0),f=l(),p=n.apply(this,r),u=l()-f,v)o(g.render,h,u);else if(m){var b=y.pop();y[y.length-1]+=u,o(g.exclusive,h,u-b),o(g.inclusive,h,u)}else o(g.inclusive,h,u);return g.displayNames[h]={current:this.getName(),owner:this._currentElement._owner?this._currentElement._owner.getName():\"<root>\"},p}}};e.exports=c},function(e,t,n){function r(e){for(var t=0,n=0;n<e.length;n++){var r=e[n];t+=r.totalTime}return t}function o(e){for(var t=[],n=0;n<e.length;n++){var r,o=e[n];for(r in o.writes)o.writes[r].forEach(function(e){t.push({id:r,type:c[e.type]||e.type,args:e.args})})}return t}function i(e){for(var t,n={},r=0;r<e.length;r++){var o=e[r],i=u({},o.exclusive,o.inclusive);for(var a in i)t=o.displayNames[a].current,n[t]=n[t]||{componentName:t,inclusive:0,exclusive:0,render:0,count:0},o.render[a]&&(n[t].render+=o.render[a]),o.exclusive[a]&&(n[t].exclusive+=o.exclusive[a]),o.inclusive[a]&&(n[t].inclusive+=o.inclusive[a]),o.counts[a]&&(n[t].count+=o.counts[a])}var s=[];for(t in n)n[t].exclusive>=l&&s.push(n[t]);return s.sort(function(e,t){return t.exclusive-e.exclusive}),s}function a(e,t){for(var n,r={},o=0;o<e.length;o++){var i,a=e[o],c=u({},a.exclusive,a.inclusive);t&&(i=s(a));for(var p in c)if(!t||i[p]){var f=a.displayNames[p];n=f.owner+\" > \"+f.current,r[n]=r[n]||{componentName:n,time:0,count:0},a.inclusive[p]&&(r[n].time+=a.inclusive[p]),a.counts[p]&&(r[n].count+=a.counts[p])}}var d=[];for(n in r)r[n].time>=l&&d.push(r[n]);return d.sort(function(e,t){return t.time-e.time}),d}function s(e){var t={},n=Object.keys(e.writes),r=u({},e.exclusive,e.inclusive);for(var o in r){for(var i=!1,a=0;a<n.length;a++)if(0===n[a].indexOf(o)){i=!0;break}!i&&e.counts[o]>0&&(t[o]=!0)}return t}var u=n(16),l=1.2,c={_mountImageIntoNode:\"set innerHTML\",INSERT_MARKUP:\"set innerHTML\",MOVE_EXISTING:\"move\",REMOVE_NODE:\"remove\",TEXT_CONTENT:\"set textContent\",updatePropertyByID:\"update attribute\",deletePropertyByID:\"delete attribute\",updateStylesByID:\"update styles\",updateInnerHTMLByID:\"set innerHTML\",dangerouslyReplaceNodeWithMarkupByID:\"replace\"},p={getExclusiveSummary:i,getInclusiveSummary:a,getDOMSummary:o,getTotalTime:r};e.exports=p},function(e,t,n){var r=n(156);r&&r.now||(r=Date);var o=r.now.bind(r);e.exports=o},function(e,t,n){\"use strict\";var r,o=n(54);o.canUseDOM&&(r=window.performance||window.msPerformance||window.webkitPerformance),e.exports=r||{}},function(e,t,n){(function(t){\"use strict\";function r(e){\"production\"!==t.env.NODE_ENV?p(i.isValidElement(e),\"renderToString(): You must pass a valid ReactElement.\"):p(i.isValidElement(e));var n;try{var r=a.createReactRootID();return n=u.getPooled(!1),n.perform(function(){var t=c(e,null),o=t.mountComponent(r,n,l);return s.addChecksumToMarkup(o)},null)}finally{u.release(n)}}function o(e){\"production\"!==t.env.NODE_ENV?p(i.isValidElement(e),\"renderToStaticMarkup(): You must pass a valid ReactElement.\"):p(i.isValidElement(e));var n;try{var r=a.createReactRootID();return n=u.getPooled(!0),n.perform(function(){var t=c(e,null);return t.mountComponent(r,n,l)},null)}finally{u.release(n)}}var i=n(14),a=n(22),s=n(80),u=n(158),l=n(17),c=n(86),p=n(10);e.exports={renderToString:r,renderToStaticMarkup:o}}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.reactMountReady=i.getPooled(null),this.putListenerQueue=a.getPooled()}var o=n(12),i=n(30),a=n(138),s=n(39),u=n(16),l=n(19),c={initialize:function(){this.reactMountReady.reset()},close:l},p={initialize:function(){this.putListenerQueue.reset()},close:l},f=[p,c],d={getTransactionWrappers:function(){return f},getReactMountReady:function(){return this.reactMountReady},getPutListenerQueue:function(){return this.putListenerQueue},destructor:function(){i.release(this.reactMountReady),this.reactMountReady=null,a.release(this.putListenerQueue),this.putListenerQueue=null}};u(r.prototype,s.Mixin,d),o.addPoolingTo(r),e.exports=r},function(e,t,n){(function(t){\"use strict\";function r(e){return\"production\"!==t.env.NODE_ENV?i(o.isValidElement(e),\"onlyChild must be passed a children with exactly one child.\"):i(o.isValidElement(e)),e}var o=n(14),i=n(10);e.exports=r}).call(t,n(6))},function(e,t,n){var r=n(161);r.connect=n(175),r.connectFilter=n(177),r.ListenerMixin=n(176),r.listenTo=n(178),r.listenToMany=n(179),e.exports=r},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r={version:{\"reflux-core\":\"0.2.1\"}};r.ActionMethods=n(162),r.ListenerMethods=n(163),r.PublisherMethods=n(173),r.StoreMethods=n(172),r.createAction=n(174),r.createStore=n(168);var o=n(167).staticJoinCreator;r.joinTrailing=r.all=o(\"last\"),r.joinLeading=o(\"first\"),r.joinStrict=o(\"strict\"),r.joinConcat=o(\"all\");var i=r.utils=n(164);r.EventEmitter=i.EventEmitter,r.Promise=i.Promise,r.createActions=function(){var e=function(e,t){Object.keys(e).forEach(function(n){var o=e[n];t[n]=r.createAction(o)})};return function(t){var n={};return t instanceof Array?t.forEach(function(t){i.isObject(t)?e(t,n):n[t]=r.createAction(t)}):e(t,n),n}}(),r.setEventEmitter=function(e){r.EventEmitter=i.EventEmitter=e},r.setPromise=function(e){r.Promise=i.Promise=e},r.setPromiseFactory=function(e){i.createPromise=e},r.nextTick=function(e){i.nextTick=e},r.use=function(e){e(r)},r.__keep=n(169),Function.prototype.bind||console.error(\"Function.prototype.bind not available. ES5 shim required. https://github.com/spoike/refluxjs#es5\"),t.default=r,e.exports=t.default},function(e,t){\"use strict\";e.exports={}},function(e,t,n){\"use strict\";var r=n(164),o=n(167).instanceJoinCreator,i=function(e){for(var t,n=0,r={};n<(e.children||[]).length;++n)t=e.children[n],e[t]&&(r[t]=e[t]);return r},a=function e(t){var n={};for(var o in t){var a=t[o],s=i(a),u=e(s);n[o]=a;for(var l in u){var c=u[l];n[o+r.capitalize(l)]=c}}return n};e.exports={hasListener:function(e){for(var t,n,r,o=0;o<(this.subscriptions||[]).length;++o)for(r=[].concat(this.subscriptions[o].listenable),t=0;t<r.length;t++)if(n=r[t],n===e||n.hasListener&&n.hasListener(e))return!0;return!1},listenToMany:function(e){var t=a(e);for(var n in t){var o=r.callbackName(n),i=this[o]?o:this[n]?n:void 0;i&&this.listenTo(t[n],i,this[o+\"Default\"]||this[i+\"Default\"]||i)}},validateListening:function(e){return e===this?\"Listener is not able to listen to itself\":r.isFunction(e.listen)?e.hasListener&&e.hasListener(this)?\"Listener cannot listen to this listenable because of circular loop\":void 0:e+\" is missing a listen method\"},listenTo:function(e,t,n){var o,i,a,s=this.subscriptions=this.subscriptions||[];return r.throwIf(this.validateListening(e)),this.fetchInitialState(e,n),o=e.listen(this[t]||t,this),i=function(){var e=s.indexOf(a);r.throwIf(e===-1,\"Tried to remove listen already gone from subscriptions list!\"),s.splice(e,1),o()},a={stop:i,listenable:e},s.push(a),a},stopListeningTo:function(e){for(var t,n=0,o=this.subscriptions||[];n<o.length;n++)if(t=o[n],t.listenable===e)return t.stop(),r.throwIf(o.indexOf(t)!==-1,\"Failed to remove listen from subscriptions list!\"),!0;return!1},stopListeningToAll:function(){for(var e,t=this.subscriptions||[];e=t.length;)t[0].stop(),r.throwIf(t.length!==e-1,\"Failed to remove listen from subscriptions list!\")},fetchInitialState:function(e,t){t=t&&this[t]||t;var n=this;if(r.isFunction(t)&&r.isFunction(e.getInitialState)){var o=e.getInitialState();o&&r.isFunction(o.then)?o.then(function(){t.apply(n,arguments)}):t.call(this,o)}},joinTrailing:o(\"last\"),joinLeading:o(\"first\"),joinConcat:o(\"all\"),joinStrict:o(\"strict\")}},function(module,exports,__webpack_require__){(function(setImmediate){\"use strict\";function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function callbackName(e,t){return t=t||\"on\",t+exports.capitalize(e)}function checkEnv(target){var flag=void 0;try{eval(target)&&(flag=!0)}catch(e){flag=!1}environment[callbackName(target,\"has\")]=flag}function isObject(e){var t=typeof e;return\"function\"===t||\"object\"===t&&!!e}function extend(e){if(!isObject(e))return e;for(var t,n,r=1,o=arguments.length;r<o;r++){t=arguments[r];for(n in t)if(Object.getOwnPropertyDescriptor&&Object.defineProperty){var i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i)}else e[n]=t[n]}return e}function isFunction(e){return\"function\"==typeof e}function object(e,t){for(var n={},r=0;r<e.length;r++)n[e[r]]=t[r];return n}function isArguments(e){return\"object\"==typeof e&&\"callee\"in e&&\"number\"==typeof e.length}function throwIf(e,t){if(e)throw Error(t||e)}Object.defineProperty(exports,\"__esModule\",{value:!0}),exports.capitalize=capitalize,exports.callbackName=callbackName,exports.isObject=isObject,exports.extend=extend,exports.isFunction=isFunction,exports.object=object,exports.isArguments=isArguments,exports.throwIf=throwIf;var environment={};exports.environment=environment,checkEnv(\"setImmediate\"),checkEnv(\"Promise\"),exports.EventEmitter=__webpack_require__(2),environment.hasSetImmediate?exports.nextTick=function(e){setImmediate(e)}:exports.nextTick=function(e){setTimeout(e,0)},environment.hasPromise?(exports.Promise=Promise,exports.createPromise=function(e){return new exports.Promise(e)}):(exports.Promise=null,exports.createPromise=function(){})}).call(exports,__webpack_require__(165).setImmediate)},function(e,t,n){function r(e,t){this._id=e,this._clearFn=t}var o=Function.prototype.apply;t.setTimeout=function(){return new r(o.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new r(o.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(166),t.setImmediate=setImmediate,t.clearImmediate=clearImmediate},function(e,t,n){(function(e,t){!function(e,n){\"use strict\";function r(e){\"function\"!=typeof e&&(e=new Function(\"\"+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var r={callback:e,args:t};return v[h]=r,d(h),h++}function o(e){delete v[e]}function i(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}function a(e){if(m)setTimeout(a,0,e);else{var t=v[e];if(t){m=!0;try{i(t)}finally{o(e),m=!1}}}}function s(){d=function(e){t.nextTick(function(){a(e)})}}function u(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage(\"\",\"*\"),e.onmessage=n,t}}function l(){var t=\"setImmediate$\"+Math.random()+\"$\",n=function(n){n.source===e&&\"string\"==typeof n.data&&0===n.data.indexOf(t)&&a(+n.data.slice(t.length))};e.addEventListener?e.addEventListener(\"message\",n,!1):e.attachEvent(\"onmessage\",n),d=function(n){e.postMessage(t+n,\"*\")}}function c(){var e=new MessageChannel;e.port1.onmessage=function(e){var t=e.data;a(t)},d=function(t){e.port2.postMessage(t)}}function p(){var e=y.documentElement;d=function(t){var n=y.createElement(\"script\");n.onreadystatechange=function(){a(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}function f(){d=function(e){setTimeout(a,0,e)}}if(!e.setImmediate){var d,h=1,v={},m=!1,y=e.document,g=Object.getPrototypeOf&&Object.getPrototypeOf(e);g=g&&g.setTimeout?g:e,\"[object process]\"==={}.toString.call(e.process)?s():u()?l():e.MessageChannel?c():y&&\"onreadystatechange\"in y.createElement(\"script\")?p():f(),g.setImmediate=r,g.clearImmediate=o}}(\"undefined\"==typeof self?\"undefined\"==typeof e?this:e:self)}).call(t,function(){return this}(),n(6))},function(e,t,n){\"use strict\";function r(e,t,n){return function(){var r,o=n.subscriptions,i=o?o.indexOf(e):-1;for(u.throwIf(i===-1,\"Tried to remove join already gone from subscriptions list!\"),r=0;r<t.length;r++)t[r]();o.splice(i,1)}}function o(e){e.listenablesEmitted=new Array(e.numberOfListenables),e.args=new Array(e.numberOfListenables)}function i(e,t){return function(){var n=l.call(arguments);if(t.listenablesEmitted[e])switch(t.strategy){case\"strict\":throw new Error(\"Strict join failed because listener triggered twice.\");case\"last\":t.args[e]=n;break;case\"all\":t.args[e].push(n)}else t.listenablesEmitted[e]=!0,t.args[e]=\"all\"===t.strategy?[n]:n;a(t)}}function a(e){for(var t=0;t<e.numberOfListenables;t++)if(!e.listenablesEmitted[t])return;e.callback.apply(e.listener,e.args),o(e)}var s=n(168),u=n(164),l=Array.prototype.slice,c={strict:\"joinStrict\",first:\"joinLeading\",last:\"joinTrailing\",all:\"joinConcat\"};t.staticJoinCreator=function(e){return function(){var t=l.call(arguments);return s({init:function(){this[c[e]].apply(this,t.concat(\"triggerAsync\"))}})}},t.instanceJoinCreator=function(e){return function(){u.throwIf(arguments.length<2,\"Cannot create a join with less than 2 listenables!\");var t,n,a=l.call(arguments),s=a.pop(),c=a.length,p={numberOfListenables:c,callback:this[s]||s,listener:this,strategy:e},f=[];for(t=0;t<c;t++)u.throwIf(this.validateListening(a[t]));for(t=0;t<c;t++)f.push(a[t].listen(i(t,p),this));return o(p),n={listenable:a},n.stop=r(n,f,this),this.subscriptions=(this.subscriptions||[]).concat(n),n}}},function(e,t,n){\"use strict\";var r=n(164),o=n(169),i=n(170),a=n(171),s={preEmit:1,shouldEmit:1};e.exports=function(e){function t(){var t,n=0;if(this.subscriptions=[],this.emitter=new r.EventEmitter,this.eventLabel=\"change\",a(this,e),this.init&&r.isFunction(this.init)&&this.init(),this.listenables)for(t=[].concat(this.listenables);n<t.length;n++)this.listenToMany(t[n])}var u=n(172),l=n(173),c=n(163);e=e||{};for(var p in u)if(!s[p]&&(l[p]||c[p]))throw new Error(\"Cannot override API method \"+p+\" in Reflux.StoreMethods. Use another method name or override it on Reflux.PublisherMethods / Reflux.ListenerMethods instead.\");for(var f in e)if(!s[f]&&(l[f]||c[f]))throw new Error(\"Cannot override API method \"+f+\" in store creation. Use another method name or override it on Reflux.PublisherMethods / Reflux.ListenerMethods instead.\");e=i(e),r.extend(t.prototype,c,l,u,e);var d=new t;return o.createdStores.push(d),d}},function(e,t){\"use strict\";t.createdStores=[],t.createdActions=[],t.reset=function(){for(;t.createdStores.length;)t.createdStores.pop();for(;t.createdActions.length;)t.createdActions.pop()}},function(e,t,n){\"use strict\";var r=n(164);e.exports=function(e){var t={init:[],preEmit:[],shouldEmit:[]},n=function e(n){var o={};return n.mixins&&n.mixins.forEach(function(t){r.extend(o,e(t))}),r.extend(o,n),Object.keys(t).forEach(function(e){n.hasOwnProperty(e)&&t[e].push(n[e])}),o}(e);return t.init.length>1&&(n.init=function(){var e=arguments;t.init.forEach(function(t){t.apply(this,e)},this)}),t.preEmit.length>1&&(n.preEmit=function(){return t.preEmit.reduce(function(e,t){var n=t.apply(this,e);return void 0===n?e:[n]}.bind(this),arguments)}),t.shouldEmit.length>1&&(n.shouldEmit=function(){var e=arguments;return!t.shouldEmit.some(function(t){return!t.apply(this,e)},this)}),Object.keys(t).forEach(function(e){1===t[e].length&&(n[e]=t[e][0])}),n}},function(e,t){\"use strict\";e.exports=function(e,t){for(var n in t)if(Object.getOwnPropertyDescriptor&&Object.defineProperty){var r=Object.getOwnPropertyDescriptor(t,n);if(!r.value||\"function\"!=typeof r.value||!t.hasOwnProperty(n))continue;e[n]=t[n].bind(e)}else{var o=t[n];if(\"function\"!=typeof o||!t.hasOwnProperty(n))continue;e[n]=o.bind(e)}return e}},function(e,t){\"use strict\";e.exports={}},function(e,t,n){\"use strict\";var r=n(164);e.exports={preEmit:function(){},shouldEmit:function(){return!0},listen:function(e,t){t=t||this;var n=function(n){o||e.apply(t,n)},r=this,o=!1;return this.emitter.addListener(this.eventLabel,n),function(){o=!0,r.emitter.removeListener(r.eventLabel,n)}},promise:function(e){var t=this,n=this.children.indexOf(\"completed\")>=0&&this.children.indexOf(\"failed\")>=0;if(!n)throw new Error('Publisher must have \"completed\" and \"failed\" child publishers');e.then(function(e){return t.completed(e)},function(e){return t.failed(e)})},listenAndPromise:function(e,t){var n=this;t=t||this,this.willCallPromise=(this.willCallPromise||0)+1;var r=this.listen(function(){if(!e)throw new Error(\"Expected a function returning a promise but got \"+e);var r=arguments,o=e.apply(t,r);return n.promise.call(n,o)},t);return function(){n.willCallPromise--,r.call(n)}},trigger:function(){var e=arguments,t=this.preEmit.apply(this,e);e=void 0===t?e:r.isArguments(t)?t:[].concat(t),this.shouldEmit.apply(this,e)&&this.emitter.emit(this.eventLabel,e)},triggerAsync:function(){var e=arguments,t=this;r.nextTick(function(){t.trigger.apply(t,e)})},triggerPromise:function(){var e=this,t=arguments,n=this.children.indexOf(\"completed\")>=0&&this.children.indexOf(\"failed\")>=0,o=r.createPromise(function(o,i){if(e.willCallPromise)return void r.nextTick(function(){var n=e.promise;e.promise=function(t){return t.then(o,i),e.promise=n,e.promise.apply(e,arguments)},e.trigger.apply(e,t)});if(n)var a=e.completed.listen(function(e){a(),s(),o(e)}),s=e.failed.listen(function(e){a(),s(),i(e)});e.triggerAsync.apply(e,t),n||o()});return o}}},function(e,t,n){\"use strict\";var r=n(164),o=n(162),i=n(173),a=n(169),s={preEmit:1,shouldEmit:1},u=function e(t){t=t||{},r.isObject(t)||(t={actionName:t});for(var n in o)if(!s[n]&&i[n])throw new Error(\"Cannot override API method \"+n+\" in Reflux.ActionMethods. Use another method name or override it on Reflux.PublisherMethods instead.\");for(var u in t)if(!s[u]&&i[u])throw new Error(\"Cannot override API method \"+u+\" in action creation. Use another method name or override it on Reflux.PublisherMethods instead.\");t.children=t.children||[],t.asyncResult&&(t.children=t.children.concat([\"completed\",\"failed\"]));for(var l=0,c={};l<t.children.length;l++){var p=t.children[l];c[p]=e(p)}var f=r.extend({eventLabel:\"action\",emitter:new r.EventEmitter,_isAction:!0},i,o,t),d=function e(){var t=e.sync?\"trigger\":r.environment.hasPromise?\"triggerPromise\":\"triggerAsync\";\nreturn e[t].apply(e,arguments)};return r.extend(d,c,f),a.createdActions.push(d),d};e.exports=u},function(e,t,n){var r=n(163),o=n(176),i=n(164);e.exports=function(e,t){return{getInitialState:function(){return i.isFunction(e.getInitialState)?void 0===t?e.getInitialState():i.object([t],[e.getInitialState()]):{}},componentDidMount:function(){i.extend(this,r);var n=this,o=void 0===t?this.setState:function(e){\"undefined\"!=typeof n.isMounted&&n.isMounted()!==!0||n.setState(i.object([t],[e]))};this.listenTo(e,o)},componentWillUnmount:o.componentWillUnmount}}},function(e,t,n){var r=n(164),o=n(163);e.exports=r.extend({componentWillUnmount:o.stopListeningToAll},o)},function(e,t,n){var r=n(163),o=n(176),i=n(164);e.exports=function(e,t,n){return n=i.isFunction(t)?t:n,{getInitialState:function(){if(i.isFunction(e.getInitialState)){if(i.isFunction(t))return n.call(this,e.getInitialState());var r=n.call(this,e.getInitialState());return\"undefined\"!=typeof r?i.object([t],[r]):{}}return{}},componentDidMount:function(){i.extend(this,r);var o=this,a=function(e){if(i.isFunction(t))o.setState(n.call(o,e));else{var r=n.call(o,e);o.setState(i.object([t],[r]))}};this.listenTo(e,a)},componentWillUnmount:o.componentWillUnmount}}},function(e,t,n){var r=n(163);e.exports=function(e,t,n){return{componentDidMount:function(){for(var o in r)if(this[o]!==r[o]){if(this[o])throw\"Can't have other property '\"+o+\"' when using Reflux.listenTo!\";this[o]=r[o]}this.listenTo(e,t,n)},componentWillUnmount:r.stopListeningToAll}}},function(e,t,n){var r=n(163);e.exports=function(e){return{componentDidMount:function(){for(var t in r)if(this[t]!==r[t]){if(this[t])throw\"Can't have other property '\"+t+\"' when using Reflux.listenToMany!\";this[t]=r[t]}this.listenToMany(e)},componentWillUnmount:r.stopListeningToAll}}},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(181),i=r(o),a=n(188),s=r(a),u=n(189),l=r(u),c=n(192),p=r(c),f=n(184),d=r(f),h=n(193),v=r(h),m=n(194),y=r(m),g=n(195),b=r(g),E=n(196),_=r(E),O=n(200),N=r(O),w=n(201),C=r(w),P=n(205),x=r(P),T=n(207),D=r(T),M=n(208),S=r(M),k=n(202),I=r(k),R=n(209),A=r(R),j=n(211),L=r(j),V=n(210),F=r(V),U=n(212),B=r(U),K=n(213),W=r(K),H=n(206),q=r(H),z=n(215),Y=r(z),G=n(216),Q=r(G),$=n(218),X=r($),J=n(219),Z=r(J),ee=n(220),te=r(ee),ne=n(221),re=r(ne),oe=n(222),ie=r(oe),ae=n(223),se=r(ae),ue=n(224),le=r(ue),ce=n(228),pe=r(ce),fe=n(229),de=r(fe),he=n(227),ve=r(he),me=n(230),ye=r(me),ge=n(231),be=r(ge),Ee=n(232),_e=r(Ee),Oe=n(233),Ne=r(Oe),we=n(234),Ce=r(we),Pe=n(236),xe=r(Pe),Te=n(226),De=r(Te),Me=n(237),Se=r(Me),ke=n(241),Ie=r(ke),Re=n(242),Ae=r(Re),je=n(245),Le=r(je),Ve=n(182),Fe=r(Ve),Ue=n(246),Be=r(Ue),Ke=n(247),We=r(Ke),He=n(248),qe=r(He),ze=n(249),Ye=r(ze),Ge=n(250),Qe=r(Ge),$e=n(251),Xe=r($e),Je=n(252),Ze=r(Je),et=n(253),tt=r(et),nt=n(254),rt=r(nt),ot=n(255),it=r(ot),at=n(256),st=r(at),ut=n(257),lt=r(ut),ct=n(258),pt=r(ct),ft=n(259),dt=r(ft),ht=n(185),vt=r(ht),mt=n(225),yt=r(mt),gt=n(238),bt=r(gt);t.default={Accordion:i.default,Affix:s.default,AffixMixin:l.default,Alert:p.default,BootstrapMixin:d.default,Badge:v.default,Button:y.default,ButtonGroup:b.default,ButtonInput:_.default,ButtonToolbar:N.default,CollapsibleNav:C.default,Carousel:x.default,CarouselItem:D.default,Col:S.default,CollapsibleMixin:I.default,DropdownButton:A.default,DropdownMenu:L.default,DropdownStateMixin:F.default,FadeMixin:B.default,FormControls:W.default,Glyphicon:q.default,Grid:Y.default,Input:Q.default,Interpolate:X.default,Jumbotron:Z.default,Label:te.default,ListGroup:re.default,ListGroupItem:ie.default,MenuItem:se.default,Modal:le.default,ModalHeader:pe.default,ModalTitle:de.default,ModalBody:ve.default,ModalFooter:ye.default,Nav:be.default,Navbar:_e.default,NavItem:Ne.default,ModalTrigger:Ce.default,Overlay:Se.default,OverlayTrigger:xe.default,OverlayMixin:De.default,PageHeader:Ie.default,Panel:Le.default,PanelGroup:Fe.default,PageItem:Be.default,Pager:We.default,Pagination:Ae.default,Popover:qe.default,Portal:yt.default,Position:bt.default,ProgressBar:Ye.default,Row:Qe.default,SplitButton:Xe.default,SubNav:Ze.default,TabbedArea:tt.default,Table:rt.default,TabPane:it.default,Thumbnail:st.default,Tooltip:lt.default,utils:pt.default,Well:dt.default,styleMaps:vt.default},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(182),u=r(s),l=a.default.createClass({displayName:\"Accordion\",render:function(){return a.default.createElement(u.default,o({},this.props,{accordion:!0}),this.props.children)}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(187),f=r(p),d=a.default.createClass({displayName:\"PanelGroup\",mixins:[c.default],propTypes:{accordion:a.default.PropTypes.bool,activeKey:a.default.PropTypes.any,className:a.default.PropTypes.string,children:a.default.PropTypes.node,defaultActiveKey:a.default.PropTypes.any,onSelect:a.default.PropTypes.func},getDefaultProps:function(){return{bsClass:\"panel-group\"}},getInitialState:function(){var e=this.props.defaultActiveKey;return{activeKey:e}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e),onSelect:null}),f.default.map(this.props.children,this.renderPanel))},renderPanel:function(e,t){var n=null!=this.props.activeKey?this.props.activeKey:this.state.activeKey,r={bsStyle:e.props.bsStyle||this.props.bsStyle,key:e.key?e.key:t,ref:e.ref};return this.props.accordion&&(r.collapsible=!0,r.expanded=e.props.eventKey===n,r.onSelect=this.handleSelect),(0,i.cloneElement)(e,r)},shouldComponentUpdate:function(){return!this._isChanging},handleSelect:function(e,t){e.preventDefault(),this.props.onSelect&&(this._isChanging=!0,this.props.onSelect(t),this._isChanging=!1),this.state.activeKey===t&&(t=null),this.setState({activeKey:t})}});t.default=d,e.exports=t.default},function(e,t,n){var r,o;/*!\n\t  Copyright (c) 2016 Jed Watson.\n\t  Licensed under the MIT License (MIT), see\n\t  http://jedwatson.github.io/classnames\n\t*/\n!function(){\"use strict\";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if(\"string\"===o||\"number\"===o)e.push(r);else if(Array.isArray(r))e.push(n.apply(null,r));else if(\"object\"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(\" \")}var i={}.hasOwnProperty;\"undefined\"!=typeof e&&e.exports?e.exports=n:(r=[],o=function(){return n}.apply(t,r),!(void 0!==o&&(e.exports=o)))}()},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(185),i=r(o),a=n(186),s=r(a),u={propTypes:{bsClass:s.default.keyOf(i.default.CLASSES),bsStyle:s.default.keyOf(i.default.STYLES),bsSize:s.default.keyOf(i.default.SIZES)},getBsClassSet:function(){var e={},t=this.props.bsClass&&i.default.CLASSES[this.props.bsClass];if(t){e[t]=!0;var n=t+\"-\",r=this.props.bsSize&&i.default.SIZES[this.props.bsSize];r&&(e[n+r]=!0);var o=this.props.bsStyle&&i.default.STYLES[this.props.bsStyle];this.props.bsStyle&&(e[n+o]=!0)}return e},prefixClass:function(e){return i.default.CLASSES[this.props.bsClass]+\"-\"+e}};t.default=u,e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n={CLASSES:{alert:\"alert\",button:\"btn\",\"button-group\":\"btn-group\",\"button-toolbar\":\"btn-toolbar\",column:\"col\",\"input-group\":\"input-group\",form:\"form\",glyphicon:\"glyphicon\",label:\"label\",thumbnail:\"thumbnail\",\"list-group-item\":\"list-group-item\",panel:\"panel\",\"panel-group\":\"panel-group\",pagination:\"pagination\",\"progress-bar\":\"progress-bar\",nav:\"nav\",navbar:\"navbar\",modal:\"modal\",row:\"row\",well:\"well\"},STYLES:{default:\"default\",primary:\"primary\",success:\"success\",info:\"info\",warning:\"warning\",danger:\"danger\",link:\"link\",inline:\"inline\",tabs:\"tabs\",pills:\"pills\"},addStyle:function(e){n.STYLES[e]=e},SIZES:{large:\"lg\",medium:\"md\",small:\"sm\",xsmall:\"xs\"},GLYPHS:[\"asterisk\",\"plus\",\"euro\",\"eur\",\"minus\",\"cloud\",\"envelope\",\"pencil\",\"glass\",\"music\",\"search\",\"heart\",\"star\",\"star-empty\",\"user\",\"film\",\"th-large\",\"th\",\"th-list\",\"ok\",\"remove\",\"zoom-in\",\"zoom-out\",\"off\",\"signal\",\"cog\",\"trash\",\"home\",\"file\",\"time\",\"road\",\"download-alt\",\"download\",\"upload\",\"inbox\",\"play-circle\",\"repeat\",\"refresh\",\"list-alt\",\"lock\",\"flag\",\"headphones\",\"volume-off\",\"volume-down\",\"volume-up\",\"qrcode\",\"barcode\",\"tag\",\"tags\",\"book\",\"bookmark\",\"print\",\"camera\",\"font\",\"bold\",\"italic\",\"text-height\",\"text-width\",\"align-left\",\"align-center\",\"align-right\",\"align-justify\",\"list\",\"indent-left\",\"indent-right\",\"facetime-video\",\"picture\",\"map-marker\",\"adjust\",\"tint\",\"edit\",\"share\",\"check\",\"move\",\"step-backward\",\"fast-backward\",\"backward\",\"play\",\"pause\",\"stop\",\"forward\",\"fast-forward\",\"step-forward\",\"eject\",\"chevron-left\",\"chevron-right\",\"plus-sign\",\"minus-sign\",\"remove-sign\",\"ok-sign\",\"question-sign\",\"info-sign\",\"screenshot\",\"remove-circle\",\"ok-circle\",\"ban-circle\",\"arrow-left\",\"arrow-right\",\"arrow-up\",\"arrow-down\",\"share-alt\",\"resize-full\",\"resize-small\",\"exclamation-sign\",\"gift\",\"leaf\",\"fire\",\"eye-open\",\"eye-close\",\"warning-sign\",\"plane\",\"calendar\",\"random\",\"comment\",\"magnet\",\"chevron-up\",\"chevron-down\",\"retweet\",\"shopping-cart\",\"folder-close\",\"folder-open\",\"resize-vertical\",\"resize-horizontal\",\"hdd\",\"bullhorn\",\"bell\",\"certificate\",\"thumbs-up\",\"thumbs-down\",\"hand-right\",\"hand-left\",\"hand-up\",\"hand-down\",\"circle-arrow-right\",\"circle-arrow-left\",\"circle-arrow-up\",\"circle-arrow-down\",\"globe\",\"wrench\",\"tasks\",\"filter\",\"briefcase\",\"fullscreen\",\"dashboard\",\"paperclip\",\"heart-empty\",\"link\",\"phone\",\"pushpin\",\"usd\",\"gbp\",\"sort\",\"sort-by-alphabet\",\"sort-by-alphabet-alt\",\"sort-by-order\",\"sort-by-order-alt\",\"sort-by-attributes\",\"sort-by-attributes-alt\",\"unchecked\",\"expand\",\"collapse-down\",\"collapse-up\",\"log-in\",\"flash\",\"log-out\",\"new-window\",\"record\",\"save\",\"open\",\"saved\",\"import\",\"export\",\"send\",\"floppy-disk\",\"floppy-saved\",\"floppy-remove\",\"floppy-save\",\"floppy-open\",\"credit-card\",\"transfer\",\"cutlery\",\"header\",\"compressed\",\"earphone\",\"phone-alt\",\"tower\",\"stats\",\"sd-video\",\"hd-video\",\"subtitles\",\"sound-stereo\",\"sound-dolby\",\"sound-5-1\",\"sound-6-1\",\"sound-7-1\",\"copyright-mark\",\"registration-mark\",\"cloud-download\",\"cloud-upload\",\"tree-conifer\",\"tree-deciduous\",\"cd\",\"save-file\",\"open-file\",\"level-up\",\"copy\",\"paste\",\"alert\",\"equalizer\",\"king\",\"queen\",\"pawn\",\"bishop\",\"knight\",\"baby-formula\",\"tent\",\"blackboard\",\"bed\",\"apple\",\"erase\",\"hourglass\",\"lamp\",\"duplicate\",\"piggy-bank\",\"scissors\",\"bitcoin\",\"yen\",\"ruble\",\"scale\",\"ice-lolly\",\"ice-lolly-tasted\",\"education\",\"option-horizontal\",\"option-vertical\",\"menu-hamburger\",\"modal-window\",\"oil\",\"grain\",\"sunglasses\",\"text-size\",\"text-color\",\"text-background\",\"object-align-top\",\"object-align-bottom\",\"object-align-horizontal\",\"object-align-left\",\"object-align-vertical\",\"object-align-right\",\"triangle-right\",\"triangle-left\",\"triangle-bottom\",\"triangle-top\",\"console\",\"superscript\",\"subscript\",\"menu-left\",\"menu-right\",\"menu-down\",\"menu-up\"]};t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return Array.isArray(e)?e:Array.from(e)}function i(e,t,n,r){return\"Invalid prop '\"+t+\"' of value '\"+e[t]+\"'\"+(\" supplied to '\"+n+\"'\"+r)}function a(e){function t(t,n,r,o){return o=o||h,null!=n[r]?e(n,r,o):t?new Error(\"Required prop '\"+r+\"' was not specified in '\"+o+\"'.\"):void 0}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function s(){function e(e,t,n){if(\"object\"!=typeof e[t]||\"function\"!=typeof e[t].render&&1!==e[t].nodeType)return new Error(i(e,t,n,\", expected a DOM element or an object that has a `render` method\"))}return a(e)}function u(e){function t(t,n,r){var o=t[n];if(!e.hasOwnProperty(o)){var a=JSON.stringify(Object.keys(e));return new Error(i(t,n,r,\", expected one of \"+a+\".\"))}}return a(t)}function l(e){function t(t,n,r){var i=e.map(function(e){return t[e]}).reduce(function(e,t){return e+(void 0!==t?1:0)},0);if(i>1){var a=o(e),s=a[0],u=a.slice(1),l=\"\"+u.join(\", \")+\" and \"+s;return new Error(\"Invalid prop '\"+n+\"', only one of the following may be provided: \"+l)}}return t}function c(e){if(void 0===e)throw new Error(\"No validations provided\");if(!(e instanceof Array))throw new Error(\"Invalid argument must be an array\");if(0===e.length)throw new Error(\"No validations provided\");return function(t,n,r){for(var o=0;o<e.length;o++){var i=e[o](t,n,r);if(void 0!==i&&null!==i)return i}}}function p(){function e(e,t,n){var r=i(e,t,n,\". Expected an Element `type`\");if(\"function\"!=typeof e[t]){if(d.default.isValidElement(e[t]))return new Error(r+\", not an actual Element\");if(\"string\"!=typeof e[t])return new Error(r+\" such as a tag name or return value of React.createClass(...)\")}}return a(e)}Object.defineProperty(t,\"__esModule\",{value:!0});var f=n(4),d=r(f),h=\"<<anonymous>>\",v={isRequiredForA11y:function(e){return function(t,n,r){return null===t[n]?new Error(\"The prop `\"+n+\"` is required to make \"+r+\" accessible for users using assistive technologies such as screen readers `\"):e(t,n,r)}},mountable:s(),elementType:p(),keyOf:u,singlePropFrom:l,all:c};t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){var r=0;return l.default.Children.map(e,function(e){if(l.default.isValidElement(e)){var o=r;return r++,t.call(n,e,o)}return e})}function i(e,t,n){var r=0;return l.default.Children.forEach(e,function(e){l.default.isValidElement(e)&&(t.call(n,e,r),r++)})}function a(e){var t=0;return l.default.Children.forEach(e,function(e){l.default.isValidElement(e)&&t++}),t}function s(e){var t=!1;return l.default.Children.forEach(e,function(e){!t&&l.default.isValidElement(e)&&(t=!0)}),t}Object.defineProperty(t,\"__esModule\",{value:!0});var u=n(4),l=r(u);t.default={map:o,forEach:i,numberOf:a,hasValidComponent:s},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(189),c=r(l),p=n(190),f=r(p),d=a.default.createClass({displayName:\"Affix\",statics:{domUtils:f.default},mixins:[c.default],render:function(){var e={top:this.state.affixPositionTop};return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,this.state.affixClass),style:e}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(190),s=r(a),u=n(191),l=r(u),c={propTypes:{offset:i.default.PropTypes.number,offsetTop:i.default.PropTypes.number,offsetBottom:i.default.PropTypes.number},getInitialState:function(){return{affixClass:\"affix-top\"}},getPinnedOffset:function(e){return this.pinnedOffset?this.pinnedOffset:(e.className=e.className.replace(/affix-top|affix-bottom|affix/,\"\"),e.className+=e.className.length?\" affix\":\"affix\",this.pinnedOffset=s.default.getOffset(e).top-window.pageYOffset,this.pinnedOffset)},checkPosition:function(){var e=void 0,t=void 0,n=void 0,r=void 0,o=void 0,a=void 0,u=void 0,l=void 0,c=void 0;this.isMounted()&&(e=i.default.findDOMNode(this),t=document.documentElement.offsetHeight,n=window.pageYOffset,r=s.default.getOffset(e),\"top\"===this.affixed&&(r.top+=n),o=null!=this.props.offsetTop?this.props.offsetTop:this.props.offset,a=null!=this.props.offsetBottom?this.props.offsetBottom:this.props.offset,null==o&&null==a||(null==o&&(o=0),null==a&&(a=0),u=!(null!=this.unpin&&n+this.unpin<=r.top)&&(null!=a&&r.top+e.offsetHeight>=t-a?\"bottom\":null!=o&&n<=o&&\"top\"),this.affixed!==u&&(null!=this.unpin&&(e.style.top=\"\"),l=\"affix\"+(u?\"-\"+u:\"\"),this.affixed=u,this.unpin=\"bottom\"===u?this.getPinnedOffset(e):null,\"bottom\"===u&&(e.className=e.className.replace(/affix-top|affix-bottom|affix/,\"affix-bottom\"),c=t-a-e.offsetHeight-s.default.getOffset(e).top),this.setState({affixClass:l,affixPositionTop:c}))))},checkPositionWithEventLoop:function(){setTimeout(this.checkPosition,0)},componentDidMount:function(){this._onWindowScrollListener=l.default.listen(window,\"scroll\",this.checkPosition),this._onDocumentClickListener=l.default.listen(s.default.ownerDocument(this),\"click\",this.checkPositionWithEventLoop)},componentWillUnmount:function(){this._onWindowScrollListener&&this._onWindowScrollListener.remove(),this._onDocumentClickListener&&this._onDocumentClickListener.remove()},componentDidUpdate:function(e,t){t.affixClass===this.state.affixClass&&this.checkPositionWithEventLoop()}};t.default=c,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t=d.default.findDOMNode(e);return t&&t.ownerDocument||document}function i(e){var t=o(e);return t.defaultView?t.defaultView:t.parentWindow}function a(e){var t=o(e);try{return t.activeElement||t.body}catch(e){return t.body}}function s(e){return o(e).defaultView.getComputedStyle(e,null)}function u(e){if(window.jQuery)return window.jQuery(e).offset();var t=o(e).documentElement,n={top:0,left:0};return\"undefined\"!=typeof e.getBoundingClientRect&&(n=e.getBoundingClientRect()),{top:n.top+window.pageYOffset-t.clientTop,left:n.left+window.pageXOffset-t.clientLeft}}function l(e,t){var n=void 0,r=void 0;return window.jQuery?t?(n=window.jQuery(e).offset(),r=window.jQuery(t).offset(),{top:n.top-r.top,left:n.left-r.left}):window.jQuery(e).position():(r={top:0,left:0},\"fixed\"===s(e).position?n=e.getBoundingClientRect():(t||(t=c(e)),n=u(e),\"HTML\"!==t.nodeName&&(r=u(t)),r.top+=parseInt(s(t).borderTopWidth,10),r.left+=parseInt(s(t).borderLeftWidth,10)),{top:n.top-r.top-parseInt(s(e).marginTop,10),left:n.left-r.left-parseInt(s(e).marginLeft,10)})}function c(e){for(var t=o(e).documentElement,n=e.offsetParent||t;n&&\"HTML\"!==n.nodeName&&\"static\"===s(n).position;)n=n.offsetParent;return n||t}function p(e,t){function n(e,t){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}return e&&e.contains?e.contains(t):e&&e.compareDocumentPosition?e===t||!!(16&e.compareDocumentPosition(t)):n(e,t)}Object.defineProperty(t,\"__esModule\",{value:!0});var f=n(4),d=r(f),h=!(\"undefined\"==typeof window||!window.document||!window.document.createElement);t.default={canUseDom:h,contains:p,ownerWindow:i,ownerDocument:o,getComputedStyles:s,getOffset:u,getPosition:l,activeElement:a,offsetParent:c},e.exports=t.default},function(e,t){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var n={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\"on\"+t,n),{remove:function(){e.detachEvent(\"on\"+t,n)}}):void 0}};t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Alert\",mixins:[c.default],propTypes:{onDismiss:a.default.PropTypes.func,dismissAfter:a.default.PropTypes.number,closeLabel:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"alert\",bsStyle:\"info\",closeLabel:\"Close Alert\"}},renderDismissButton:function(){return a.default.createElement(\"button\",{type:\"button\",className:\"close\",\"aria-label\":this.props.closeLabel,onClick:this.props.onDismiss},a.default.createElement(\"span\",{\"aria-hidden\":\"true\"},\"×\"))},render:function(){var e=this.getBsClassSet(),t=!!this.props.onDismiss;return e[\"alert-dismissable\"]=t,a.default.createElement(\"div\",o({},this.props,{role:\"alert\",className:(0,u.default)(this.props.className,e)}),t?this.renderDismissButton():null,this.props.children)},componentDidMount:function(){this.props.dismissAfter&&this.props.onDismiss&&(this.dismissTimer=setTimeout(this.props.onDismiss,this.props.dismissAfter))},componentWillUnmount:function(){clearTimeout(this.dismissTimer)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(187),u=r(s),l=n(183),c=r(l),p=a.default.createClass({displayName:\"Badge\",propTypes:{pullRight:a.default.PropTypes.bool},hasContent:function(){return u.default.hasValidComponent(this.props.children)||a.default.Children.count(this.props.children)>1||\"string\"==typeof this.props.children||\"number\"==typeof this.props.children},render:function(){var e={\"pull-right\":this.props.pullRight,badge:this.hasContent()};return a.default.createElement(\"span\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(186),f=r(p),d=a.default.createClass({displayName:\"Button\",mixins:[c.default],propTypes:{active:a.default.PropTypes.bool,disabled:a.default.PropTypes.bool,block:a.default.PropTypes.bool,navItem:a.default.PropTypes.bool,navDropdown:a.default.PropTypes.bool,componentClass:f.default.elementType,href:a.default.PropTypes.string,target:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"button\",bsStyle:\"default\",type:\"button\"}},render:function(){var e=this.props.navDropdown?{}:this.getBsClassSet(),t=void 0;return e=o({active:this.props.active,\"btn-block\":this.props.block},e),this.props.navItem?this.renderNavItem(e):(t=this.props.href||this.props.target||this.props.navDropdown?\"renderAnchor\":\"renderButton\",this[t](e))},renderAnchor:function(e){var t=this.props.componentClass||\"a\",n=this.props.href||\"#\";return e.disabled=this.props.disabled,a.default.createElement(t,o({},this.props,{href:n,className:(0,u.default)(this.props.className,e),role:\"button\"}),this.props.children)},renderButton:function(e){var t=this.props.componentClass||\"button\";return a.default.createElement(t,o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)},renderNavItem:function(e){var t={active:this.props.active};return a.default.createElement(\"li\",{className:(0,u.default)(t)},this.renderAnchor(e))}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(186),f=r(p),d=a.default.createClass({displayName:\"ButtonGroup\",mixins:[c.default],propTypes:{vertical:a.default.PropTypes.bool,justified:a.default.PropTypes.bool,block:f.default.all([a.default.PropTypes.bool,function(e,t,n){if(e.block&&!e.vertical)return new Error(\"The block property requires the vertical property to be set to have any effect\")}])},getDefaultProps:function(){return{bsClass:\"button-group\"}},render:function(){var e=this.getBsClassSet();return e[\"btn-group\"]=!this.props.vertical,e[\"btn-group-vertical\"]=this.props.vertical,e[\"btn-group-justified\"]=this.props.justified,e[\"btn-block\"]=this.props.block,a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=n(4),c=r(l),p=n(194),f=r(p),d=n(197),h=r(d),v=n(198),m=r(v),y=n(199),g=r(y),b=function(e){function t(){i(this,t),null!=e&&e.apply(this,arguments)}return a(t,e),u(t,[{key:\"renderFormGroup\",value:function(e){var t=this.props,n=(t.bsStyle,t.value,o(t,[\"bsStyle\",\"value\"]));return c.default.createElement(h.default,n,e)}},{key:\"renderInput\",value:function(){var e=this.props,t=e.children,n=e.value,r=o(e,[\"children\",\"value\"]),i=t?t:n;return c.default.createElement(f.default,s({},r,{componentClass:\"input\",ref:\"input\",key:\"input\",value:i}))}}]),t}(m.default);b.types=[\"button\",\"reset\",\"submit\"],b.defaultProps={type:\"button\"},b.propTypes={type:c.default.PropTypes.oneOf(b.types),bsStyle:function(e){return null},children:g.default,value:g.default},t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(4),u=r(s),l=n(183),c=r(l),p=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),a(t,[{key:\"render\",value:function(){var e={\"form-group\":!this.props.standalone,\"form-group-lg\":!this.props.standalone&&\"large\"===this.props.bsSize,\"form-group-sm\":!this.props.standalone&&\"small\"===this.props.bsSize,\"has-feedback\":this.props.hasFeedback,\"has-success\":\"success\"===this.props.bsStyle,\"has-warning\":\"warning\"===this.props.bsStyle,\"has-error\":\"error\"===this.props.bsStyle};return u.default.createElement(\"div\",{className:(0,c.default)(e,this.props.groupClassName)},this.props.children)}}]),t}(u.default.Component);p.defaultProps={standalone:!1},p.propTypes={standalone:u.default.PropTypes.bool,hasFeedback:u.default.PropTypes.bool,bsSize:function(e){return e.standalone&&void 0!==e.bsSize?new Error(\"bsSize will not be used when `standalone` is set.\"):u.default.PropTypes.oneOf([\"small\",\"medium\",\"large\"]).apply(null,arguments)},bsStyle:u.default.PropTypes.oneOf([\"success\",\"warning\",\"error\"]),groupClassName:u.default.PropTypes.string},t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=n(197),d=r(f),h=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"getInputDOMNode\",value:function(){return l.default.findDOMNode(this.refs.input)}},{key:\"getValue\",value:function(){if(\"static\"===this.props.type)return this.props.value;if(this.props.type)return\"select\"===this.props.type&&this.props.multiple?this.getSelectedOptions():this.getInputDOMNode().value;throw\"Cannot use getValue without specifying input type.\"}},{key:\"getChecked\",value:function(){return this.getInputDOMNode().checked}},{key:\"getSelectedOptions\",value:function(){var e=[];return Array.prototype.forEach.call(this.getInputDOMNode().getElementsByTagName(\"option\"),function(t){if(t.selected){var n=t.getAttribute(\"value\")||t.innerHtml;e.push(n)}}),e}},{key:\"isCheckboxOrRadio\",value:function(){return\"checkbox\"===this.props.type||\"radio\"===this.props.type}},{key:\"isFile\",value:function(){return\"file\"===this.props.type}},{key:\"renderInputGroup\",value:function(e){var t=this.props.addonBefore?l.default.createElement(\"span\",{className:\"input-group-addon\",key:\"addonBefore\"},this.props.addonBefore):null,n=this.props.addonAfter?l.default.createElement(\"span\",{className:\"input-group-addon\",key:\"addonAfter\"},this.props.addonAfter):null,r=this.props.buttonBefore?l.default.createElement(\"span\",{className:\"input-group-btn\"},this.props.buttonBefore):null,o=this.props.buttonAfter?l.default.createElement(\"span\",{className:\"input-group-btn\"},this.props.buttonAfter):null,i=void 0;switch(this.props.bsSize){case\"small\":i=\"input-group-sm\";break;case\"large\":i=\"input-group-lg\"}return t||n||r||o?l.default.createElement(\"div\",{className:(0,p.default)(i,\"input-group\"),key:\"input-group\"},t,r,e,n,o):e}},{key:\"renderIcon\",value:function(){var e={glyphicon:!0,\"form-control-feedback\":!0,\"glyphicon-ok\":\"success\"===this.props.bsStyle,\"glyphicon-warning-sign\":\"warning\"===this.props.bsStyle,\"glyphicon-remove\":\"error\"===this.props.bsStyle};return this.props.hasFeedback?l.default.createElement(\"span\",{className:(0,p.default)(e),key:\"icon\"}):null}},{key:\"renderHelp\",value:function(){return this.props.help?l.default.createElement(\"span\",{className:\"help-block\",key:\"help\"},this.props.help):null}},{key:\"renderCheckboxAndRadioWrapper\",value:function(e){var t={checkbox:\"checkbox\"===this.props.type,radio:\"radio\"===this.props.type};return l.default.createElement(\"div\",{className:(0,p.default)(t),key:\"checkboxRadioWrapper\"},e)}},{key:\"renderWrapper\",value:function(e){return this.props.wrapperClassName?l.default.createElement(\"div\",{className:this.props.wrapperClassName,key:\"wrapper\"},e):e}},{key:\"renderLabel\",value:function(e){var t={\"control-label\":!this.isCheckboxOrRadio()};return t[this.props.labelClassName]=this.props.labelClassName,this.props.label?l.default.createElement(\"label\",{htmlFor:this.props.id,className:(0,p.default)(t),key:\"label\"},e,this.props.label):e}},{key:\"renderInput\",value:function(){if(!this.props.type)return this.props.children;switch(this.props.type){case\"select\":return l.default.createElement(\"select\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control\"),ref:\"input\",key:\"input\"}),this.props.children);case\"textarea\":return l.default.createElement(\"textarea\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control\"),ref:\"input\",key:\"input\"}));case\"static\":return l.default.createElement(\"p\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control-static\"),ref:\"input\",key:\"input\"}),this.props.value)}var e=this.isCheckboxOrRadio()||this.isFile()?\"\":\"form-control\";return l.default.createElement(\"input\",a({},this.props,{className:(0,p.default)(this.props.className,e),ref:\"input\",key:\"input\"}))}},{key:\"renderFormGroup\",value:function(e){return l.default.createElement(d.default,this.props,e)}},{key:\"renderChildren\",value:function(){return this.isCheckboxOrRadio()?this.renderWrapper([this.renderCheckboxAndRadioWrapper(this.renderLabel(this.renderInput())),this.renderHelp()]):[this.renderLabel(),this.renderWrapper([this.renderInputGroup(this.renderInput()),this.renderIcon(),this.renderHelp()])]}},{key:\"render\",value:function(){var e=this.renderChildren();return this.renderFormGroup(e)}}]),t}(l.default.Component);h.propTypes={type:l.default.PropTypes.string,label:l.default.PropTypes.node,help:l.default.PropTypes.node,addonBefore:l.default.PropTypes.node,addonAfter:l.default.PropTypes.node,buttonBefore:l.default.PropTypes.node,buttonAfter:l.default.PropTypes.node,bsSize:l.default.PropTypes.oneOf([\"small\",\"medium\",\"large\"]),bsStyle:l.default.PropTypes.oneOf([\"success\",\"warning\",\"error\"]),hasFeedback:l.default.PropTypes.bool,id:l.default.PropTypes.string,groupClassName:l.default.PropTypes.string,wrapperClassName:l.default.PropTypes.string,labelClassName:l.default.PropTypes.string,multiple:l.default.PropTypes.bool,disabled:l.default.PropTypes.bool,value:l.default.PropTypes.any},t.default=h,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){var r=(0,s.singlePropFrom)(u)(e,t,n);if(!r){var o=a.default.PropTypes.oneOfType(l);r=o(e,t,n)}return r}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=o;var i=n(4),a=r(i),s=n(186),u=[\"children\",\"value\"],l=[a.default.PropTypes.number,a.default.PropTypes.string];e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"ButtonToolbar\",mixins:[c.default],getDefaultProps:function(){return{bsClass:\"button-toolbar\"}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"div\",o({},this.props,{role:\"toolbar\",className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(184),s=r(a),u=n(202),l=r(u),c=n(183),p=r(c),f=n(190),d=r(f),h=n(187),v=r(h),m=n(204),y=r(m),g=i.default.createClass({displayName:\"CollapsibleNav\",mixins:[s.default,l.default],propTypes:{onSelect:i.default.PropTypes.func,activeHref:i.default.PropTypes.string,activeKey:i.default.PropTypes.any,collapsible:i.default.PropTypes.bool,expanded:i.default.PropTypes.bool,eventKey:i.default.PropTypes.any},getCollapsibleDOMNode:function(){return i.default.findDOMNode(this)},getCollapsibleDimensionValue:function(){var e=0,t=this.refs;for(var n in t)if(t.hasOwnProperty(n)){var r=i.default.findDOMNode(t[n]),o=r.offsetHeight,a=d.default.getComputedStyles(r);e+=o+parseInt(a.marginTop,10)+parseInt(a.marginBottom,10)}return e},render:function(){var e=this.props.collapsible?this.getCollapsibleClassSet(\"navbar-collapse\"):null,t=this.props.collapsible?this.renderCollapsibleNavChildren:this.renderChildren;return i.default.createElement(\"div\",{eventKey:this.props.eventKey,className:(0,p.default)(this.props.className,e)},v.default.map(this.props.children,t))},getChildActiveProp:function(e){return!!e.props.active||(null!=this.props.activeKey&&e.props.eventKey===this.props.activeKey||(null!=this.props.activeHref&&e.props.href===this.props.activeHref||e.props.active))},renderChildren:function(e,t){var n=e.key?e.key:t;return(0,o.cloneElement)(e,{activeKey:this.props.activeKey,activeHref:this.props.activeHref,ref:\"nocollapse_\"+n,key:n,navItem:!0})},renderCollapsibleNavChildren:function(e,t){var n=e.key?e.key:t;return(0,o.cloneElement)(e,{active:this.getChildActiveProp(e),activeKey:this.props.activeKey,activeHref:this.props.activeHref,onSelect:(0,y.default)(e.props.onSelect,this.props.onSelect),ref:\"collapsible_\"+n,key:n,navItem:!0})}});t.default=g,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(203),s=r(a),u={propTypes:{defaultExpanded:i.default.PropTypes.bool,expanded:i.default.PropTypes.bool},getInitialState:function(){var e=null!=this.props.defaultExpanded?this.props.defaultExpanded:null!=this.props.expanded&&this.props.expanded;return{expanded:e,collapsing:!1}},componentWillUpdate:function(e,t){var n=null!=e.expanded?e.expanded:t.expanded;if(n!==this.isExpanded()){var r=this.getCollapsibleDOMNode(),o=this.dimension(),i=\"0\";n||(i=this.getCollapsibleDimensionValue()),r.style[o]=i+\"px\",this._afterWillUpdate()}},componentDidUpdate:function(e,t){this._checkToggleCollapsing(e,t),this._checkStartAnimation()},_afterWillUpdate:function(){},_checkStartAnimation:function(){if(this.state.collapsing){var e=this.getCollapsibleDOMNode(),t=this.dimension(),n=this.getCollapsibleDimensionValue(),r=void 0;r=this.isExpanded()?n+\"px\":\"0px\",e.style[t]=r}},_checkToggleCollapsing:function(e,t){var n=null!=e.expanded?e.expanded:t.expanded,r=this.isExpanded();n!==r&&(n?this._handleCollapse():this._handleExpand())},_handleExpand:function(){var e=this,t=this.getCollapsibleDOMNode(),n=this.dimension(),r=function r(){e._removeEndEventListener(t,r),t.style[n]=\"\",e.setState({collapsing:!1})};this._addEndEventListener(t,r),this.setState({collapsing:!0})},_handleCollapse:function(){var e=this,t=this.getCollapsibleDOMNode(),n=function n(){e._removeEndEventListener(t,n),e.setState({collapsing:!1})};this._addEndEventListener(t,n),this.setState({collapsing:!0})},\n_addEndEventListener:function(e,t){s.default.addEndEventListener(e,t)},_removeEndEventListener:function(e,t){s.default.removeEndEventListener(e,t)},dimension:function(){return\"function\"==typeof this.getCollapsibleDimension?this.getCollapsibleDimension():\"height\"},isExpanded:function(){return null!=this.props.expanded?this.props.expanded:this.state.expanded},getCollapsibleClassSet:function(e){var t={};return\"string\"==typeof e&&e.split(\" \").forEach(function(e){e&&(t[e]=!0)}),t.collapsing=this.state.collapsing,t.collapse=!this.state.collapsing,t.in=this.isExpanded()&&!this.state.collapsing,t}};t.default=u,e.exports=t.default},function(e,t){\"use strict\";function n(){var e=document.createElement(\"div\"),t=e.style;\"AnimationEvent\"in window||delete a.animationend.animation,\"TransitionEvent\"in window||delete a.transitionend.transition;for(var n in a){var r=a[n];for(var o in r)if(o in t){s.push(r[o]);break}}}function r(e,t,n){e.addEventListener(t,n,!1)}function o(e,t,n){e.removeEventListener(t,n,!1)}Object.defineProperty(t,\"__esModule\",{value:!0});var i=!(\"undefined\"==typeof window||!window.document||!window.document.createElement),a={transitionend:{transition:\"transitionend\",WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"mozTransitionEnd\",OTransition:\"oTransitionEnd\",msTransition:\"MSTransitionEnd\"},animationend:{animation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\",MozAnimation:\"mozAnimationEnd\",OAnimation:\"oAnimationEnd\",msAnimation:\"MSAnimationEnd\"}},s=[];i&&n();var u={addEndEventListener:function(e,t){return 0===s.length?void window.setTimeout(t,0):void s.forEach(function(n){r(e,n,t)})},removeEndEventListener:function(e,t){0!==s.length&&s.forEach(function(n){o(e,n,t)})}};t.default=u,e.exports=t.default},function(e,t){\"use strict\";function n(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return null!=e}).reduce(function(e,t){if(\"function\"!=typeof t)throw new Error(\"Invalid Argument Type, must only provide functions, undefined, or null.\");return null===e?t:function(){for(var n=arguments.length,r=Array(n),o=0;o<n;o++)r[o]=arguments[o];e.apply(this,r),t.apply(this,r)}},null)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(187),f=r(p),d=n(206),h=r(d),v=a.default.createClass({displayName:\"Carousel\",mixins:[c.default],propTypes:{slide:a.default.PropTypes.bool,indicators:a.default.PropTypes.bool,interval:a.default.PropTypes.number,controls:a.default.PropTypes.bool,pauseOnHover:a.default.PropTypes.bool,wrap:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,onSlideEnd:a.default.PropTypes.func,activeIndex:a.default.PropTypes.number,defaultActiveIndex:a.default.PropTypes.number,direction:a.default.PropTypes.oneOf([\"prev\",\"next\"]),prevIcon:a.default.PropTypes.node,nextIcon:a.default.PropTypes.node},getDefaultProps:function(){return{slide:!0,interval:5e3,pauseOnHover:!0,wrap:!0,indicators:!0,controls:!0,prevIcon:a.default.createElement(h.default,{glyph:\"chevron-left\"}),nextIcon:a.default.createElement(h.default,{glyph:\"chevron-right\"})}},getInitialState:function(){return{activeIndex:null==this.props.defaultActiveIndex?0:this.props.defaultActiveIndex,previousActiveIndex:null,direction:null}},getDirection:function(e,t){return e===t?null:e>t?\"prev\":\"next\"},componentWillReceiveProps:function(e){var t=this.getActiveIndex();null!=e.activeIndex&&e.activeIndex!==t&&(clearTimeout(this.timeout),this.setState({previousActiveIndex:t,direction:null!=e.direction?e.direction:this.getDirection(t,e.activeIndex)}))},componentDidMount:function(){this.waitForNext()},componentWillUnmount:function(){clearTimeout(this.timeout)},next:function(e){e&&e.preventDefault();var t=this.getActiveIndex()+1,n=f.default.numberOf(this.props.children);if(t>n-1){if(!this.props.wrap)return;t=0}this.handleSelect(t,\"next\")},prev:function(e){e&&e.preventDefault();var t=this.getActiveIndex()-1;if(t<0){if(!this.props.wrap)return;t=f.default.numberOf(this.props.children)-1}this.handleSelect(t,\"prev\")},pause:function(){this.isPaused=!0,clearTimeout(this.timeout)},play:function(){this.isPaused=!1,this.waitForNext()},waitForNext:function(){!this.isPaused&&this.props.slide&&this.props.interval&&null==this.props.activeIndex&&(this.timeout=setTimeout(this.next,this.props.interval))},handleMouseOver:function(){this.props.pauseOnHover&&this.pause()},handleMouseOut:function(){this.isPaused&&this.play()},render:function(){var e={carousel:!0,slide:this.props.slide};return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e),onMouseOver:this.handleMouseOver,onMouseOut:this.handleMouseOut}),this.props.indicators?this.renderIndicators():null,a.default.createElement(\"div\",{className:\"carousel-inner\",ref:\"inner\"},f.default.map(this.props.children,this.renderItem)),this.props.controls?this.renderControls():null)},renderPrev:function(){return a.default.createElement(\"a\",{className:\"left carousel-control\",href:\"#prev\",key:0,onClick:this.prev},this.props.prevIcon)},renderNext:function(){return a.default.createElement(\"a\",{className:\"right carousel-control\",href:\"#next\",key:1,onClick:this.next},this.props.nextIcon)},renderControls:function(){if(!this.props.wrap){var e=this.getActiveIndex(),t=f.default.numberOf(this.props.children);return[0!==e?this.renderPrev():null,e!==t-1?this.renderNext():null]}return[this.renderPrev(),this.renderNext()]},renderIndicator:function(e,t){var n=t===this.getActiveIndex()?\"active\":null;return a.default.createElement(\"li\",{key:t,className:n,onClick:this.handleSelect.bind(this,t,null)})},renderIndicators:function(){var e=[];return f.default.forEach(this.props.children,function(t,n){e.push(this.renderIndicator(t,n),\" \")},this),a.default.createElement(\"ol\",{className:\"carousel-indicators\"},e)},getActiveIndex:function(){return null!=this.props.activeIndex?this.props.activeIndex:this.state.activeIndex},handleItemAnimateOutEnd:function(){this.setState({previousActiveIndex:null,direction:null},function(){this.waitForNext(),this.props.onSlideEnd&&this.props.onSlideEnd()})},renderItem:function(e,t){var n=this.getActiveIndex(),r=t===n,o=null!=this.state.previousActiveIndex&&this.state.previousActiveIndex===t&&this.props.slide;return(0,i.cloneElement)(e,{active:r,ref:e.ref,key:e.key?e.key:t,index:t,animateOut:o,animateIn:r&&null!=this.state.previousActiveIndex&&this.props.slide,direction:this.state.direction,onAnimateOutEnd:o?this.handleItemAnimateOutEnd:null})},handleSelect:function(e,t){clearTimeout(this.timeout);var n=this.getActiveIndex();if(t=t||this.getDirection(n,e),this.props.onSelect&&this.props.onSelect(e,t),null==this.props.activeIndex&&e!==n){if(null!=this.state.previousActiveIndex)return;this.setState({activeIndex:e,previousActiveIndex:n,direction:t})}}});t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(185),f=r(p),d=a.default.createClass({displayName:\"Glyphicon\",mixins:[c.default],propTypes:{glyph:a.default.PropTypes.oneOf(f.default.GLYPHS).isRequired},getDefaultProps:function(){return{bsClass:\"glyphicon\"}},render:function(){var e=this.getBsClassSet();return e[\"glyphicon-\"+this.props.glyph]=!0,a.default.createElement(\"span\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(203),c=r(l),p=a.default.createClass({displayName:\"CarouselItem\",propTypes:{direction:a.default.PropTypes.oneOf([\"prev\",\"next\"]),onAnimateOutEnd:a.default.PropTypes.func,active:a.default.PropTypes.bool,animateIn:a.default.PropTypes.bool,animateOut:a.default.PropTypes.bool,caption:a.default.PropTypes.node,index:a.default.PropTypes.number},getInitialState:function(){return{direction:null}},getDefaultProps:function(){return{animation:!0}},handleAnimateOutEnd:function(){this.props.onAnimateOutEnd&&this.isMounted()&&this.props.onAnimateOutEnd(this.props.index)},componentWillReceiveProps:function(e){this.props.active!==e.active&&this.setState({direction:null})},componentDidUpdate:function(e){!this.props.active&&e.active&&c.default.addEndEventListener(a.default.findDOMNode(this),this.handleAnimateOutEnd),this.props.active!==e.active&&setTimeout(this.startAnimation,20)},startAnimation:function(){this.isMounted()&&this.setState({direction:\"prev\"===this.props.direction?\"right\":\"left\"})},render:function(){var e={item:!0,active:this.props.active&&!this.props.animateIn||this.props.animateOut,next:this.props.active&&this.props.animateIn&&\"next\"===this.props.direction,prev:this.props.active&&this.props.animateIn&&\"prev\"===this.props.direction};return this.state.direction&&(this.props.animateIn||this.props.animateOut)&&(e[this.state.direction]=!0),a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children,this.props.caption?this.renderCaption():null)},renderCaption:function(){return a.default.createElement(\"div\",{className:\"carousel-caption\"},this.props.caption)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(185),c=r(l),p=n(186),f=r(p),d=a.default.createClass({displayName:\"Col\",propTypes:{xs:a.default.PropTypes.number,sm:a.default.PropTypes.number,md:a.default.PropTypes.number,lg:a.default.PropTypes.number,xsOffset:a.default.PropTypes.number,smOffset:a.default.PropTypes.number,mdOffset:a.default.PropTypes.number,lgOffset:a.default.PropTypes.number,xsPush:a.default.PropTypes.number,smPush:a.default.PropTypes.number,mdPush:a.default.PropTypes.number,lgPush:a.default.PropTypes.number,xsPull:a.default.PropTypes.number,smPull:a.default.PropTypes.number,mdPull:a.default.PropTypes.number,lgPull:a.default.PropTypes.number,componentClass:f.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass,t={};return Object.keys(c.default.SIZES).forEach(function(e){var n=c.default.SIZES[e],r=n,o=n+\"-\";this.props[r]&&(t[\"col-\"+o+this.props[r]]=!0),r=n+\"Offset\",o=n+\"-offset-\",this.props[r]>=0&&(t[\"col-\"+o+this.props[r]]=!0),r=n+\"Push\",o=n+\"-push-\",this.props[r]>=0&&(t[\"col-\"+o+this.props[r]]=!0),r=n+\"Pull\",o=n+\"-pull-\",this.props[r]>=0&&(t[\"col-\"+o+this.props[r]]=!0)},this),a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,t)}),this.props.children)}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(204),c=r(l),p=n(184),f=r(p),d=n(210),h=r(d),v=n(194),m=r(v),y=n(195),g=r(y),b=n(211),E=r(b),_=n(187),O=r(_),N=a.default.createClass({displayName:\"DropdownButton\",mixins:[f.default,h.default],propTypes:{pullRight:a.default.PropTypes.bool,dropup:a.default.PropTypes.bool,title:a.default.PropTypes.node,href:a.default.PropTypes.string,id:a.default.PropTypes.string,onClick:a.default.PropTypes.func,onSelect:a.default.PropTypes.func,navItem:a.default.PropTypes.bool,noCaret:a.default.PropTypes.bool,buttonClassName:a.default.PropTypes.string,className:a.default.PropTypes.string,children:a.default.PropTypes.node},render:function(){var e=this.props.navItem?\"renderNavItem\":\"renderButtonGroup\",t=this.props.noCaret?null:a.default.createElement(\"span\",{className:\"caret\"});return this[e]([a.default.createElement(m.default,o({},this.props,{ref:\"dropdownButton\",className:(0,u.default)(\"dropdown-toggle\",this.props.buttonClassName),onClick:(0,c.default)(this.props.onClick,this.handleDropdownClick),key:0,navDropdown:this.props.navItem,navItem:null,title:null,pullRight:null,dropup:null}),this.props.title,\" \",t),a.default.createElement(E.default,{ref:\"menu\",\"aria-labelledby\":this.props.id,pullRight:this.props.pullRight,key:1},O.default.map(this.props.children,this.renderMenuItem))])},renderButtonGroup:function(e){var t={open:this.state.open,dropup:this.props.dropup};return a.default.createElement(g.default,{bsSize:this.props.bsSize,className:(0,u.default)(this.props.className,t)},e)},renderNavItem:function(e){var t={dropdown:!0,open:this.state.open,dropup:this.props.dropup};return a.default.createElement(\"li\",{className:(0,u.default)(this.props.className,t)},e)},renderMenuItem:function(e,t){var n=this.props.onSelect||e.props.onSelect?this.handleOptionSelect:null;return(0,i.cloneElement)(e,{onSelect:(0,c.default)(e.props.onSelect,n),key:e.key?e.key:t})},handleDropdownClick:function(e){e.preventDefault(),this.setDropdownState(!this.state.open)},handleOptionSelect:function(e){this.props.onSelect&&this.props.onSelect(e),this.setDropdownState(!1)}});t.default=N,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(;e;){if(e===t)return!0;e=e.parentNode}return!1}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),a=r(i),s=n(190),u=r(s),l=n(191),c=r(l),p={getInitialState:function(){return{open:!1}},setDropdownState:function(e,t){e?this.bindRootCloseHandlers():this.unbindRootCloseHandlers(),this.setState({open:e},t)},handleDocumentKeyUp:function(e){27===e.keyCode&&this.setDropdownState(!1)},handleDocumentClick:function(e){var t=e.target||e.srcElement;o(t,a.default.findDOMNode(this))||this.setDropdownState(!1)},bindRootCloseHandlers:function(){var e=u.default.ownerDocument(this);this._onDocumentClickListener=c.default.listen(e,\"click\",this.handleDocumentClick),this._onDocumentKeyupListener=c.default.listen(e,\"keyup\",this.handleDocumentKeyUp)},unbindRootCloseHandlers:function(){this._onDocumentClickListener&&this._onDocumentClickListener.remove(),this._onDocumentKeyupListener&&this._onDocumentKeyupListener.remove()},componentWillUnmount:function(){this.unbindRootCloseHandlers()}};t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(204),c=r(l),p=n(187),f=r(p),d=a.default.createClass({displayName:\"DropdownMenu\",propTypes:{pullRight:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func},render:function(){var e={\"dropdown-menu\":!0,\"dropdown-menu-right\":this.props.pullRight};return a.default.createElement(\"ul\",o({},this.props,{className:(0,u.default)(this.props.className,e),role:\"menu\"}),f.default.map(this.props.children,this.renderMenuItem))},renderMenuItem:function(e,t){return(0,i.cloneElement)(e,{onSelect:(0,c.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t})}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n=e.querySelectorAll(\".\"+t.join(\".\"));n=[].map.call(n,function(e){return e});for(var r=0;r<t.length;r++)if(!e.className.match(new RegExp(\"\\\\b\"+t[r]+\"\\\\b\")))return n;return n.unshift(e),n}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),a=r(i),s=n(190),u=r(s);t.default={_fadeIn:function(){var e=void 0;this.isMounted()&&(e=o(a.default.findDOMNode(this),[\"fade\"]),e.length&&e.forEach(function(e){e.className+=\" in\"}))},_fadeOut:function(){var e=o(this._fadeOutEl,[\"fade\",\"in\"]);e.length&&e.forEach(function(e){e.className=e.className.replace(/\\bin\\b/,\"\")}),setTimeout(this._handleFadeOutEnd,300)},_handleFadeOutEnd:function(){this._fadeOutEl&&this._fadeOutEl.parentNode&&this._fadeOutEl.parentNode.removeChild(this._fadeOutEl)},componentDidMount:function(){document.querySelectorAll&&setTimeout(this._fadeIn,20)},componentWillUnmount:function(){var e=o(a.default.findDOMNode(this),[\"fade\"]),t=this.props.container&&a.default.findDOMNode(this.props.container)||u.default.ownerDocument(this).body;e.length&&(this._fadeOutEl=document.createElement(\"div\"),t.appendChild(this._fadeOutEl),this._fadeOutEl.appendChild(a.default.findDOMNode(this).cloneNode(!0)),setTimeout(this._fadeOut,20))}},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(214),i=r(o);t.default={Static:i.default},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=n(198),d=r(f),h=n(199),v=r(h),m=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"getValue\",value:function(){var e=this.props,t=e.children,n=e.value;return t?t:n}},{key:\"renderInput\",value:function(){return l.default.createElement(\"p\",a({},this.props,{className:(0,p.default)(this.props.className,\"form-control-static\"),ref:\"input\",key:\"input\"}),this.getValue())}}]),t}(d.default);m.propTypes={value:v.default,children:v.default},t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(186),c=r(l),p=a.default.createClass({displayName:\"Grid\",propTypes:{fluid:a.default.PropTypes.bool,componentClass:c.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass,t=this.props.fluid?\"container-fluid\":\"container\";return a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,t)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},u=n(4),l=r(u),c=n(198),p=r(c),f=n(196),d=r(f),h=n(213),v=r(h),m=n(217),y=r(m),g=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),a(t,[{key:\"render\",value:function(){return d.default.types.indexOf(this.props.type)>-1?((0,y.default)(\"Input type=\"+this.props.type,\"ButtonInput\"),l.default.createElement(d.default,this.props)):\"static\"===this.props.type?((0,y.default)(\"Input type=static\",\"StaticText\"),l.default.createElement(v.default.Static,this.props)):s(Object.getPrototypeOf(t.prototype),\"render\",this).call(this)}}]),t}(p.default);t.default=g,e.exports=t.default},function(e,t,n){(function(n){\"use strict\";function r(e,t,r){if(\"production\"!==n.env.NODE_ENV){if(\"undefined\"==typeof console||\"function\"!=typeof console.warn)return;var o=\"\"+e+\" is deprecated. Use \"+t+\" instead.\";console.warn(o),r&&console.warn(\"You can read more about it at \"+r)}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r,e.exports=t.default}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(187),u=r(s),l=/\\%\\((.+?)\\)s/,c=a.default.createClass({displayName:\"Interpolate\",propTypes:{component:a.default.PropTypes.node,format:a.default.PropTypes.string,unsafe:a.default.PropTypes.bool},getDefaultProps:function(){return{component:\"span\"}},render:function(){var e=u.default.hasValidComponent(this.props.children)||\"string\"==typeof this.props.children?this.props.children:this.props.format,t=this.props.component,n=this.props.unsafe===!0,r=o({},this.props);if(delete r.children,delete r.format,delete r.component,delete r.unsafe,n){var i=e.split(l).reduce(function(e,t,n){var o=void 0;if(n%2===0?o=t:(o=r[t],delete r[t]),a.default.isValidElement(o))throw new Error(\"cannot interpolate a React component into unsafe text\");return e+=o},\"\");return r.dangerouslySetInnerHTML={__html:i},a.default.createElement(t,r)}var s=e.split(l).reduce(function(e,t,n){var o=void 0;if(n%2===0){if(0===t.length)return e;o=t}else o=r[t],delete r[t];return e.push(o),e},[]);return a.default.createElement(t,r,s)}});t.default=c,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(186),c=r(l),p=a.default.createClass({displayName:\"Jumbotron\",propTypes:{componentClass:c.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass;return a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,\"jumbotron\")}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Label\",mixins:[c.default],getDefaultProps:function(){return{bsClass:\"label\",bsStyle:\"default\"}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"span\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=n(187),d=r(f),h=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){var e=this,t=d.default.map(this.props.children,function(e,t){return(0,u.cloneElement)(e,{key:e.key?e.key:t})}),n=!1;if(!this.props.children)return this.renderDiv(t);if(1!==l.default.Children.count(this.props.children)||Array.isArray(this.props.children))n=Array.prototype.some.call(this.props.children,function(t){return Array.isArray(t)?Array.prototype.some.call(t,function(t){return e.isAnchor(t.props)}):e.isAnchor(t.props)});else{var r=this.props.children;n=this.isAnchor(r.props)}return n?this.renderDiv(t):this.renderUL(t)}},{key:\"isAnchor\",value:function(e){return e.href||e.onClick}},{key:\"renderUL\",value:function(e){var t=d.default.map(e,function(e,t){return(0,u.cloneElement)(e,{listItem:!0})});return l.default.createElement(\"ul\",a({},this.props,{className:(0,p.default)(this.props.className,\"list-group\")}),t)}},{key:\"renderDiv\",value:function(e){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,\"list-group\")}),e)}}]),t}(l.default.Component);h.propTypes={className:l.default.PropTypes.string,id:l.default.PropTypes.string},t.default=h,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(184),u=r(s),l=n(183),c=r(l),p=a.default.createClass({displayName:\"ListGroupItem\",mixins:[u.default],propTypes:{bsStyle:a.default.PropTypes.oneOf([\"danger\",\"info\",\"success\",\"warning\"]),className:a.default.PropTypes.string,active:a.default.PropTypes.any,disabled:a.default.PropTypes.any,header:a.default.PropTypes.node,listItem:a.default.PropTypes.bool,onClick:a.default.PropTypes.func,eventKey:a.default.PropTypes.any,href:a.default.PropTypes.string,target:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"list-group-item\"}},render:function(){var e=this.getBsClassSet();return e.active=this.props.active,e.disabled=this.props.disabled,this.props.href||this.props.onClick?this.renderAnchor(e):this.props.listItem?this.renderLi(e):this.renderSpan(e)},renderLi:function(e){return a.default.createElement(\"li\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.header?this.renderStructuredContent():this.props.children)},renderAnchor:function(e){return a.default.createElement(\"a\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.header?this.renderStructuredContent():this.props.children)},renderSpan:function(e){return a.default.createElement(\"span\",o({},this.props,{className:(0,c.default)(this.props.className,e)}),this.props.header?this.renderStructuredContent():this.props.children)},renderStructuredContent:function(){var e=void 0;e=a.default.isValidElement(this.props.header)?(0,i.cloneElement)(this.props.header,{key:\"header\",className:(0,c.default)(this.props.header.props.className,\"list-group-item-heading\")}):a.default.createElement(\"h4\",{key:\"header\",className:\"list-group-item-heading\"},this.props.header);var t=a.default.createElement(\"p\",{key:\"content\",className:\"list-group-item-text\"},this.props.children);return[e,t]}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"MenuItem\",propTypes:{header:a.default.PropTypes.bool,divider:a.default.PropTypes.bool,href:a.default.PropTypes.string,title:a.default.PropTypes.string,target:a.default.PropTypes.string,onSelect:a.default.PropTypes.func,eventKey:a.default.PropTypes.any,active:a.default.PropTypes.bool,disabled:a.default.PropTypes.bool},getDefaultProps:function(){return{href:\"#\",active:!1}},handleClick:function(e){return this.props.disabled?void e.preventDefault():void(this.props.onSelect&&(e.preventDefault(),this.props.onSelect(this.props.eventKey,this.props.href,this.props.target)))},renderAnchor:function(){return a.default.createElement(\"a\",{onClick:this.handleClick,href:this.props.href,target:this.props.target,title:this.props.title,tabIndex:\"-1\"},this.props.children)},render:function(){var e={\"dropdown-header\":this.props.header,divider:this.props.divider,active:this.props.active,disabled:this.props.disabled},t=null;return this.props.header?t=this.props.children:this.props.divider||(t=this.renderAnchor()),a.default.createElement(\"li\",o({},this.props,{role:\"presentation\",title:null,href:null,className:(0,u.default)(this.props.className,e)}),t)}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){var n=N.default.ownerDocument(t);return e===n.body||e===n.documentElement?n.documentElement.clientHeight:e.clientHeight}function a(e){return e.props.container&&d.default.findDOMNode(e.props.container)||N.default.ownerDocument(e).body}function s(e,t){return function(n,r,o){var i=t;return void 0===n[e]&&(i=i.isRequired),i(n,r,o)}}function u(e){var t=[];return d.default.Children.forEach(e,function(e){return t.push(e)}),t}function l(e,t){var n=N.default.ownerDocument(e),r=!n.addEventListener,o=void 0;return V&&V.remove(),r?(document.attachEvent(\"onfocusin\",t),o=function(){return document.detachEvent(\"onfocusin\",t)}):(document.addEventListener(\"focus\",t,!0),o=function(){return document.removeEventListener(\"focus\",t,!0)}),V={remove:o}}function c(){if(void 0!==F)return F;var e=document.createElement(\"div\");e.style.position=\"absolute\",e.style.top=\"-9999px\",e.style.width=\"50px\",e.style.height=\"50px\",e.style.overflow=\"scroll\",document.body.appendChild(e),F=e.offsetWidth-e.clientWidth,document.body.removeChild(e),e=null}Object.defineProperty(t,\"__esModule\",{value:!0});var p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f=n(4),d=r(f),h=n(183),v=r(h),m=n(204),y=r(m),g=n(184),b=r(g),E=n(212),_=r(E),O=n(190),N=r(O),w=n(191),C=r(w),P=n(217),x=r(P),T=n(225),D=r(T),M=n(227),S=r(M),k=n(228),I=r(k),R=n(229),A=r(R),j=n(230),L=r(j),V=void 0,F=void 0,U=d.default.createClass({\ndisplayName:\"ModalMarkup\",mixins:[b.default,_.default],propTypes:{title:d.default.PropTypes.node,backdrop:d.default.PropTypes.oneOf([\"static\",!0,!1]),keyboard:d.default.PropTypes.bool,closeButton:d.default.PropTypes.bool,animation:d.default.PropTypes.bool,onHide:s(\"onRequestHide\",d.default.PropTypes.func),onRequestHide:d.default.PropTypes.func,dialogClassName:d.default.PropTypes.string,autoFocus:d.default.PropTypes.bool,enforceFocus:d.default.PropTypes.bool},getDefaultProps:function(){return{bsClass:\"modal\",backdrop:!0,keyboard:!0,animation:!0,closeButton:!0,autoFocus:!0,enforceFocus:!0}},getInitialState:function(){return{}},render:function(){var e=this.state,t=p({},e.dialogStyles,{display:\"block\"}),n=this.getBsClassSet();delete n.modal,n[\"modal-dialog\"]=!0;var r={modal:!0,fade:this.props.animation,in:!this.props.animation},o=d.default.createElement(\"div\",p({},this.props,{title:null,tabIndex:\"-1\",role:\"dialog\",style:t,className:(0,v.default)(this.props.className,r),onClick:this.props.backdrop===!0?this.handleBackdropClick:null,ref:\"modal\"}),d.default.createElement(\"div\",{className:(0,v.default)(this.props.dialogClassName,n)},d.default.createElement(\"div\",{className:\"modal-content\",role:\"document\"},this.renderContent())));return this.props.backdrop?this.renderBackdrop(o,e.backdropStyles):o},renderContent:function(){var e=this,t=u(this.props.children),n=t.some(function(e){return e.type.__isModalHeader});return n||null==this.props.title||((0,x.default)(\"Specifying `closeButton` or `title` Modal props\",\"the new Modal.Header, and Modal.Title components\"),t.unshift(d.default.createElement(I.default,{closeButton:this.props.closeButton,onHide:this._getHide()},this.props.title&&d.default.createElement(A.default,null,this.props.title)))),d.default.Children.map(t,function(t){return t.type.__isModalHeader?(0,f.cloneElement)(t,{onHide:(0,y.default)(e._getHide(),t.props.onHide)}):t})},renderBackdrop:function(e){var t={\"modal-backdrop\":!0,fade:this.props.animation,in:!this.props.animation},n=this.props.backdrop===!0?this.handleBackdropClick:null;return d.default.createElement(\"div\",null,d.default.createElement(\"div\",{className:(0,v.default)(t),ref:\"backdrop\",onClick:n}),e)},_getHide:function(){return!this.props.onHide&&this.props.onRequestHide&&(0,x.default)(\"The Modal prop `onRequestHide`\",\"the `onHide` prop\"),this.props.onHide||this.props.onRequestHide},iosClickHack:function(){d.default.findDOMNode(this.refs.modal).onclick=function(){},d.default.findDOMNode(this.refs.backdrop).onclick=function(){}},componentWillMount:function(){this.checkForFocus()},componentDidMount:function(){var e=this,t=N.default.ownerDocument(this),n=N.default.ownerWindow(this);this._onDocumentKeyupListener=C.default.listen(t,\"keyup\",this.handleDocumentKeyUp),this._onWindowResizeListener=C.default.listen(n,\"resize\",this.handleWindowResize),this.props.enforceFocus&&(this._onFocusinListener=l(this,this.enforceFocus));var r=a(this);r.className+=r.className.length?\" modal-open\":\"modal-open\",this._containerIsOverflowing=r.scrollHeight>i(r,this),this._originalPadding=r.style.paddingRight,this._containerIsOverflowing&&(r.style.paddingRight=parseInt(this._originalPadding||0,10)+c()+\"px\"),this.props.backdrop&&this.iosClickHack(),this.setState(this._getStyles(),function(){return e.focusModalContent()})},componentDidUpdate:function(e){if(this.props.backdrop&&this.props.backdrop!==e.backdrop&&(this.iosClickHack(),this.setState(this._getStyles())),this.props.container!==e.container){var t=a(this);this._containerIsOverflowing=t.scrollHeight>i(t,this)}},componentWillUnmount:function(){this._onDocumentKeyupListener.remove(),this._onWindowResizeListener.remove(),this._onFocusinListener&&this._onFocusinListener.remove();var e=a(this);e.style.paddingRight=this._originalPadding,e.className=e.className.replace(/ ?modal-open/,\"\"),this.restoreLastFocus()},handleBackdropClick:function(e){e.target===e.currentTarget&&this._getHide()()},handleDocumentKeyUp:function(e){this.props.keyboard&&27===e.keyCode&&this._getHide()()},handleWindowResize:function(){this.setState(this._getStyles())},checkForFocus:function(){if(N.default.canUseDom)try{this.lastFocus=document.activeElement}catch(e){}},focusModalContent:function(){var e=d.default.findDOMNode(this.refs.modal),t=N.default.activeElement(this),n=t&&N.default.contains(e,t);this.props.autoFocus&&!n&&(this.lastFocus=t,e.focus())},restoreLastFocus:function(){this.lastFocus&&(this.lastFocus.focus(),this.lastFocus=null)},enforceFocus:function(){if(this.isMounted()){var e=N.default.activeElement(this),t=d.default.findDOMNode(this.refs.modal);t===e||N.default.contains(t,e)||t.focus()}},_getStyles:function(){if(!N.default.canUseDom)return{};var e=d.default.findDOMNode(this.refs.modal),t=e.scrollHeight,n=a(this),r=this._containerIsOverflowing,o=t>i(n,this);return{dialogStyles:{paddingRight:r&&!o?c():void 0,paddingLeft:!r&&o?c():void 0}}}}),B=d.default.createClass({displayName:\"Modal\",propTypes:p({},D.default.propTypes,U.propTypes),defaultProps:{show:null},render:function(){var e=this.props,t=e.show,n=o(e,[\"show\"]),r=d.default.createElement(U,n,this.props.children);return this.props.__isUsedInModalTrigger||null==t?r:d.default.createElement(D.default,{container:n.container},t&&r)}});B.Body=S.default,B.Header=I.default,B.Title=A.default,B.Footer=L.default,t.default=B,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(186),s=r(a),u=n(226),l=i.default.createClass({displayName:\"Portal\",propTypes:{container:s.default.mountable},mixins:[u.OverlayMixin],renderOverlay:function(){return this.props.children?i.default.Children.only(this.props.children):null},render:function(){return null}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(186),u=r(s),l=n(190),c=r(l),p=n(217),f=r(p),d={propTypes:{container:u.default.mountable},componentDidMount:function(){this._renderOverlay()},componentDidUpdate:function(){this._renderOverlay()},componentWillUnmount:function(){this._unrenderOverlay(),this._mountOverlayTarget()},_mountOverlayTarget:function(){this._overlayTarget||(this._overlayTarget=document.createElement(\"div\"),this.getContainerDOMNode().appendChild(this._overlayTarget))},_unmountOverlayTarget:function(){this._overlayTarget&&(this.getContainerDOMNode().removeChild(this._overlayTarget),this._overlayTarget=null)},_renderOverlay:function(){var e=this.renderOverlay();null!==e?(this._mountOverlayTarget(),this._overlayInstance=a.default.render(e,this._overlayTarget)):(this._unrenderOverlay(),this._unmountOverlayTarget())},_unrenderOverlay:function(){this._overlayTarget&&(a.default.unmountComponentAtNode(this._overlayTarget),this._overlayInstance=null)},getOverlayDOMNode:function(){if(!this.isMounted())throw new Error(\"getOverlayDOMNode(): A component must be mounted to have a DOM node.\");return this._overlayInstance?a.default.findDOMNode(this._overlayInstance):null},getContainerDOMNode:function(){return a.default.findDOMNode(this.props.container)||c.default.ownerDocument(this).body}};t.OverlayMixin=d,t.default=o({},d,{componentWillMount:function(){(0,f.default)(\"Overlay mixin\",\"the `<Portal/>` Component\",\"http://react-bootstrap.github.io/components.html#utilities-portal\")}})},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,this.props.modalClassName)}),this.props.children)}}]),t}(l.default.Component);f.propTypes={modalClassName:l.default.PropTypes.string},f.defaultProps={modalClassName:\"modal-body\"},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,this.props.modalClassName)}),this.props.closeButton&&l.default.createElement(\"button\",{className:\"close\",\"aria-label\":this.props[\"aria-label\"]||\"Close\",onClick:this.props.onHide,style:{marginTop:-2}},l.default.createElement(\"span\",{\"aria-hidden\":\"true\"},\"×\")),this.props.children)}}]),t}(l.default.Component);f.__isModalHeader=!0,f.propTypes={modalClassName:l.default.PropTypes.string,closeButton:l.default.PropTypes.bool,onHide:l.default.PropTypes.func},f.defaultProps={modalClassName:\"modal-header\",closeButton:!1},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"h4\",a({},this.props,{className:(0,p.default)(this.props.className,\"modal-title\")}),this.props.children)}}]),t}(l.default.Component);f.propTypes={modalClassName:l.default.PropTypes.string},f.defaultProps={modalClassName:\"modal-title\"},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=n(4),l=r(u),c=n(183),p=r(c),f=function(e){function t(){o(this,t),null!=e&&e.apply(this,arguments)}return i(t,e),s(t,[{key:\"render\",value:function(){return l.default.createElement(\"div\",a({},this.props,{className:(0,p.default)(this.props.className,this.props.modalClassName)}),this.props.children)}}]),t}(l.default.Component);f.propTypes={modalClassName:l.default.PropTypes.string},f.defaultProps={modalClassName:\"modal-footer\"},t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(184),u=r(s),l=n(202),c=r(l),p=n(183),f=r(p),d=n(190),h=r(d),v=n(187),m=r(v),y=n(204),g=r(y),b=a.default.createClass({displayName:\"Nav\",mixins:[u.default,c.default],propTypes:{activeHref:a.default.PropTypes.string,activeKey:a.default.PropTypes.any,bsStyle:a.default.PropTypes.oneOf([\"tabs\",\"pills\"]),stacked:a.default.PropTypes.bool,justified:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,collapsible:a.default.PropTypes.bool,expanded:a.default.PropTypes.bool,navbar:a.default.PropTypes.bool,eventKey:a.default.PropTypes.any,pullRight:a.default.PropTypes.bool,right:a.default.PropTypes.bool},getDefaultProps:function(){return{bsClass:\"nav\"}},getCollapsibleDOMNode:function(){return a.default.findDOMNode(this)},getCollapsibleDimensionValue:function(){var e=a.default.findDOMNode(this.refs.ul),t=e.offsetHeight,n=h.default.getComputedStyles(e);return t+parseInt(n.marginTop,10)+parseInt(n.marginBottom,10)},render:function(){var e=this.props.collapsible?this.getCollapsibleClassSet(\"navbar-collapse\"):null;return this.props.navbar&&!this.props.collapsible?this.renderUl():a.default.createElement(\"nav\",o({},this.props,{className:(0,f.default)(this.props.className,e)}),this.renderUl())},renderUl:function(){var e=this.getBsClassSet();return e[\"nav-stacked\"]=this.props.stacked,e[\"nav-justified\"]=this.props.justified,e[\"navbar-nav\"]=this.props.navbar,e[\"pull-right\"]=this.props.pullRight,e[\"navbar-right\"]=this.props.right,a.default.createElement(\"ul\",o({},this.props,{role:\"tabs\"===this.props.bsStyle?\"tablist\":null,className:(0,f.default)(this.props.className,e),ref:\"ul\"}),m.default.map(this.props.children,this.renderNavItem))},getChildActiveProp:function(e){return!!e.props.active||(null!=this.props.activeKey&&e.props.eventKey===this.props.activeKey||(null!=this.props.activeHref&&e.props.href===this.props.activeHref||e.props.active))},renderNavItem:function(e,t){return(0,i.cloneElement)(e,{role:\"tabs\"===this.props.bsStyle?\"tab\":null,active:this.getChildActiveProp(e),activeKey:this.props.activeKey,activeHref:this.props.activeHref,onSelect:(0,g.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t,navItem:!0})}});t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(184),u=r(s),l=n(183),c=r(l),p=n(187),f=r(p),d=n(204),h=r(d),v=n(186),m=r(v),y=a.default.createClass({displayName:\"Navbar\",mixins:[u.default],propTypes:{fixedTop:a.default.PropTypes.bool,fixedBottom:a.default.PropTypes.bool,staticTop:a.default.PropTypes.bool,inverse:a.default.PropTypes.bool,fluid:a.default.PropTypes.bool,role:a.default.PropTypes.string,componentClass:m.default.elementType,brand:a.default.PropTypes.node,toggleButton:a.default.PropTypes.node,toggleNavKey:a.default.PropTypes.oneOfType([a.default.PropTypes.string,a.default.PropTypes.number]),onToggle:a.default.PropTypes.func,navExpanded:a.default.PropTypes.bool,defaultNavExpanded:a.default.PropTypes.bool},getDefaultProps:function(){return{bsClass:\"navbar\",bsStyle:\"default\",role:\"navigation\",componentClass:\"nav\"}},getInitialState:function(){return{navExpanded:this.props.defaultNavExpanded}},shouldComponentUpdate:function(){return!this._isChanging},handleToggle:function(){this.props.onToggle&&(this._isChanging=!0,this.props.onToggle(),this._isChanging=!1),this.setState({navExpanded:!this.state.navExpanded})},isNavExpanded:function(){return null!=this.props.navExpanded?this.props.navExpanded:this.state.navExpanded},render:function(){var e=this.getBsClassSet(),t=this.props.componentClass;return e[\"navbar-fixed-top\"]=this.props.fixedTop,e[\"navbar-fixed-bottom\"]=this.props.fixedBottom,e[\"navbar-static-top\"]=this.props.staticTop,e[\"navbar-inverse\"]=this.props.inverse,a.default.createElement(t,o({},this.props,{className:(0,c.default)(this.props.className,e)}),a.default.createElement(\"div\",{className:this.props.fluid?\"container-fluid\":\"container\"},this.props.brand||this.props.toggleButton||null!=this.props.toggleNavKey?this.renderHeader():null,f.default.map(this.props.children,this.renderChild)))},renderChild:function(e,t){return(0,i.cloneElement)(e,{navbar:!0,collapsible:null!=this.props.toggleNavKey&&this.props.toggleNavKey===e.props.eventKey,expanded:null!=this.props.toggleNavKey&&this.props.toggleNavKey===e.props.eventKey&&this.isNavExpanded(),key:e.key?e.key:t})},renderHeader:function(){var e=void 0;return this.props.brand&&(e=a.default.isValidElement(this.props.brand)?(0,i.cloneElement)(this.props.brand,{className:(0,c.default)(this.props.brand.props.className,\"navbar-brand\")}):a.default.createElement(\"span\",{className:\"navbar-brand\"},this.props.brand)),a.default.createElement(\"div\",{className:\"navbar-header\"},e,this.props.toggleButton||null!=this.props.toggleNavKey?this.renderToggleButton():null)},renderToggleButton:function(){var e=void 0;return a.default.isValidElement(this.props.toggleButton)?(0,i.cloneElement)(this.props.toggleButton,{className:(0,c.default)(this.props.toggleButton.props.className,\"navbar-toggle\"),onClick:(0,h.default)(this.handleToggle,this.props.toggleButton.props.onClick)}):(e=null!=this.props.toggleButton?this.props.toggleButton:[a.default.createElement(\"span\",{className:\"sr-only\",key:0},\"Toggle navigation\"),a.default.createElement(\"span\",{className:\"icon-bar\",key:1}),a.default.createElement(\"span\",{className:\"icon-bar\",key:2}),a.default.createElement(\"span\",{className:\"icon-bar\",key:3})],a.default.createElement(\"button\",{className:\"navbar-toggle\",type:\"button\",onClick:this.handleToggle},e))}});t.default=y,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(183),l=r(u),c=n(184),p=r(c),f=s.default.createClass({displayName:\"NavItem\",mixins:[p.default],propTypes:{linkId:s.default.PropTypes.string,onSelect:s.default.PropTypes.func,active:s.default.PropTypes.bool,disabled:s.default.PropTypes.bool,href:s.default.PropTypes.string,role:s.default.PropTypes.string,title:s.default.PropTypes.node,eventKey:s.default.PropTypes.any,target:s.default.PropTypes.string,\"aria-controls\":s.default.PropTypes.string},getDefaultProps:function(){return{href:\"#\"}},render:function(){var e=this.props,t=e.role,n=e.linkId,r=e.disabled,a=e.active,u=e.href,c=e.title,p=e.target,f=e.children,d=e[\"aria-controls\"],h=o(e,[\"role\",\"linkId\",\"disabled\",\"active\",\"href\",\"title\",\"target\",\"children\",\"aria-controls\"]),v={active:a,disabled:r},m={role:t,href:u,title:c,target:p,id:n,onClick:this.handleClick,ref:\"anchor\"};return t||\"#\"!==u||(m.role=\"button\"),s.default.createElement(\"li\",i({},h,{role:\"presentation\",className:(0,l.default)(h.className,v)}),s.default.createElement(\"a\",i({},m,{\"aria-selected\":a,\"aria-controls\":d}),f))},handleClick:function(e){this.props.onSelect&&(e.preventDefault(),this.props.disabled||this.props.onSelect(this.props.eventKey,this.props.href,this.props.target))}});t.default=f,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];return(0,c.default)(\"The Modal prop `onRequestHide`\",\"the `onHide` prop\"),e.apply(void 0,n)}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(4),a=r(i),s=n(186),u=r(s),l=n(217),c=r(l),p=n(204),f=r(p),d=n(235),h=r(d),v=n(226),m=a.default.createClass({displayName:\"ModalTrigger\",mixins:[v.OverlayMixin],propTypes:{modal:a.default.PropTypes.node.isRequired,container:u.default.mountable,onBlur:a.default.PropTypes.func,onFocus:a.default.PropTypes.func,onMouseOut:a.default.PropTypes.func,onMouseOver:a.default.PropTypes.func},getInitialState:function(){return{isOverlayShown:!1}},show:function(){this.setState({isOverlayShown:!0})},hide:function(){this.setState({isOverlayShown:!1})},toggle:function(){this.setState({isOverlayShown:!this.state.isOverlayShown})},renderOverlay:function(){var e=this.props.modal;return this.state.isOverlayShown?(0,i.cloneElement)(e,{onHide:this.hide,onRequestHide:o(this.hide),__isUsedInModalTrigger:!0}):a.default.createElement(\"span\",null)},render:function(){var e=a.default.Children.only(this.props.children),t={};return t.onClick=(0,f.default)(e.props.onClick,this.toggle),t.onMouseOver=(0,f.default)(e.props.onMouseOver,this.props.onMouseOver),t.onMouseOut=(0,f.default)(e.props.onMouseOut,this.props.onMouseOut),t.onFocus=(0,f.default)(e.props.onFocus,this.props.onFocus),t.onBlur=(0,f.default)(e.props.onBlur,this.props.onBlur),(0,i.cloneElement)(e,t)}});m.withContext=(0,h.default)(m,\"modal\");var y=a.default.createClass({displayName:\"DepreciatedModalTrigger\",componentWillMount:function(){(0,c.default)(\"The `ModalTrigger` component\",\"the `Modal` component directly\",\"http://react-bootstrap.github.io/components.html#modals\")},render:function(){return a.default.createElement(m,this.props)}});y.withContext=m.withContext,y.ModalTrigger=m,t.default=y,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}function s(e,t){return function(n){var r=function(e){function t(){i(this,t),null!=e&&e.apply(this,arguments)}return a(t,e),l(t,[{key:\"getChildContext\",value:function(){return this.props.context}},{key:\"render\",value:function(){var e=this.props,t=e.wrapped,n=(e.context,o(e,[\"wrapped\",\"context\"]));return p.default.cloneElement(t,n)}}]),t}(p.default.Component);r.childContextTypes=n;var s=function(){function n(){i(this,n)}return l(n,[{key:\"render\",value:function(){var n=u({},this.props);return n[t]=this.getWrappedOverlay(),p.default.createElement(e,n,this.props.children)}},{key:\"getWrappedOverlay\",value:function(){return p.default.createElement(r,{context:this.context,wrapped:this.props[t]})}}]),n}();return s.contextTypes=n,s}}Object.defineProperty(t,\"__esModule\",{value:!0});var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();t.default=s;var c=n(4),p=r(c);e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return Array.isArray(t)?t.indexOf(e)>=0:e===t}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(204),l=r(u),c=n(235),p=r(c),f=n(237),d=r(f),h=n(239),v=r(h),m=n(217),y=r(m),g=n(18),b=r(g),E=s.default.createClass({displayName:\"OverlayTrigger\",propTypes:i({},d.default.propTypes,{trigger:s.default.PropTypes.oneOfType([s.default.PropTypes.oneOf([\"manual\",\"click\",\"hover\",\"focus\"]),s.default.PropTypes.arrayOf(s.default.PropTypes.oneOf([\"click\",\"hover\",\"focus\"]))]),delay:s.default.PropTypes.number,delayShow:s.default.PropTypes.number,delayHide:s.default.PropTypes.number,defaultOverlayShown:s.default.PropTypes.bool,overlay:s.default.PropTypes.node.isRequired,onBlur:s.default.PropTypes.func,onClick:s.default.PropTypes.func,onFocus:s.default.PropTypes.func,onMouseEnter:s.default.PropTypes.func,onMouseLeave:s.default.PropTypes.func,target:function(){},onHide:function(){},show:function(){}}),getDefaultProps:function(){return{trigger:[\"hover\",\"focus\"]}},getInitialState:function(){return{isOverlayShown:null!=this.props.defaultOverlayShown&&this.props.defaultOverlayShown}},show:function(){this.setState({isOverlayShown:!0})},hide:function(){this.setState({isOverlayShown:!1})},toggle:function(){this.state.isOverlayShown?this.hide():this.show()},componentDidMount:function(){this._mountNode=document.createElement(\"div\"),s.default.render(this._overlay,this._mountNode)},componentWillUnmount:function(){s.default.unmountComponentAtNode(this._mountNode),this._mountNode=null,clearTimeout(this._hoverDelay)},componentDidUpdate:function(){s.default.render(this._overlay,this._mountNode)},getOverlay:function(){var e=this,t={show:this.state.isOverlayShown,onHide:this.hide,rootClose:this.props.rootClose,target:function(){return s.default.findDOMNode(e)},placement:this.props.placement,container:this.props.container,containerPadding:this.props.containerPadding},n=(0,a.cloneElement)(this.props.overlay,{placement:t.placement,container:t.container});return s.default.createElement(d.default,t,n)},render:function(){var e=s.default.Children.only(this.props.children),t={\"aria-describedby\":this.props.overlay.props.id};return this._overlay=this.getOverlay(),\"manual\"!==this.props.trigger?(t.onClick=(0,l.default)(e.props.onClick,this.props.onClick),o(\"click\",this.props.trigger)&&(t.onClick=(0,l.default)(this.toggle,t.onClick)),o(\"hover\",this.props.trigger)&&((0,b.default)(!(\"hover\"===this.props.trigger),'[react-bootstrap] Specifying only the `\"hover\"` trigger limits the visibilty of the overlay to just mouse users. Consider also including the `\"focus\"` trigger so that touch and keyboard only users can see the overlay as well.'),t.onMouseOver=(0,l.default)(this.handleDelayedShow,this.props.onMouseOver),t.onMouseOut=(0,l.default)(this.handleDelayedHide,this.props.onMouseOut)),o(\"focus\",this.props.trigger)&&(t.onFocus=(0,l.default)(this.handleDelayedShow,this.props.onFocus),t.onBlur=(0,l.default)(this.handleDelayedHide,this.props.onBlur))):(0,y.default)('\"manual\" trigger type',\" the Overlay component\"),(0,a.cloneElement)(e,t)},handleDelayedShow:function(){var e=this;if(null!=this._hoverDelay)return clearTimeout(this._hoverDelay),void(this._hoverDelay=null);var t=null!=this.props.delayShow?this.props.delayShow:this.props.delay;return t?void(this._hoverDelay=setTimeout(function(){e._hoverDelay=null,e.show()},t)):void this.show()},handleDelayedHide:function(){var e=this;if(null!=this._hoverDelay)return clearTimeout(this._hoverDelay),void(this._hoverDelay=null);var t=null!=this.props.delayHide?this.props.delayHide:this.props.delay;return t?void(this._hoverDelay=setTimeout(function(){e._hoverDelay=null,e.hide()},t)):void this.hide()},calcOverlayPosition:function(){var e=this.props.overlay;return(0,y.default)(\"OverlayTrigger.calcOverlayPosition()\",\"utils/overlayPositionUtils\"),v.default.calcOverlayPosition(e.props.placement||this.props.placement,s.default.findDOMNode(e),s.default.findDOMNode(this),s.default.findDOMNode(e.props.container||this.props.container),e.props.containerPadding||this.props.containerPadding)},getPosition:function(){(0,y.default)(\"OverlayTrigger.getPosition()\",\"utils/overlayPositionUtils\");var e=this.props.overlay;return v.default.getPosition(s.default.findDOMNode(this),s.default.findDOMNode(e.props.container||this.props.container))}});E.withContext=(0,p.default)(E,\"overlay\"),t.default=E,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},c=n(4),p=r(c),f=n(225),d=r(f),h=n(238),v=r(h),m=n(240),y=r(m),g=function(e){function t(e,n){i(this,t),l(Object.getPrototypeOf(t.prototype),\"constructor\",this).call(this,e,n)}return a(t,e),u(t,[{key:\"render\",value:function(){var e=this.props,t=e.container,n=e.containerPadding,r=e.target,i=e.placement,a=e.rootClose,s=o(e,[\"container\",\"containerPadding\",\"target\",\"placement\",\"rootClose\"]),u=p.default.createElement(v.default,{container:t,containerPadding:n,target:r,placement:i},this.props.children);return a&&(u=p.default.createElement(y.default,{onRootClose:this.props.onHide},u)),p.default.createElement(d.default,{container:t,rootClose:a,onRootClose:this.props.onHide},s.show&&u)}}]),t}(p.default.Component);g.propTypes=s({},d.default.propTypes,v.default.propTypes,{show:p.default.PropTypes.bool,rootClose:p.default.PropTypes.bool,onHide:p.default.PropTypes.func}),t.default=g,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\");\n}function a(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},c=n(4),p=r(c),f=n(190),d=r(f),h=n(239),v=n(186),m=r(v),y=function(e){function t(e,n){i(this,t),l(Object.getPrototypeOf(t.prototype),\"constructor\",this).call(this,e,n),this.state={positionLeft:null,positionTop:null,arrowOffsetLeft:null,arrowOffsetTop:null}}return a(t,e),u(t,[{key:\"componentWillMount\",value:function(){this._needsFlush=!0}},{key:\"componentWillRecieveProps\",value:function(){this._needsFlush=!0}},{key:\"componentDidMount\",value:function(){this._maybeUpdatePosition()}},{key:\"componentDidUpate\",value:function(){this._maybeUpdatePosition()}},{key:\"render\",value:function(){var e=this.props,t=e.placement,n=e.children,r=this.props.target?this.state:{},i=r.positionLeft,a=r.positionTop,u=o(r,[\"positionLeft\",\"positionTop\"]);return(0,c.cloneElement)(p.default.Children.only(n),s({},u,{placement:t,positionTop:a,positionLeft:i,style:s({},n.props.style,{left:i,top:a})}))}},{key:\"_maybeUpdatePosition\",value:function(){this._needsFlush&&(this._needsFlush=!1,this._updatePosition())}},{key:\"_updatePosition\",value:function(){if(null!=this.props.target){var e=p.default.findDOMNode(this.props.target(this.props)),t=p.default.findDOMNode(this.props.container)||d.default.ownerDocument(this).body;this.setState((0,h.calcOverlayPosition)(this.props.placement,p.default.findDOMNode(this),e,t,this.props.containerPadding))}}}]),t}(p.default.Component);y.propTypes={target:p.default.PropTypes.func,container:m.default.mountable,containerPadding:p.default.PropTypes.number,placement:p.default.PropTypes.oneOf([\"top\",\"right\",\"bottom\",\"left\"])},y.defaultProps={containerPadding:0,placement:\"right\"},t.default=y,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n,r){var o=l.getContainerDimensions(n),i=o.scroll,a=o.height,s=e-r-i,u=e+r-i+t;return s<0?-s:u>a?a-u:0}function i(e,t,n,r){var o=l.getContainerDimensions(n),i=o.width,a=e-r,s=e+r+t;return a<0?-a:s>i?i-s:0}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(190),u=r(s),l={getContainerDimensions:function(e){var t=void 0,n=void 0,r=void 0;return\"BODY\"===e.tagName?(t=window.innerWidth,n=window.innerHeight,r=u.default.ownerDocument(e).documentElement.scrollTop||e.scrollTop):(t=e.offsetWidth,n=e.offsetHeight,r=e.scrollTop),{width:t,height:n,scroll:r}},getPosition:function(e,t){var n=\"BODY\"===t.tagName?u.default.getOffset(e):u.default.getPosition(e,t);return a({},n,{height:e.offsetHeight,width:e.offsetWidth})},calcOverlayPosition:function(e,t,n,r,a){var s=l.getPosition(n,r),u=t.offsetHeight,c=t.offsetWidth,p=void 0,f=void 0,d=void 0,h=void 0;if(\"left\"===e||\"right\"===e){f=s.top+(s.height-u)/2,p=\"left\"===e?s.left-c:s.left+s.width;var v=o(f,u,r,a);f+=v,h=50*(1-2*v/u)+\"%\",d=null}else{if(\"top\"!==e&&\"bottom\"!==e)throw new Error('calcOverlayPosition(): No such placement of \"'+e+'\" found.');p=s.left+(s.width-c)/2,f=\"top\"===e?s.top-u:s.top+s.height;var m=i(p,c,r,a);p+=m,d=50*(1-2*m/c)+\"%\",h=null}return{positionLeft:p,positionTop:f,arrowOffsetLeft:d,arrowOffsetTop:h}}};t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function i(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)}Object.defineProperty(t,\"__esModule\",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;s=l=u=void 0,r=!1;var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0}},u=n(4),l=r(u),c=n(190),p=r(c),f=n(191),d=r(f),h=function(e){function t(e){o(this,t),s(Object.getPrototypeOf(t.prototype),\"constructor\",this).call(this,e),this.handleDocumentClick=this.handleDocumentClick.bind(this),this.handleDocumentKeyUp=this.handleDocumentKeyUp.bind(this)}return i(t,e),a(t,[{key:\"bindRootCloseHandlers\",value:function(){var e=p.default.ownerDocument(this);this._onDocumentClickListener=d.default.listen(e,\"click\",this.handleDocumentClick),this._onDocumentKeyupListener=d.default.listen(e,\"keyup\",this.handleDocumentKeyUp)}},{key:\"handleDocumentClick\",value:function(e){var t=e.target||e.srcElement;p.default.contains(l.default.findDOMNode(this),t)||this.props.onRootClose()}},{key:\"handleDocumentKeyUp\",value:function(e){27===e.keyCode&&this.props.onRootClose()}},{key:\"unbindRootCloseHandlers\",value:function(){this._onDocumentClickListener&&this._onDocumentClickListener.remove(),this._onDocumentKeyupListener&&this._onDocumentKeyupListener.remove()}},{key:\"componentDidMount\",value:function(){this.bindRootCloseHandlers()}},{key:\"render\",value:function(){return l.default.Children.only(this.props.children)}},{key:\"componentWillUnmount\",value:function(){this.unbindRootCloseHandlers()}}]),t}(l.default.Component);t.default=h,h.propTypes={onRootClose:l.default.PropTypes.func.isRequired},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"PageHeader\",render:function(){return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,\"page-header\")}),a.default.createElement(\"h1\",null,this.props.children))}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(243),f=r(p),d=a.default.createClass({displayName:\"Pagination\",mixins:[c.default],propTypes:{activePage:a.default.PropTypes.number,items:a.default.PropTypes.number,maxButtons:a.default.PropTypes.number,ellipsis:a.default.PropTypes.bool,first:a.default.PropTypes.bool,last:a.default.PropTypes.bool,prev:a.default.PropTypes.bool,next:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func},getDefaultProps:function(){return{activePage:1,items:1,maxButtons:0,first:!1,last:!1,prev:!1,next:!1,ellipsis:!0,bsClass:\"pagination\"}},renderPageButtons:function(){var e=[],t=void 0,n=void 0,r=void 0,o=this.props,i=o.maxButtons,s=o.activePage,u=o.items,l=o.onSelect,c=o.ellipsis;if(i){var p=s-parseInt(i/2);t=p>1?p:1,r=t+i<=u,r?n=t+i-1:(n=u,t=u-i+1)}else t=1,n=u;for(var d=t;d<=n;d++)e.push(a.default.createElement(f.default,{key:d,eventKey:d,active:d===s,onSelect:l},d));return i&&r&&c&&e.push(a.default.createElement(f.default,{key:\"ellipsis\",disabled:!0},a.default.createElement(\"span\",{\"aria-label\":\"More\"},\"...\"))),e},renderPrev:function(){return this.props.prev?a.default.createElement(f.default,{key:\"prev\",eventKey:this.props.activePage-1,disabled:1===this.props.activePage,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"Previous\"},\"‹\")):null},renderNext:function(){return this.props.next?a.default.createElement(f.default,{key:\"next\",eventKey:this.props.activePage+1,disabled:this.props.activePage===this.props.items,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"Next\"},\"›\")):null},renderFirst:function(){return this.props.first?a.default.createElement(f.default,{key:\"first\",eventKey:1,disabled:1===this.props.activePage,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"First\"},\"«\")):null},renderLast:function(){return this.props.last?a.default.createElement(f.default,{key:\"last\",eventKey:this.props.items,disabled:this.props.activePage===this.props.items,onSelect:this.props.onSelect},a.default.createElement(\"span\",{\"aria-label\":\"Last\"},\"»\")):null},render:function(){return a.default.createElement(\"ul\",o({},this.props,{className:(0,u.default)(this.props.className,this.getBsClassSet())}),this.renderFirst(),this.renderPrev(),this.renderPageButtons(),this.renderNext(),this.renderLast())}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(4),i=r(o),a=n(183),s=r(a),u=n(184),l=r(u),c=n(244),p=r(c),f=i.default.createClass({displayName:\"PaginationButton\",mixins:[l.default],propTypes:{className:i.default.PropTypes.string,eventKey:i.default.PropTypes.oneOfType([i.default.PropTypes.string,i.default.PropTypes.number]),onSelect:i.default.PropTypes.func,disabled:i.default.PropTypes.bool,active:i.default.PropTypes.bool},getDefaultProps:function(){return{active:!1,disabled:!1}},handleClick:function(e){if(e.preventDefault(),this.props.onSelect){var t=(0,p.default)(this.props.eventKey);this.props.onSelect(e,t)}},render:function(){var e=this.getBsClassSet();return e.active=this.props.active,e.disabled=this.props.disabled,i.default.createElement(\"li\",{className:(0,s.default)(this.props.className,e)},i.default.createElement(\"a\",{href:\"#\",onClick:this.handleClick},this.props.children))}});t.default=f,e.exports=t.default},function(e,t){\"use strict\";function n(e){var t=!1;return{eventKey:e,preventSelection:function(){t=!0},isSelectionPrevented:function(){return t}}}Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=n,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(202),f=r(p),d=a.default.createClass({displayName:\"Panel\",mixins:[c.default,f.default],propTypes:{collapsible:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,header:a.default.PropTypes.node,id:a.default.PropTypes.string,footer:a.default.PropTypes.node,eventKey:a.default.PropTypes.any},getDefaultProps:function(){return{bsClass:\"panel\",bsStyle:\"default\"}},handleSelect:function(e){e.selected=!0,this.props.onSelect?this.props.onSelect(e,this.props.eventKey):e.preventDefault(),e.selected&&this.handleToggle()},handleToggle:function(){this.setState({expanded:!this.state.expanded})},getCollapsibleDimensionValue:function(){return a.default.findDOMNode(this.refs.panel).scrollHeight},getCollapsibleDOMNode:function(){return this.isMounted()&&this.refs&&this.refs.panel?a.default.findDOMNode(this.refs.panel):null},render:function(){return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,this.getBsClassSet()),id:this.props.collapsible?null:this.props.id,onSelect:null}),this.renderHeading(),this.props.collapsible?this.renderCollapsibleBody():this.renderBody(),this.renderFooter())},renderCollapsibleBody:function(){var e=this.prefixClass(\"collapse\");return a.default.createElement(\"div\",{className:(0,u.default)(this.getCollapsibleClassSet(e)),id:this.props.id,ref:\"panel\",\"aria-expanded\":this.isExpanded()?\"true\":\"false\"},this.renderBody())},renderBody:function(){function e(){return{key:u.length}}function t(t){u.push((0,i.cloneElement)(t,e()))}function n(t){u.push(a.default.createElement(\"div\",o({className:c},e()),t))}function r(){0!==l.length&&(n(l),l=[])}var s=this.props.children,u=[],l=[],c=this.prefixClass(\"body\");return Array.isArray(s)&&0!==s.length?(s.forEach(function(e){this.shouldRenderFill(e)?(r(),t(e)):l.push(e)}.bind(this)),r()):this.shouldRenderFill(s)?t(s):n(s),u},shouldRenderFill:function(e){return a.default.isValidElement(e)&&null!=e.props.fill},renderHeading:function(){var e=this.props.header;if(!e)return null;if(!a.default.isValidElement(e)||Array.isArray(e))e=this.props.collapsible?this.renderCollapsibleTitle(e):e;else{var t=(0,u.default)(this.prefixClass(\"title\"),e.props.className);e=this.props.collapsible?(0,i.cloneElement)(e,{className:t,children:this.renderAnchor(e.props.children)}):(0,i.cloneElement)(e,{className:t})}return a.default.createElement(\"div\",{className:this.prefixClass(\"heading\")},e)},renderAnchor:function(e){return a.default.createElement(\"a\",{href:\"#\"+(this.props.id||\"\"),\"aria-controls\":this.props.collapsible?this.props.id:null,className:this.isExpanded()?null:\"collapsed\",\"aria-expanded\":this.isExpanded()?\"true\":\"false\",onClick:this.handleSelect},e)},renderCollapsibleTitle:function(e){return a.default.createElement(\"h4\",{className:this.prefixClass(\"title\")},this.renderAnchor(e))},renderFooter:function(){return this.props.footer?a.default.createElement(\"div\",{className:this.prefixClass(\"footer\")},this.props.footer):null}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"PageItem\",propTypes:{href:a.default.PropTypes.string,target:a.default.PropTypes.string,title:a.default.PropTypes.string,disabled:a.default.PropTypes.bool,previous:a.default.PropTypes.bool,next:a.default.PropTypes.bool,onSelect:a.default.PropTypes.func,eventKey:a.default.PropTypes.any},getDefaultProps:function(){return{href:\"#\"}},render:function(){var e={disabled:this.props.disabled,previous:this.props.previous,next:this.props.next};return a.default.createElement(\"li\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"a\",{href:this.props.href,title:this.props.title,target:this.props.target,onClick:this.handleSelect,ref:\"anchor\"},this.props.children))},handleSelect:function(e){this.props.onSelect&&(e.preventDefault(),this.props.disabled||this.props.onSelect(this.props.eventKey,this.props.href,this.props.target))}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(187),c=r(l),p=n(204),f=r(p),d=a.default.createClass({displayName:\"Pager\",propTypes:{onSelect:a.default.PropTypes.func},render:function(){return a.default.createElement(\"ul\",o({},this.props,{className:(0,u.default)(this.props.className,\"pager\")}),c.default.map(this.props.children,this.renderPageItem))},renderPageItem:function(e,t){return(0,i.cloneElement)(e,{onSelect:(0,f.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t})}});t.default=d,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0})}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(183),l=r(u),c=n(184),p=r(c),f=n(212),d=r(f),h=n(186),v=r(h),m=s.default.createClass({displayName:\"Popover\",mixins:[p.default,d.default],propTypes:{id:v.default.isRequiredForA11y(s.default.PropTypes.string),placement:s.default.PropTypes.oneOf([\"top\",\"right\",\"bottom\",\"left\"]),positionLeft:s.default.PropTypes.number,positionTop:s.default.PropTypes.number,arrowOffsetLeft:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),arrowOffsetTop:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),title:s.default.PropTypes.node,animation:s.default.PropTypes.bool},getDefaultProps:function(){return{placement:\"right\",animation:!0}},render:function(){var e,t=(e={popover:!0},o(e,this.props.placement,!0),o(e,\"in\",!this.props.animation&&(null!=this.props.positionLeft||null!=this.props.positionTop)),o(e,\"fade\",this.props.animation),e),n={left:this.props.positionLeft,top:this.props.positionTop,display:\"block\"},r={left:this.props.arrowOffsetLeft,top:this.props.arrowOffsetTop};return s.default.createElement(\"div\",i({role:\"tooltip\"},this.props,{className:(0,l.default)(this.props.className,t),style:n,title:null}),s.default.createElement(\"div\",{className:\"arrow\",style:r}),this.props.title?this.renderTitle():null,s.default.createElement(\"div\",{className:\"popover-content\"},this.props.children))},renderTitle:function(){return s.default.createElement(\"h3\",{className:\"popover-title\"},this.props.title)}});t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){if(e[t]){var r=function(){var r=void 0,o=void 0;return s.default.Children.forEach(e[t],function(e){e.type!==m&&(o=e.type.displayName?e.type.displayName:e.type,r=new Error(\"Children of \"+n+\" can contain only ProgressBar components. Found \"+o))}),{v:r}}();if(\"object\"==typeof r)return r.v}}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(218),l=r(u),c=n(184),p=r(c),f=n(183),d=r(f),h=n(187),v=r(h),m=s.default.createClass({displayName:\"ProgressBar\",propTypes:{min:a.PropTypes.number,now:a.PropTypes.number,max:a.PropTypes.number,label:a.PropTypes.node,srOnly:a.PropTypes.bool,striped:a.PropTypes.bool,active:a.PropTypes.bool,children:o,className:s.default.PropTypes.string,interpolateClass:a.PropTypes.node,isChild:a.PropTypes.bool},mixins:[p.default],getDefaultProps:function(){return{bsClass:\"progress-bar\",min:0,max:100}},getPercentage:function(e,t,n){var r=1e3;return Math.round((e-t)/(n-t)*100*r)/r},render:function(){if(this.props.isChild)return this.renderProgressBar();var e={active:this.props.active,progress:!0,\"progress-striped\":this.props.active||this.props.striped},t=void 0;return t=this.props.children?v.default.map(this.props.children,this.renderChildBar):this.renderProgressBar(),s.default.createElement(\"div\",i({},this.props,{className:(0,d.default)(this.props.className,e)}),t)},renderChildBar:function(e,t){return(0,a.cloneElement)(e,{isChild:!0,key:e.key?e.key:t})},renderProgressBar:function(){var e=this.getPercentage(this.props.now,this.props.min,this.props.max),t=void 0;return t=\"string\"==typeof this.props.label?this.renderLabel(e):this.props.label,this.props.srOnly&&(t=s.default.createElement(\"span\",{className:\"sr-only\"},t)),s.default.createElement(\"div\",i({},this.props,{className:(0,d.default)(this.props.className,this.getBsClassSet()),role:\"progressbar\",style:{width:e+\"%\"},\"aria-valuenow\":this.props.now,\"aria-valuemin\":this.props.min,\"aria-valuemax\":this.props.max}),t)},renderLabel:function(e){var t=this.props.interpolateClass||l.default;return s.default.createElement(t,{now:this.props.now,min:this.props.min,max:this.props.max,percent:e,bsStyle:this.props.bsStyle},this.props.label)}});t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(186),c=r(l),p=a.default.createClass({displayName:\"Row\",propTypes:{componentClass:c.default.elementType},getDefaultProps:function(){return{componentClass:\"div\"}},render:function(){var e=this.props.componentClass;return a.default.createElement(e,o({},this.props,{className:(0,u.default)(this.props.className,\"row\")}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=n(210),f=r(p),d=n(194),h=r(d),v=n(195),m=r(v),y=n(211),g=r(y),b=a.default.createClass({displayName:\"SplitButton\",mixins:[c.default,f.default],propTypes:{pullRight:a.default.PropTypes.bool,title:a.default.PropTypes.node,href:a.default.PropTypes.string,id:a.default.PropTypes.string,target:a.default.PropTypes.string,dropdownTitle:a.default.PropTypes.node,dropup:a.default.PropTypes.bool,onClick:a.default.PropTypes.func,onSelect:a.default.PropTypes.func,disabled:a.default.PropTypes.bool,className:a.default.PropTypes.string,children:a.default.PropTypes.node},getDefaultProps:function(){return{dropdownTitle:\"Toggle dropdown\"}},render:function(){var e={open:this.state.open,dropup:this.props.dropup},t=a.default.createElement(h.default,o({},this.props,{ref:\"button\",onClick:this.handleButtonClick,title:null,id:null}),this.props.title),n=a.default.createElement(h.default,o({},this.props,{ref:\"dropdownButton\",className:(0,u.default)(this.props.className,\"dropdown-toggle\"),onClick:this.handleDropdownClick,title:null,href:null,target:null,id:null}),a.default.createElement(\"span\",{className:\"sr-only\"},this.props.dropdownTitle),a.default.createElement(\"span\",{className:\"caret\"}),a.default.createElement(\"span\",{style:{letterSpacing:\"-.3em\"}},\" \"));return a.default.createElement(m.default,{bsSize:this.props.bsSize,className:(0,u.default)(e),id:this.props.id},t,n,a.default.createElement(g.default,{ref:\"menu\",onSelect:this.handleOptionSelect,\"aria-labelledby\":this.props.id,pullRight:this.props.pullRight},this.props.children))},handleButtonClick:function(e){this.state.open&&this.setDropdownState(!1),this.props.onClick&&this.props.onClick(e,this.props.href,this.props.target)},handleDropdownClick:function(e){e.preventDefault(),this.setDropdownState(!this.state.open)},handleOptionSelect:function(e){this.props.onSelect&&this.props.onSelect(e),this.setDropdownState(!1)}});t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(187),c=r(l),p=n(204),f=r(p),d=n(184),h=r(d),v=a.default.createClass({displayName:\"SubNav\",mixins:[h.default],propTypes:{onSelect:a.default.PropTypes.func,active:a.default.PropTypes.bool,activeHref:a.default.PropTypes.string,activeKey:a.default.PropTypes.any,disabled:a.default.PropTypes.bool,eventKey:a.default.PropTypes.any,href:a.default.PropTypes.string,title:a.default.PropTypes.string,text:a.default.PropTypes.node,target:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"nav\"}},handleClick:function(e){this.props.onSelect&&(e.preventDefault(),this.props.disabled||this.props.onSelect(this.props.eventKey,this.props.href,this.props.target))},isActive:function(){return this.isChildActive(this)},isChildActive:function(e){if(e.props.active)return!0;if(null!=this.props.activeKey&&this.props.activeKey===e.props.eventKey)return!0;if(null!=this.props.activeHref&&this.props.activeHref===e.props.href)return!0;if(e.props.children){var t=!1;return c.default.forEach(e.props.children,function(e){this.isChildActive(e)&&(t=!0)},this),t}return!1},getChildActiveProp:function(e){return!!e.props.active||(null!=this.props.activeKey&&e.props.eventKey===this.props.activeKey||(null!=this.props.activeHref&&e.props.href===this.props.activeHref||e.props.active))},render:function(){var e={active:this.isActive(),disabled:this.props.disabled};return a.default.createElement(\"li\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"a\",{href:this.props.href,title:this.props.title,target:this.props.target,onClick:this.handleClick,ref:\"anchor\"},this.props.text),a.default.createElement(\"ul\",{className:\"nav\"},c.default.map(this.props.children,this.renderNavItem)))},renderNavItem:function(e,t){return(0,i.cloneElement)(e,{active:this.getChildActiveProp(e),onSelect:(0,f.default)(e.props.onSelect,this.props.onSelect),key:e.key?e.key:t})}});t.default=v,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e){var t=void 0;return f.default.forEach(e,function(e){null==t&&(t=e.props.eventKey)}),t}Object.defineProperty(t,\"__esModule\",{value:!0});var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(4),u=r(s),l=n(184),c=r(l),p=n(187),f=r(p),d=n(231),h=r(d),v=n(233),m=r(v),y=function(e,t){return t.props.id?t.props.id:e.id&&e.id+\"___panel___\"+t.props.eventKey},g=function(e,t){return t.props.id?t.props.id+\"___tab\":e.id&&e.id+\"___tab___\"+t.props.eventKey},b=u.default.createClass({displayName:\"TabbedArea\",mixins:[c.default],propTypes:{activeKey:u.default.PropTypes.any,defaultActiveKey:u.default.PropTypes.any,bsStyle:u.default.PropTypes.oneOf([\"tabs\",\"pills\"]),animation:u.default.PropTypes.bool,id:u.default.PropTypes.string,onSelect:u.default.PropTypes.func},getDefaultProps:function(){return{bsStyle:\"tabs\",animation:!0}},getInitialState:function(){var e=null!=this.props.defaultActiveKey?this.props.defaultActiveKey:i(this.props.children);return{activeKey:e,previousActiveKey:null}},componentWillReceiveProps:function(e){null!=e.activeKey&&e.activeKey!==this.props.activeKey&&this.setState({previousActiveKey:this.props.activeKey})},handlePaneAnimateOutEnd:function(){this.setState({previousActiveKey:null})},render:function(){function e(e){return null!=e.props.tab?this.renderTab(e):null}var t=this.props,n=t.id,r=o(t,[\"id\"]),i=null!=this.props.activeKey?this.props.activeKey:this.state.activeKey,s=u.default.createElement(h.default,a({},r,{activeKey:i,onSelect:this.handleSelect,ref:\"tabs\"}),f.default.map(this.props.children,e,this));return u.default.createElement(\"div\",null,s,u.default.createElement(\"div\",{id:n,className:\"tab-content\",ref:\"panes\"},f.default.map(this.props.children,this.renderPane)))},getActiveKey:function(){return null!=this.props.activeKey?this.props.activeKey:this.state.activeKey},renderPane:function(e,t){var n=this.getActiveKey(),r=e.props.eventKey===n&&(null==this.state.previousActiveKey||!this.props.animation);return(0,s.cloneElement)(e,{active:r,id:y(this.props,e),\"aria-labelledby\":g(this.props,e),key:e.key?e.key:t,animation:this.props.animation,onAnimateOutEnd:null!=this.state.previousActiveKey&&e.props.eventKey===this.state.previousActiveKey?this.handlePaneAnimateOutEnd:null})},renderTab:function(e){var t=e.props,n=t.eventKey,r=t.className,o=t.tab,i=t.disabled;return u.default.createElement(m.default,{linkId:g(this.props,e),ref:\"tab\"+n,\"aria-controls\":y(this.props,e),eventKey:n,className:r,disabled:i},o)},shouldComponentUpdate:function(){return!this._isChanging},handleSelect:function(e){this.props.onSelect?(this._isChanging=!0,this.props.onSelect(e),this._isChanging=!1):e!==this.getActiveKey()&&this.setState({activeKey:e,previousActiveKey:this.getActiveKey()})}});t.default=b,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=a.default.createClass({displayName:\"Table\",propTypes:{striped:a.default.PropTypes.bool,bordered:a.default.PropTypes.bool,condensed:a.default.PropTypes.bool,hover:a.default.PropTypes.bool,responsive:a.default.PropTypes.bool},render:function(){var e={table:!0,\"table-striped\":this.props.striped,\"table-bordered\":this.props.bordered,\"table-condensed\":this.props.condensed,\"table-hover\":this.props.hover},t=a.default.createElement(\"table\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children);return this.props.responsive?a.default.createElement(\"div\",{className:\"table-responsive\"},t):t}});t.default=l,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(203),c=r(l),p=a.default.createClass({displayName:\"TabPane\",propTypes:{active:a.default.PropTypes.bool,animation:a.default.PropTypes.bool,onAnimateOutEnd:a.default.PropTypes.func,disabled:a.default.PropTypes.bool},getDefaultProps:function(){return{animation:!0}},getInitialState:function(){return{animateIn:!1,animateOut:!1}},componentWillReceiveProps:function(e){this.props.animation&&(this.state.animateIn||!e.active||this.props.active?this.state.animateOut||e.active||!this.props.active||this.setState({animateOut:!0}):this.setState({animateIn:!0}))},componentDidUpdate:function(){this.state.animateIn&&setTimeout(this.startAnimateIn,0),this.state.animateOut&&c.default.addEndEventListener(a.default.findDOMNode(this),this.stopAnimateOut)},startAnimateIn:function(){this.isMounted()&&this.setState({animateIn:!1})},stopAnimateOut:function(){this.isMounted()&&(this.setState({animateOut:!1}),this.props.onAnimateOutEnd&&this.props.onAnimateOutEnd())},render:function(){var e={\"tab-pane\":!0,fade:!0,active:this.props.active||this.state.animateOut,in:this.props.active&&!this.state.animateIn};return a.default.createElement(\"div\",o({},this.props,{role:\"tabpanel\",\"aria-hidden\":!this.props.active,className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);\n}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Thumbnail\",mixins:[c.default],propTypes:{alt:a.default.PropTypes.string,href:a.default.PropTypes.string,src:a.default.PropTypes.string},getDefaultProps:function(){return{bsClass:\"thumbnail\"}},render:function(){var e=this.getBsClassSet();return this.props.href?a.default.createElement(\"a\",o({},this.props,{href:this.props.href,className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt})):this.props.children?a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt}),a.default.createElement(\"div\",{className:\"caption\"},this.props.children)):a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),a.default.createElement(\"img\",{src:this.props.src,alt:this.props.alt}))}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0})}Object.defineProperty(t,\"__esModule\",{value:!0});var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(4),s=r(a),u=n(183),l=r(u),c=n(184),p=r(c),f=n(212),d=r(f),h=n(186),v=r(h),m=s.default.createClass({displayName:\"Tooltip\",mixins:[p.default,d.default],propTypes:{id:v.default.isRequiredForA11y(s.default.PropTypes.string),placement:s.default.PropTypes.oneOf([\"top\",\"right\",\"bottom\",\"left\"]),positionLeft:s.default.PropTypes.number,positionTop:s.default.PropTypes.number,arrowOffsetLeft:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),arrowOffsetTop:s.default.PropTypes.oneOfType([s.default.PropTypes.number,s.default.PropTypes.string]),title:s.default.PropTypes.node,animation:s.default.PropTypes.bool},getDefaultProps:function(){return{placement:\"right\",animation:!0}},render:function(){var e,t=(e={tooltip:!0},o(e,this.props.placement,!0),o(e,\"in\",!this.props.animation&&(null!=this.props.positionLeft||null!=this.props.positionTop)),o(e,\"fade\",this.props.animation),e),n={left:this.props.positionLeft,top:this.props.positionTop},r={left:this.props.arrowOffsetLeft,top:this.props.arrowOffsetTop};return s.default.createElement(\"div\",i({role:\"tooltip\"},this.props,{className:(0,l.default)(this.props.className,t),style:n}),s.default.createElement(\"div\",{className:\"tooltip-arrow\",style:r}),s.default.createElement(\"div\",{className:\"tooltip-inner\"},this.props.children))}});t.default=m,e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=n(199),i=r(o),a=n(204),s=r(a),u=n(186),l=r(u),c=n(190),p=r(c),f=n(187),d=r(f);t.default={childrenValueInputValidation:i.default,createChainedFunction:s.default,CustomPropTypes:l.default,domUtils:p.default,ValidComponentChildren:d.default},e.exports=t.default},function(e,t,n){\"use strict\";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,\"__esModule\",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(4),a=r(i),s=n(183),u=r(s),l=n(184),c=r(l),p=a.default.createClass({displayName:\"Well\",mixins:[c.default],getDefaultProps:function(){return{bsClass:\"well\"}},render:function(){var e=this.getBsClassSet();return a.default.createElement(\"div\",o({},this.props,{className:(0,u.default)(this.props.className,e)}),this.props.children)}});t.default=p,e.exports=t.default},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0}),n(261);var r=n(160),o=n(1),i=o.FancyWebSocket,a=n(451),s=r.createActions([\"update\",\"reconnect\"]);t.Actions=s;var u=r.createStore({init:function(){this.status=\"offline\",this.listenToMany(s),this.listenTo(a.store,this.onJobListChanged)},getInitialState:function(){return this.status},onJobListChanged:function(e){e.some(function(e){return\"crawling\"==e.status})?(this.status=\"crawling\",this.trigger(this.status)):\"crawling\"==this.status&&(this.status=\"online\",this.trigger(this.status))},onUpdate:function(e){this.status=e,this.trigger(e)},onReconnect:function(){l.reconnect()}});t.store=u;var l=i.instance();l.on(\"open\",function(){s.update(\"online\")}),l.on(\"close\",function(){s.update(\"offline\")})},function(e,t,n){e.exports=n(262)},function(e,t,n){(function(e){\"use strict\";if(n(263),n(450),e._babelPolyfill)throw new Error(\"only one instance of babel/polyfill is allowed\");e._babelPolyfill=!0}).call(t,function(){return this}())},function(e,t,n){n(264),n(297),n(303),n(305),n(307),n(309),n(311),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),n(323),n(324),n(327),n(328),n(329),n(331),n(332),n(333),n(334),n(335),n(336),n(337),n(339),n(340),n(341),n(343),n(344),n(345),n(347),n(348),n(349),n(350),n(351),n(352),n(353),n(354),n(355),n(356),n(357),n(358),n(359),n(360),n(365),n(366),n(370),n(371),n(373),n(374),n(379),n(380),n(383),n(385),n(387),n(389),n(390),n(391),n(393),n(394),n(396),n(397),n(398),n(399),n(406),n(409),n(410),n(412),n(413),n(414),n(415),n(416),n(417),n(418),n(419),n(420),n(421),n(422),n(423),n(425),n(426),n(427),n(428),n(429),n(430),n(432),n(433),n(434),n(435),n(437),n(438),n(440),n(441),n(443),n(444),n(445),n(448),n(449),e.exports=n(268)},function(e,t,n){\"use strict\";var r,o=n(265),i=n(266),a=n(271),s=n(270),u=n(277),l=n(278),c=n(280),p=n(281),f=n(282),d=n(272),h=n(283),v=n(276),m=n(279),y=n(284),g=n(286),b=n(288),E=n(289),_=n(290),O=n(287),N=n(274)(\"__proto__\"),w=n(291),C=n(296)(!1),P=Object.prototype,x=Array.prototype,T=x.slice,D=x.join,M=o.setDesc,S=o.getDesc,k=o.setDescs,I={};a||(r=!d(function(){return 7!=M(l(\"div\"),\"a\",{get:function(){return 7}}).a}),o.setDesc=function(e,t,n){if(r)try{return M(e,t,n)}catch(e){}if(\"get\"in n||\"set\"in n)throw TypeError(\"Accessors not supported!\");return\"value\"in n&&(h(e)[t]=n.value),e},o.getDesc=function(e,t){if(r)try{return S(e,t)}catch(e){}if(c(e,t))return s(!P.propertyIsEnumerable.call(e,t),e[t])},o.setDescs=k=function(e,t){h(e);for(var n,r=o.getKeys(t),i=r.length,a=0;i>a;)o.setDesc(e,n=r[a++],t[n]);return e}),i(i.S+i.F*!a,\"Object\",{getOwnPropertyDescriptor:o.getDesc,defineProperty:o.setDesc,defineProperties:k});var R=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\"),A=R.concat(\"length\",\"prototype\"),j=R.length,L=function(){var e,t=l(\"iframe\"),n=j,r=\">\";for(t.style.display=\"none\",u.appendChild(t),t.src=\"javascript:\",e=t.contentWindow.document,e.open(),e.write(\"<script>document.F=Object</script\"+r),e.close(),L=e.F;n--;)delete L.prototype[R[n]];return L()},V=function(e,t){return function(n){var r,o=g(n),i=0,a=[];for(r in o)r!=N&&c(o,r)&&a.push(r);for(;t>i;)c(o,r=e[i++])&&(~C(a,r)||a.push(r));return a}},F=function(){};i(i.S,\"Object\",{getPrototypeOf:o.getProto=o.getProto||function(e){return e=y(e),c(e,N)?e[N]:\"function\"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?P:null},getOwnPropertyNames:o.getNames=o.getNames||V(A,A.length,!0),create:o.create=o.create||function(e,t){var n;return null!==e?(F.prototype=h(e),n=new F,F.prototype=null,n[N]=e):n=L(),void 0===t?n:k(n,t)},keys:o.getKeys=o.getKeys||V(R,j,!1)});var U=function(e,t,n){if(!(t in I)){for(var r=[],o=0;o<t;o++)r[o]=\"a[\"+o+\"]\";I[t]=Function(\"F,a\",\"return new F(\"+r.join(\",\")+\")\")}return I[t](e,n)};i(i.P,\"Function\",{bind:function(e){var t=v(this),n=T.call(arguments,1),r=function(){var o=n.concat(T.call(arguments));return this instanceof r?U(t,o.length,o):f(t,o,e)};return m(t.prototype)&&(r.prototype=t.prototype),r}}),i(i.P+i.F*d(function(){u&&T.call(u)}),\"Array\",{slice:function(e,t){var n=_(this.length),r=p(this);if(t=void 0===t?n:t,\"Array\"==r)return T.call(this,e,t);for(var o=E(e,n),i=E(t,n),a=_(i-o),s=Array(a),u=0;u<a;u++)s[u]=\"String\"==r?this.charAt(o+u):this[o+u];return s}}),i(i.P+i.F*(O!=Object),\"Array\",{join:function(e){return D.call(O(this),void 0===e?\",\":e)}}),i(i.S,\"Array\",{isArray:n(293)});var B=function(e){return function(t,n){v(t);var r=O(this),o=_(r.length),i=e?o-1:0,a=e?-1:1;if(arguments.length<2)for(;;){if(i in r){n=r[i],i+=a;break}if(i+=a,e?i<0:o<=i)throw TypeError(\"Reduce of empty array with no initial value\")}for(;e?i>=0:o>i;i+=a)i in r&&(n=t(n,r[i],i,this));return n}},K=function(e){return function(t){return e(this,t,arguments[1])}};i(i.P,\"Array\",{forEach:o.each=o.each||K(w(0)),map:K(w(1)),filter:K(w(2)),some:K(w(3)),every:K(w(4)),reduce:B(!1),reduceRight:B(!0),indexOf:K(C),lastIndexOf:function(e,t){var n=g(this),r=_(n.length),o=r-1;for(arguments.length>1&&(o=Math.min(o,b(t))),o<0&&(o=_(r+o));o>=0;o--)if(o in n&&n[o]===e)return o;return-1}}),i(i.S,\"Date\",{now:function(){return+new Date}});var W=function(e){return e>9?e:\"0\"+e};i(i.P+i.F*(d(function(){return\"0385-07-25T07:06:39.999Z\"!=new Date(-5e13-1).toISOString()})||!d(function(){new Date(NaN).toISOString()})),\"Date\",{toISOString:function(){if(!isFinite(this))throw RangeError(\"Invalid time value\");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),r=t<0?\"-\":t>9999?\"+\":\"\";return r+(\"00000\"+Math.abs(t)).slice(r?-6:-4)+\"-\"+W(e.getUTCMonth()+1)+\"-\"+W(e.getUTCDate())+\"T\"+W(e.getUTCHours())+\":\"+W(e.getUTCMinutes())+\":\"+W(e.getUTCSeconds())+\".\"+(n>99?n:\"0\"+W(n))+\"Z\"}})},function(e,t){var n=Object;e.exports={create:n.create,getProto:n.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:n.getOwnPropertyDescriptor,setDesc:n.defineProperty,setDescs:n.defineProperties,getKeys:n.keys,getNames:n.getOwnPropertyNames,getSymbols:n.getOwnPropertySymbols,each:[].forEach}},function(e,t,n){var r=n(267),o=n(268),i=n(269),a=n(273),s=n(275),u=\"prototype\",l=function(e,t,n){var c,p,f,d,h=e&l.F,v=e&l.G,m=e&l.S,y=e&l.P,g=e&l.B,b=v?r:m?r[t]||(r[t]={}):(r[t]||{})[u],E=v?o:o[t]||(o[t]={}),_=E[u]||(E[u]={});v&&(n=t);for(c in n)p=!h&&b&&c in b,f=(p?b:n)[c],d=g&&p?s(f,r):y&&\"function\"==typeof f?s(Function.call,f):f,b&&!p&&a(b,c,f),E[c]!=f&&i(E,c,d),y&&_[c]!=f&&(_[c]=f)};r.core=o,l.F=1,l.G=2,l.S=4,l.P=8,l.B=16,l.W=32,e.exports=l},function(e,t){var n=e.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=n)},function(e,t){var n=e.exports={version:\"1.2.6\"};\"number\"==typeof __e&&(__e=n)},function(e,t,n){var r=n(265),o=n(270);e.exports=n(271)?function(e,t,n){return r.setDesc(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){e.exports=!n(272)(function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a})},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){var r=n(267),o=n(269),i=n(274)(\"src\"),a=\"toString\",s=Function[a],u=(\"\"+s).split(a);n(268).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,a){\"function\"==typeof n&&(n.hasOwnProperty(i)||o(n,i,e[t]?\"\"+e[t]:u.join(String(t))),n.hasOwnProperty(\"name\")||o(n,\"name\",t)),e===r?e[t]=n:(a||delete e[t],o(e,t,n))})(Function.prototype,a,function(){return\"function\"==typeof this&&this[i]||s.call(this)})},function(e,t){var n=0,r=Math.random();e.exports=function(e){return\"Symbol(\".concat(void 0===e?\"\":e,\")_\",(++n+r).toString(36))}},function(e,t,n){var r=n(276);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if(\"function\"!=typeof e)throw TypeError(e+\" is not a function!\");return e}},function(e,t,n){e.exports=n(267).document&&document.documentElement},function(e,t,n){var r=n(279),o=n(267).document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t){e.exports=function(e){return\"object\"==typeof e?null!==e:\"function\"==typeof e}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)}},function(e,t,n){var r=n(279);e.exports=function(e){if(!r(e))throw TypeError(e+\" is not an object!\");return e}},function(e,t,n){var r=n(285);e.exports=function(e){return Object(r(e))}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError(\"Can't call method on  \"+e);return e}},function(e,t,n){var r=n(287),o=n(285);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(281);e.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(e){return\"String\"==r(e)?e.split(\"\"):Object(e)}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(288),o=Math.max,i=Math.min;e.exports=function(e,t){return e=r(e),e<0?o(e+t,0):i(e,t)}},function(e,t,n){var r=n(288),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){var r=n(275),o=n(287),i=n(284),a=n(290),s=n(292);e.exports=function(e){var t=1==e,n=2==e,u=3==e,l=4==e,c=6==e,p=5==e||c;return function(f,d,h){for(var v,m,y=i(f),g=o(y),b=r(d,h,3),E=a(g.length),_=0,O=t?s(f,E):n?s(f,0):void 0;E>_;_++)if((p||_ in g)&&(v=g[_],m=b(v,_,y),e))if(t)O[_]=m;else if(m)switch(e){case 3:return!0;case 5:return v;case 6:return _;case 2:O.push(v)}else if(l)return!1;return c?-1:u||l?l:O}}},function(e,t,n){var r=n(279),o=n(293),i=n(294)(\"species\");e.exports=function(e,t){var n;return o(e)&&(n=e.constructor,\"function\"!=typeof n||n!==Array&&!o(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(t)}},function(e,t,n){var r=n(281);e.exports=Array.isArray||function(e){return\"Array\"==r(e)}},function(e,t,n){var r=n(295)(\"wks\"),o=n(274),i=n(267).Symbol;e.exports=function(e){return r[e]||(r[e]=i&&i[e]||(i||o)(\"Symbol.\"+e))}},function(e,t,n){var r=n(267),o=\"__core-js_shared__\",i=r[o]||(r[o]={});e.exports=function(e){return i[e]||(i[e]={})}},function(e,t,n){var r=n(286),o=n(290),i=n(289);e.exports=function(e){return function(t,n,a){var s,u=r(t),l=o(u.length),c=i(a,l);if(e&&n!=n){for(;l>c;)if(s=u[c++],s!=s)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===n)return e||c;return!e&&-1}}},function(e,t,n){\"use strict\";var r=n(265),o=n(267),i=n(280),a=n(271),s=n(266),u=n(273),l=n(272),c=n(295),p=n(298),f=n(274),d=n(294),h=n(299),v=n(300),m=n(301),y=n(293),g=n(283),b=n(286),E=n(270),_=r.getDesc,O=r.setDesc,N=r.create,w=v.get,C=o.Symbol,P=o.JSON,x=P&&P.stringify,T=!1,D=d(\"_hidden\"),M=r.isEnum,S=c(\"symbol-registry\"),k=c(\"symbols\"),I=\"function\"==typeof C,R=Object.prototype,A=a&&l(function(){return 7!=N(O({},\"a\",{get:function(){return O(this,\"a\",{value:7}).a}})).a})?function(e,t,n){var r=_(R,t);r&&delete R[t],O(e,t,n),r&&e!==R&&O(R,t,r)}:O,j=function(e){var t=k[e]=N(C.prototype);return t._k=e,a&&T&&A(R,e,{configurable:!0,set:function(t){i(this,D)&&i(this[D],e)&&(this[D][e]=!1),A(this,e,E(1,t))}}),t},L=function(e){return\"symbol\"==typeof e},V=function(e,t,n){return n&&i(k,t)?(n.enumerable?(i(e,D)&&e[D][t]&&(e[D][t]=!1),n=N(n,{enumerable:E(0,!1)})):(i(e,D)||O(e,D,E(1,{})),e[D][t]=!0),A(e,t,n)):O(e,t,n)},F=function(e,t){g(e);for(var n,r=m(t=b(t)),o=0,i=r.length;i>o;)V(e,n=r[o++],t[n]);return e},U=function(e,t){return void 0===t?N(e):F(N(e),t)},B=function(e){var t=M.call(this,e);return!(t||!i(this,e)||!i(k,e)||i(this,D)&&this[D][e])||t},K=function(e,t){var n=_(e=b(e),t);return!n||!i(k,t)||i(e,D)&&e[D][t]||(n.enumerable=!0),n},W=function(e){for(var t,n=w(b(e)),r=[],o=0;n.length>o;)i(k,t=n[o++])||t==D||r.push(t);return r},H=function(e){for(var t,n=w(b(e)),r=[],o=0;n.length>o;)i(k,t=n[o++])&&r.push(k[t]);return r},q=function(e){if(void 0!==e&&!L(e)){for(var t,n,r=[e],o=1,i=arguments;i.length>o;)r.push(i[o++]);return t=r[1],\"function\"==typeof t&&(n=t),!n&&y(t)||(t=function(e,t){if(n&&(t=n.call(this,e,t)),!L(t))return t}),r[1]=t,x.apply(P,r)}},z=l(function(){var e=C();return\"[null]\"!=x([e])||\"{}\"!=x({a:e})||\"{}\"!=x(Object(e))});I||(C=function(){if(L(this))throw TypeError(\"Symbol is not a constructor\");return j(f(arguments.length>0?arguments[0]:void 0))},u(C.prototype,\"toString\",function(){return this._k}),L=function(e){return e instanceof C},r.create=U,r.isEnum=B,r.getDesc=K,r.setDesc=V,r.setDescs=F,r.getNames=v.get=W,r.getSymbols=H,a&&!n(302)&&u(R,\"propertyIsEnumerable\",B,!0));var Y={for:function(e){return i(S,e+=\"\")?S[e]:S[e]=C(e)},keyFor:function(e){return h(S,e)},useSetter:function(){T=!0},useSimple:function(){T=!1}};r.each.call(\"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"),function(e){var t=d(e);Y[e]=I?t:j(t)}),T=!0,s(s.G+s.W,{Symbol:C}),s(s.S,\"Symbol\",Y),s(s.S+s.F*!I,\"Object\",{create:U,defineProperty:V,defineProperties:F,getOwnPropertyDescriptor:K,getOwnPropertyNames:W,getOwnPropertySymbols:H}),P&&s(s.S+s.F*(!I||z),\"JSON\",{stringify:q}),p(C,\"Symbol\"),p(Math,\"Math\",!0),p(o.JSON,\"JSON\",!0)},function(e,t,n){var r=n(265).setDesc,o=n(280),i=n(294)(\"toStringTag\");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){var r=n(265),o=n(286);e.exports=function(e,t){for(var n,i=o(e),a=r.getKeys(i),s=a.length,u=0;s>u;)if(i[n=a[u++]]===t)return n}},function(e,t,n){var r=n(286),o=n(265).getNames,i={}.toString,a=\"object\"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return o(e)}catch(e){return a.slice()}};e.exports.get=function(e){return a&&\"[object Window]\"==i.call(e)?s(e):o(r(e))}},function(e,t,n){var r=n(265);e.exports=function(e){var t=r.getKeys(e),n=r.getSymbols;if(n)for(var o,i=n(e),a=r.isEnum,s=0;i.length>s;)a.call(e,o=i[s++])&&t.push(o);return t}},function(e,t){e.exports=!1},function(e,t,n){var r=n(266);r(r.S+r.F,\"Object\",{assign:n(304)})},function(e,t,n){var r=n(265),o=n(284),i=n(287);e.exports=n(272)(function(){var e=Object.assign,t={},n={},r=Symbol(),o=\"abcdefghijklmnopqrst\";return t[r]=7,o.split(\"\").forEach(function(e){n[e]=e}),7!=e({},t)[r]||Object.keys(e({},n)).join(\"\")!=o})?function(e,t){for(var n=o(e),a=arguments,s=a.length,u=1,l=r.getKeys,c=r.getSymbols,p=r.isEnum;s>u;)for(var f,d=i(a[u++]),h=c?l(d).concat(c(d)):l(d),v=h.length,m=0;v>m;)p.call(d,f=h[m++])&&(n[f]=d[f]);return n}:Object.assign},function(e,t,n){var r=n(266);r(r.S,\"Object\",{is:n(306)})},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e===1/t:e!=e&&t!=t}},function(e,t,n){var r=n(266);r(r.S,\"Object\",{setPrototypeOf:n(308).set})},function(e,t,n){var r=n(265).getDesc,o=n(279),i=n(283),a=function(e,t){if(i(e),!o(t)&&null!==t)throw TypeError(t+\": can't set as prototype!\")};e.exports={set:Object.setPrototypeOf||(\"__proto__\"in{}?function(e,t,o){try{o=n(275)(Function.call,r(Object.prototype,\"__proto__\").set,2),o(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return a(e,n),t?e.__proto__=n:o(e,n),e}}({},!1):void 0),check:a}},function(e,t,n){\"use strict\";var r=n(310),o={};o[n(294)(\"toStringTag\")]=\"z\",o+\"\"!=\"[object z]\"&&n(273)(Object.prototype,\"toString\",function(){return\"[object \"+r(this)+\"]\"},!0)},function(e,t,n){var r=n(281),o=n(294)(\"toStringTag\"),i=\"Arguments\"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?\"Undefined\":null===e?\"Null\":\"string\"==typeof(n=(t=Object(e))[o])?n:i?r(t):\"Object\"==(a=r(t))&&\"function\"==typeof t.callee?\"Arguments\":a}},function(e,t,n){var r=n(279);n(312)(\"freeze\",function(e){return function(t){return e&&r(t)?e(t):t}})},function(e,t,n){var r=n(266),o=n(268),i=n(272);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*i(function(){n(1)}),\"Object\",a)}},function(e,t,n){var r=n(279);n(312)(\"seal\",function(e){return function(t){return e&&r(t)?e(t):t}})},function(e,t,n){var r=n(279);n(312)(\"preventExtensions\",function(e){return function(t){return e&&r(t)?e(t):t}})},function(e,t,n){var r=n(279);n(312)(\"isFrozen\",function(e){return function(t){return!r(t)||!!e&&e(t)}})},function(e,t,n){var r=n(279);n(312)(\"isSealed\",function(e){return function(t){return!r(t)||!!e&&e(t)}})},function(e,t,n){var r=n(279);n(312)(\"isExtensible\",function(e){return function(t){return!!r(t)&&(!e||e(t))}})},function(e,t,n){var r=n(286);n(312)(\"getOwnPropertyDescriptor\",function(e){return function(t,n){return e(r(t),n)}})},function(e,t,n){var r=n(284);n(312)(\"getPrototypeOf\",function(e){return function(t){return e(r(t))}})},function(e,t,n){var r=n(284);n(312)(\"keys\",function(e){return function(t){return e(r(t))}})},function(e,t,n){n(312)(\"getOwnPropertyNames\",function(){return n(300).get})},function(e,t,n){var r=n(265).setDesc,o=n(270),i=n(280),a=Function.prototype,s=/^\\s*function ([^ (]*)/,u=\"name\";u in a||n(271)&&r(a,u,{configurable:!0,get:function(){var e=(\"\"+this).match(s),t=e?e[1]:\"\";return i(this,u)||r(this,u,o(5,t)),t}})},function(e,t,n){\"use strict\";var r=n(265),o=n(279),i=n(294)(\"hasInstance\"),a=Function.prototype;i in a||r.setDesc(a,i,{value:function(e){if(\"function\"!=typeof this||!o(e))return!1;if(!o(this.prototype))return e instanceof this;for(;e=r.getProto(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){\"use strict\";var r=n(265),o=n(267),i=n(280),a=n(281),s=n(325),u=n(272),l=n(326).trim,c=\"Number\",p=o[c],f=p,d=p.prototype,h=a(r.create(d))==c,v=\"trim\"in String.prototype,m=function(e){var t=s(e,!1);if(\"string\"==typeof t&&t.length>2){t=v?t.trim():l(t,3);var n,r,o,i=t.charCodeAt(0);if(43===i||45===i){if(n=t.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(t.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+t}for(var a,u=t.slice(2),c=0,p=u.length;c<p;c++)if(a=u.charCodeAt(c),a<48||a>o)return NaN;return parseInt(u,r)}}return+t};p(\" 0o1\")&&p(\"0b1\")&&!p(\"+0x1\")||(p=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof p&&(h?u(function(){d.valueOf.call(n)}):a(n)!=c)?new f(m(t)):m(t)},r.each.call(n(271)?r.getNames(f):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger\".split(\",\"),function(e){i(f,e)&&!i(p,e)&&r.setDesc(p,e,r.getDesc(f,e))}),p.prototype=d,d.constructor=p,n(273)(o,c,p))},function(e,t,n){var r=n(279);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if(\"function\"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&\"function\"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError(\"Can't convert object to primitive value\")}},function(e,t,n){var r=n(266),o=n(285),i=n(272),a=\"\\t\\n\\v\\f\\r   ᠎             　\\u2028\\u2029\\ufeff\",s=\"[\"+a+\"]\",u=\"​\",l=RegExp(\"^\"+s+s+\"*\"),c=RegExp(s+s+\"*$\"),p=function(e,t){var n={};n[e]=t(f),r(r.P+r.F*i(function(){return!!a[e]()||u[e]()!=u}),\"String\",n)},f=p.trim=function(e,t){return e=String(o(e)),1&t&&(e=e.replace(l,\"\")),2&t&&(e=e.replace(c,\"\")),e};e.exports=p},function(e,t,n){var r=n(266);r(r.S,\"Number\",{EPSILON:Math.pow(2,-52)})},function(e,t,n){var r=n(266),o=n(267).isFinite;r(r.S,\"Number\",{isFinite:function(e){return\"number\"==typeof e&&o(e)}})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{isInteger:n(330)})},function(e,t,n){var r=n(279),o=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&o(e)===e}},function(e,t,n){var r=n(266);r(r.S,\"Number\",{isNaN:function(e){return e!=e}})},function(e,t,n){var r=n(266),o=n(330),i=Math.abs;r(r.S,\"Number\",{isSafeInteger:function(e){return o(e)&&i(e)<=9007199254740991}})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{parseFloat:parseFloat})},function(e,t,n){var r=n(266);r(r.S,\"Number\",{parseInt:parseInt})},function(e,t,n){var r=n(266),o=n(338),i=Math.sqrt,a=Math.acosh;r(r.S+r.F*!(a&&710==Math.floor(a(Number.MAX_VALUE))),\"Math\",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:o(e-1+i(e-1)*i(e+1))}})},function(e,t){e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,n){function r(e){return isFinite(e=+e)&&0!=e?e<0?-r(-e):Math.log(e+Math.sqrt(e*e+1)):e}var o=n(266);o(o.S,\"Math\",{asinh:r})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,n){var r=n(266),o=n(342);r(r.S,\"Math\",{cbrt:function(e){return o(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t,n){var r=n(266);r(r.S,\"Math\",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,n){var r=n(266),o=Math.exp;r(r.S,\"Math\",{cosh:function(e){return(o(e=+e)+o(-e))/2}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{expm1:n(346)})},function(e,t){e.exports=Math.expm1||function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}},function(e,t,n){var r=n(266),o=n(342),i=Math.pow,a=i(2,-52),s=i(2,-23),u=i(2,127)*(2-s),l=i(2,-126),c=function(e){return e+1/a-1/a};r(r.S,\"Math\",{fround:function(e){var t,n,r=Math.abs(e),i=o(e);return r<l?i*c(r/l/s)*l*s:(t=(1+s/a)*r,n=t-(t-r),n>u||n!=n?i*(1/0):i*n)}})},function(e,t,n){var r=n(266),o=Math.abs;r(r.S,\"Math\",{hypot:function(e,t){for(var n,r,i=0,a=0,s=arguments,u=s.length,l=0;a<u;)n=o(s[a++]),l<n?(r=l/n,i=i*r*r+1,l=n):n>0?(r=n/l,i+=r*r):i+=n;return l===1/0?1/0:l*Math.sqrt(i)}})},function(e,t,n){var r=n(266),o=Math.imul;r(r.S+r.F*n(272)(function(){return o(4294967295,5)!=-5||2!=o.length}),\"Math\",{imul:function(e,t){var n=65535,r=+e,o=+t,i=n&r,a=n&o;return 0|i*a+((n&r>>>16)*a+i*(n&o>>>16)<<16>>>0)}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{log10:function(e){return Math.log(e)/Math.LN10}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{log1p:n(338)})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{sign:n(342)})},function(e,t,n){var r=n(266),o=n(346),i=Math.exp;r(r.S+r.F*n(272)(function(){return!Math.sinh(-2e-17)!=-2e-17}),\"Math\",{sinh:function(e){return Math.abs(e=+e)<1?(o(e)-o(-e))/2:(i(e-1)-i(-e-1))*(Math.E/2)}})},function(e,t,n){var r=n(266),o=n(346),i=Math.exp;r(r.S,\"Math\",{tanh:function(e){var t=o(e=+e),n=o(-e);return t==1/0?1:n==1/0?-1:(t-n)/(i(e)+i(-e))}})},function(e,t,n){var r=n(266);r(r.S,\"Math\",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,n){var r=n(266),o=n(289),i=String.fromCharCode,a=String.fromCodePoint;r(r.S+r.F*(!!a&&1!=a.length),\"String\",{fromCodePoint:function(e){for(var t,n=[],r=arguments,a=r.length,s=0;a>s;){if(t=+r[s++],o(t,1114111)!==t)throw RangeError(t+\" is not a valid code point\");n.push(t<65536?i(t):i(((t-=65536)>>10)+55296,t%1024+56320))}return n.join(\"\")}})},function(e,t,n){var r=n(266),o=n(286),i=n(290);r(r.S,\"String\",{raw:function(e){for(var t=o(e.raw),n=i(t.length),r=arguments,a=r.length,s=[],u=0;n>u;)s.push(String(t[u++])),u<a&&s.push(String(r[u]));return s.join(\"\")}})},function(e,t,n){\"use strict\";n(326)(\"trim\",function(e){return function(){return e(this,3)}})},function(e,t,n){\"use strict\";var r=n(361)(!0);n(362)(String,\"String\",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){var r=n(288),o=n(285);e.exports=function(e){return function(t,n){var i,a,s=String(o(t)),u=r(n),l=s.length;return u<0||u>=l?e?\"\":void 0:(i=s.charCodeAt(u),i<55296||i>56319||u+1===l||(a=s.charCodeAt(u+1))<56320||a>57343?e?s.charAt(u):i:e?s.slice(u,u+2):(i-55296<<10)+(a-56320)+65536)}}},function(e,t,n){\"use strict\";var r=n(302),o=n(266),i=n(273),a=n(269),s=n(280),u=n(363),l=n(364),c=n(298),p=n(265).getProto,f=n(294)(\"iterator\"),d=!([].keys&&\"next\"in[].keys()),h=\"@@iterator\",v=\"keys\",m=\"values\",y=function(){return this};e.exports=function(e,t,n,g,b,E,_){l(n,t,g);var O,N,w=function(e){if(!d&&e in T)return T[e];switch(e){case v:return function(){return new n(this,e)};case m:return function(){return new n(this,e)}}return function(){return new n(this,e)}},C=t+\" Iterator\",P=b==m,x=!1,T=e.prototype,D=T[f]||T[h]||b&&T[b],M=D||w(b);if(D){var S=p(M.call(new e));c(S,C,!0),!r&&s(T,h)&&a(S,f,y),P&&D.name!==m&&(x=!0,M=function(){return D.call(this)})}if(r&&!_||!d&&!x&&T[f]||a(T,f,M),u[t]=M,u[C]=y,b)if(O={values:P?M:w(m),keys:E?M:w(v),entries:P?w(\"entries\"):M},_)for(N in O)N in T||i(T,N,O[N]);else o(o.P+o.F*(d||x),t,O);return O}},function(e,t){e.exports={}},function(e,t,n){\"use strict\";var r=n(265),o=n(270),i=n(298),a={};n(269)(a,n(294)(\"iterator\"),function(){return this}),e.exports=function(e,t,n){e.prototype=r.create(a,{next:o(1,n)}),i(e,t+\" Iterator\")}},function(e,t,n){\"use strict\";var r=n(266),o=n(361)(!1);r(r.P,\"String\",{codePointAt:function(e){return o(this,e)}})},function(e,t,n){\"use strict\";var r=n(266),o=n(290),i=n(367),a=\"endsWith\",s=\"\"[a];r(r.P+r.F*n(369)(a),\"String\",{endsWith:function(e){var t=i(this,e,a),n=arguments,r=n.length>1?n[1]:void 0,u=o(t.length),l=void 0===r?u:Math.min(o(r),u),c=String(e);return s?s.call(t,c,l):t.slice(l-c.length,l)===c}})},function(e,t,n){var r=n(368),o=n(285);e.exports=function(e,t,n){if(r(t))throw TypeError(\"String#\"+n+\" doesn't accept regex!\");return String(o(e))}},function(e,t,n){var r=n(279),o=n(281),i=n(294)(\"match\");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:\"RegExp\"==o(e))}},function(e,t,n){var r=n(294)(\"match\");e.exports=function(e){var t=/./;try{\"/./\"[e](t)}catch(n){try{return t[r]=!1,!\"/./\"[e](t)}catch(e){}}return!0}},function(e,t,n){\"use strict\";var r=n(266),o=n(367),i=\"includes\";r(r.P+r.F*n(369)(i),\"String\",{includes:function(e){return!!~o(this,e,i).indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(266);r(r.P,\"String\",{repeat:n(372)})},function(e,t,n){\"use strict\";var r=n(288),o=n(285);e.exports=function(e){var t=String(o(this)),n=\"\",i=r(e);if(i<0||i==1/0)throw RangeError(\"Count can't be negative\");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t,n){\"use strict\";var r=n(266),o=n(290),i=n(367),a=\"startsWith\",s=\"\"[a];r(r.P+r.F*n(369)(a),\"String\",{startsWith:function(e){var t=i(this,e,a),n=arguments,r=o(Math.min(n.length>1?n[1]:void 0,t.length)),u=String(e);return s?s.call(t,u,r):t.slice(r,r+u.length)===u}})},function(e,t,n){\"use strict\";var r=n(275),o=n(266),i=n(284),a=n(375),s=n(376),u=n(290),l=n(377);o(o.S+o.F*!n(378)(function(e){Array.from(e)}),\"Array\",{from:function(e){var t,n,o,c,p=i(e),f=\"function\"==typeof this?this:Array,d=arguments,h=d.length,v=h>1?d[1]:void 0,m=void 0!==v,y=0,g=l(p);if(m&&(v=r(v,h>2?d[2]:void 0,2)),void 0==g||f==Array&&s(g))for(t=u(p.length),n=new f(t);t>y;y++)n[y]=m?v(p[y],y):p[y];else for(c=g.call(p),n=new f;!(o=c.next()).done;y++)n[y]=m?a(c,v,[o.value,y],!0):o.value;return n.length=y,n}})},function(e,t,n){var r=n(283);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},function(e,t,n){var r=n(363),o=n(294)(\"iterator\"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},function(e,t,n){var r=n(310),o=n(294)(\"iterator\"),i=n(363);e.exports=n(268).getIteratorMethod=function(e){if(void 0!=e)return e[o]||e[\"@@iterator\"]||i[r(e)]}},function(e,t,n){var r=n(294)(\"iterator\"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}\ne.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},function(e,t,n){\"use strict\";var r=n(266);r(r.S+r.F*n(272)(function(){function e(){}return!(Array.of.call(e)instanceof e)}),\"Array\",{of:function(){for(var e=0,t=arguments,n=t.length,r=new(\"function\"==typeof this?this:Array)(n);n>e;)r[e]=t[e++];return r.length=n,r}})},function(e,t,n){\"use strict\";var r=n(381),o=n(382),i=n(363),a=n(286);e.exports=n(362)(Array,\"Array\",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):\"keys\"==t?o(0,n):\"values\"==t?o(0,e[n]):o(0,[n,e[n]])},\"values\"),i.Arguments=i.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},function(e,t,n){var r=n(294)(\"unscopables\"),o=Array.prototype;void 0==o[r]&&n(269)(o,r,{}),e.exports=function(e){o[r][e]=!0}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){n(384)(\"Array\")},function(e,t,n){\"use strict\";var r=n(267),o=n(265),i=n(271),a=n(294)(\"species\");e.exports=function(e){var t=r[e];i&&t&&!t[a]&&o.setDesc(t,a,{configurable:!0,get:function(){return this}})}},function(e,t,n){var r=n(266);r(r.P,\"Array\",{copyWithin:n(386)}),n(381)(\"copyWithin\")},function(e,t,n){\"use strict\";var r=n(284),o=n(289),i=n(290);e.exports=[].copyWithin||function(e,t){var n=r(this),a=i(n.length),s=o(e,a),u=o(t,a),l=arguments,c=l.length>2?l[2]:void 0,p=Math.min((void 0===c?a:o(c,a))-u,a-s),f=1;for(u<s&&s<u+p&&(f=-1,u+=p-1,s+=p-1);p-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},function(e,t,n){var r=n(266);r(r.P,\"Array\",{fill:n(388)}),n(381)(\"fill\")},function(e,t,n){\"use strict\";var r=n(284),o=n(289),i=n(290);e.exports=[].fill||function(e){for(var t=r(this),n=i(t.length),a=arguments,s=a.length,u=o(s>1?a[1]:void 0,n),l=s>2?a[2]:void 0,c=void 0===l?n:o(l,n);c>u;)t[u++]=e;return t}},function(e,t,n){\"use strict\";var r=n(266),o=n(291)(5),i=\"find\",a=!0;i in[]&&Array(1)[i](function(){a=!1}),r(r.P+r.F*a,\"Array\",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(381)(i)},function(e,t,n){\"use strict\";var r=n(266),o=n(291)(6),i=\"findIndex\",a=!0;i in[]&&Array(1)[i](function(){a=!1}),r(r.P+r.F*a,\"Array\",{findIndex:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(381)(i)},function(e,t,n){var r=n(265),o=n(267),i=n(368),a=n(392),s=o.RegExp,u=s,l=s.prototype,c=/a/g,p=/a/g,f=new s(c)!==c;!n(271)||f&&!n(272)(function(){return p[n(294)(\"match\")]=!1,s(c)!=c||s(p)==p||\"/a/i\"!=s(c,\"i\")})||(s=function(e,t){var n=i(e),r=void 0===t;return this instanceof s||!n||e.constructor!==s||!r?f?new u(n&&!r?e.source:e,t):u((n=e instanceof s)?e.source:e,n&&r?a.call(e):t):e},r.each.call(r.getNames(u),function(e){e in s||r.setDesc(s,e,{configurable:!0,get:function(){return u[e]},set:function(t){u[e]=t}})}),l.constructor=s,s.prototype=l,n(273)(o,\"RegExp\",s)),n(384)(\"RegExp\")},function(e,t,n){\"use strict\";var r=n(283);e.exports=function(){var e=r(this),t=\"\";return e.global&&(t+=\"g\"),e.ignoreCase&&(t+=\"i\"),e.multiline&&(t+=\"m\"),e.unicode&&(t+=\"u\"),e.sticky&&(t+=\"y\"),t}},function(e,t,n){var r=n(265);n(271)&&\"g\"!=/./g.flags&&r.setDesc(RegExp.prototype,\"flags\",{configurable:!0,get:n(392)})},function(e,t,n){n(395)(\"match\",1,function(e,t){return function(n){\"use strict\";var r=e(this),o=void 0==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))}})},function(e,t,n){\"use strict\";var r=n(269),o=n(273),i=n(272),a=n(285),s=n(294);e.exports=function(e,t,n){var u=s(e),l=\"\"[e];i(function(){var t={};return t[u]=function(){return 7},7!=\"\"[e](t)})&&(o(String.prototype,e,n(a,u,l)),r(RegExp.prototype,u,2==t?function(e,t){return l.call(e,this,t)}:function(e){return l.call(e,this)}))}},function(e,t,n){n(395)(\"replace\",2,function(e,t,n){return function(r,o){\"use strict\";var i=e(this),a=void 0==r?void 0:r[t];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)}})},function(e,t,n){n(395)(\"search\",1,function(e,t){return function(n){\"use strict\";var r=e(this),o=void 0==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))}})},function(e,t,n){n(395)(\"split\",2,function(e,t,n){return function(r,o){\"use strict\";var i=e(this),a=void 0==r?void 0:r[t];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)}})},function(e,t,n){\"use strict\";var r,o=n(265),i=n(302),a=n(267),s=n(275),u=n(310),l=n(266),c=n(279),p=n(283),f=n(276),d=n(400),h=n(401),v=n(308).set,m=n(306),y=n(294)(\"species\"),g=n(402),b=n(403),E=\"Promise\",_=a.process,O=\"process\"==u(_),N=a[E],w=function(){},C=function(e){var t,n=new N(w);return e&&(n.constructor=function(e){e(w,w)}),(t=N.resolve(n)).catch(w),t===n},P=function(){function e(t){var n=new N(t);return v(n,e.prototype),n}var t=!1;try{if(t=N&&N.resolve&&C(),v(e,N),e.prototype=o.create(N.prototype,{constructor:{value:e}}),e.resolve(5).then(function(){})instanceof e||(t=!1),t&&n(271)){var r=!1;N.resolve(o.setDesc({},\"then\",{get:function(){r=!0}})),t=r}}catch(e){t=!1}return t}(),x=function(e,t){return!(!i||e!==N||t!==r)||m(e,t)},T=function(e){var t=p(e)[y];return void 0!=t?t:e},D=function(e){var t;return!(!c(e)||\"function\"!=typeof(t=e.then))&&t},M=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError(\"Bad Promise constructor\");t=e,n=r}),this.resolve=f(t),this.reject=f(n)},S=function(e){try{e()}catch(e){return{error:e}}},k=function(e,t){if(!e.n){e.n=!0;var n=e.c;b(function(){for(var r=e.v,o=1==e.s,i=0,s=function(t){var n,i,a=o?t.ok:t.fail,s=t.resolve,u=t.reject;try{a?(o||(e.h=!0),n=a===!0?r:a(r),n===t.promise?u(TypeError(\"Promise-chain cycle\")):(i=D(n))?i.call(n,s,u):s(n)):u(r)}catch(e){u(e)}};n.length>i;)s(n[i++]);n.length=0,e.n=!1,t&&setTimeout(function(){var t,n,o=e.p;I(o)&&(O?_.emit(\"unhandledRejection\",r,o):(t=a.onunhandledrejection)?t({promise:o,reason:r}):(n=a.console)&&n.error&&n.error(\"Unhandled promise rejection\",r)),e.a=void 0},1)})}},I=function(e){var t,n=e._d,r=n.a||n.c,o=0;if(n.h)return!1;for(;r.length>o;)if(t=r[o++],t.fail||!I(t.promise))return!1;return!0},R=function(e){var t=this;t.d||(t.d=!0,t=t.r||t,t.v=e,t.s=2,t.a=t.c.slice(),k(t,!0))},A=function(e){var t,n=this;if(!n.d){n.d=!0,n=n.r||n;try{if(n.p===e)throw TypeError(\"Promise can't be resolved itself\");(t=D(e))?b(function(){var r={r:n,d:!1};try{t.call(e,s(A,r,1),s(R,r,1))}catch(e){R.call(r,e)}}):(n.v=e,n.s=1,k(n,!1))}catch(e){R.call({r:n,d:!1},e)}}};P||(N=function(e){f(e);var t=this._d={p:d(this,N,E),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{e(s(A,t,1),s(R,t,1))}catch(e){R.call(t,e)}},n(405)(N.prototype,{then:function(e,t){var n=new M(g(this,N)),r=n.promise,o=this._d;return n.ok=\"function\"!=typeof e||e,n.fail=\"function\"==typeof t&&t,o.c.push(n),o.a&&o.a.push(n),o.s&&k(o,!1),r},catch:function(e){return this.then(void 0,e)}})),l(l.G+l.W+l.F*!P,{Promise:N}),n(298)(N,E),n(384)(E),r=n(268)[E],l(l.S+l.F*!P,E,{reject:function(e){var t=new M(this),n=t.reject;return n(e),t.promise}}),l(l.S+l.F*(!P||C(!0)),E,{resolve:function(e){if(e instanceof N&&x(e.constructor,this))return e;var t=new M(this),n=t.resolve;return n(e),t.promise}}),l(l.S+l.F*!(P&&n(378)(function(e){N.all(e).catch(function(){})})),E,{all:function(e){var t=T(this),n=new M(t),r=n.resolve,i=n.reject,a=[],s=S(function(){h(e,!1,a.push,a);var n=a.length,s=Array(n);n?o.each.call(a,function(e,o){var a=!1;t.resolve(e).then(function(e){a||(a=!0,s[o]=e,--n||r(s))},i)}):r(s)});return s&&i(s.error),n.promise},race:function(e){var t=T(this),n=new M(t),r=n.reject,o=S(function(){h(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o&&r(o.error),n.promise}})},function(e,t){e.exports=function(e,t,n){if(!(e instanceof t))throw TypeError(n+\": use the 'new' operator!\");return e}},function(e,t,n){var r=n(275),o=n(375),i=n(376),a=n(283),s=n(290),u=n(377);e.exports=function(e,t,n,l){var c,p,f,d=u(e),h=r(n,l,t?2:1),v=0;if(\"function\"!=typeof d)throw TypeError(e+\" is not iterable!\");if(i(d))for(c=s(e.length);c>v;v++)t?h(a(p=e[v])[0],p[1]):h(e[v]);else for(f=d.call(e);!(p=f.next()).done;)o(f,h,p.value,t)}},function(e,t,n){var r=n(283),o=n(276),i=n(294)(\"species\");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||void 0==(n=r(a)[i])?t:o(n)}},function(e,t,n){var r,o,i,a=n(267),s=n(404).set,u=a.MutationObserver||a.WebKitMutationObserver,l=a.process,c=a.Promise,p=\"process\"==n(281)(l),f=function(){var e,t,n;for(p&&(e=l.domain)&&(l.domain=null,e.exit());r;)t=r.domain,n=r.fn,t&&t.enter(),n(),t&&t.exit(),r=r.next;o=void 0,e&&e.enter()};if(p)i=function(){l.nextTick(f)};else if(u){var d=1,h=document.createTextNode(\"\");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(a,f)};e.exports=function(e){var t={fn:e,next:void 0,domain:p&&l.domain};o&&(o.next=t),r||(r=t,i()),o=t}},function(e,t,n){var r,o,i,a=n(275),s=n(282),u=n(277),l=n(278),c=n(267),p=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.MessageChannel,v=0,m={},y=\"onreadystatechange\",g=function(){var e=+this;if(m.hasOwnProperty(e)){var t=m[e];delete m[e],t()}},b=function(e){g.call(e.data)};f&&d||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return m[++v]=function(){s(\"function\"==typeof e?e:Function(e),t)},r(v),v},d=function(e){delete m[e]},\"process\"==n(281)(p)?r=function(e){p.nextTick(a(g,e,1))}:h?(o=new h,i=o.port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):c.addEventListener&&\"function\"==typeof postMessage&&!c.importScripts?(r=function(e){c.postMessage(e+\"\",\"*\")},c.addEventListener(\"message\",b,!1)):r=y in l(\"script\")?function(e){u.appendChild(l(\"script\"))[y]=function(){u.removeChild(this),g.call(e)}}:function(e){setTimeout(a(g,e,1),0)}),e.exports={set:f,clear:d}},function(e,t,n){var r=n(273);e.exports=function(e,t){for(var n in t)r(e,n,t[n]);return e}},function(e,t,n){\"use strict\";var r=n(407);n(408)(\"Map\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=r.getEntry(this,e);return t&&t.v},set:function(e,t){return r.def(this,0===e?0:e,t)}},r,!0)},function(e,t,n){\"use strict\";var r=n(265),o=n(269),i=n(405),a=n(275),s=n(400),u=n(285),l=n(401),c=n(362),p=n(382),f=n(274)(\"id\"),d=n(280),h=n(279),v=n(384),m=n(271),y=Object.isExtensible||h,g=m?\"_s\":\"size\",b=0,E=function(e,t){if(!h(e))return\"symbol\"==typeof e?e:(\"string\"==typeof e?\"S\":\"P\")+e;if(!d(e,f)){if(!y(e))return\"F\";if(!t)return\"E\";o(e,f,++b)}return\"O\"+e[f]},_=function(e,t){var n,r=E(t);if(\"F\"!==r)return e._i[r];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,o){var c=e(function(e,i){s(e,c,t),e._i=r.create(null),e._f=void 0,e._l=void 0,e[g]=0,void 0!=i&&l(i,n,e[o],e)});return i(c.prototype,{clear:function(){for(var e=this,t=e._i,n=e._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete t[n.i];e._f=e._l=void 0,e[g]=0},delete:function(e){var t=this,n=_(t,e);if(n){var r=n.n,o=n.p;delete t._i[n.i],n.r=!0,o&&(o.n=r),r&&(r.p=o),t._f==n&&(t._f=r),t._l==n&&(t._l=o),t[g]--}return!!n},forEach:function(e){for(var t,n=a(e,arguments.length>1?arguments[1]:void 0,3);t=t?t.n:this._f;)for(n(t.v,t.k,this);t&&t.r;)t=t.p},has:function(e){return!!_(this,e)}}),m&&r.setDesc(c.prototype,\"size\",{get:function(){return u(this[g])}}),c},def:function(e,t,n){var r,o,i=_(e,t);return i?i.v=n:(e._l=i={i:o=E(t,!0),k:t,v:n,p:r=e._l,n:void 0,r:!1},e._f||(e._f=i),r&&(r.n=i),e[g]++,\"F\"!==o&&(e._i[o]=i)),e},getEntry:_,setStrong:function(e,t,n){c(e,t,function(e,t){this._t=e,this._k=t,this._l=void 0},function(){for(var e=this,t=e._k,n=e._l;n&&n.r;)n=n.p;return e._t&&(e._l=n=n?n.n:e._t._f)?\"keys\"==t?p(0,n.k):\"values\"==t?p(0,n.v):p(0,[n.k,n.v]):(e._t=void 0,p(1))},n?\"entries\":\"values\",!n,!0),v(t)}}},function(e,t,n){\"use strict\";var r=n(267),o=n(266),i=n(273),a=n(405),s=n(401),u=n(400),l=n(279),c=n(272),p=n(378),f=n(298);e.exports=function(e,t,n,d,h,v){var m=r[e],y=m,g=h?\"set\":\"add\",b=y&&y.prototype,E={},_=function(e){var t=b[e];i(b,e,\"delete\"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:\"has\"==e?function(e){return!(v&&!l(e))&&t.call(this,0===e?0:e)}:\"get\"==e?function(e){return v&&!l(e)?void 0:t.call(this,0===e?0:e)}:\"add\"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(\"function\"==typeof y&&(v||b.forEach&&!c(function(){(new y).entries().next()}))){var O,N=new y,w=N[g](v?{}:-0,1)!=N,C=c(function(){N.has(1)}),P=p(function(e){new y(e)});P||(y=t(function(t,n){u(t,y,e);var r=new m;return void 0!=n&&s(n,h,r[g],r),r}),y.prototype=b,b.constructor=y),v||N.forEach(function(e,t){O=1/t===-(1/0)}),(C||O)&&(_(\"delete\"),_(\"has\"),h&&_(\"get\")),(O||w)&&_(g),v&&b.clear&&delete b.clear}else y=d.getConstructor(t,e,h,g),a(y.prototype,n);return f(y,e),E[e]=y,o(o.G+o.W+o.F*(y!=m),E),v||d.setStrong(y,e,h),y}},function(e,t,n){\"use strict\";var r=n(407);n(408)(\"Set\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(this,e=0===e?0:e,e)}},r)},function(e,t,n){\"use strict\";var r=n(265),o=n(273),i=n(411),a=n(279),s=n(280),u=i.frozenStore,l=i.WEAK,c=Object.isExtensible||a,p={},f=n(408)(\"WeakMap\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){if(a(e)){if(!c(e))return u(this).get(e);if(s(e,l))return e[l][this._i]}},set:function(e,t){return i.def(this,e,t)}},i,!0,!0);7!=(new f).set((Object.freeze||Object)(p),7).get(p)&&r.each.call([\"delete\",\"has\",\"get\",\"set\"],function(e){var t=f.prototype,n=t[e];o(t,e,function(t,r){if(a(t)&&!c(t)){var o=u(this)[e](t,r);return\"set\"==e?this:o}return n.call(this,t,r)})})},function(e,t,n){\"use strict\";var r=n(269),o=n(405),i=n(283),a=n(279),s=n(400),u=n(401),l=n(291),c=n(280),p=n(274)(\"weak\"),f=Object.isExtensible||a,d=l(5),h=l(6),v=0,m=function(e){return e._l||(e._l=new y)},y=function(){this.a=[]},g=function(e,t){return d(e.a,function(e){return e[0]===t})};y.prototype={get:function(e){var t=g(this,e);if(t)return t[1]},has:function(e){return!!g(this,e)},set:function(e,t){var n=g(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=h(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,r){var i=e(function(e,o){s(e,i,t),e._i=v++,e._l=void 0,void 0!=o&&u(o,n,e[r],e)});return o(i.prototype,{delete:function(e){return!!a(e)&&(f(e)?c(e,p)&&c(e[p],this._i)&&delete e[p][this._i]:m(this).delete(e))},has:function(e){return!!a(e)&&(f(e)?c(e,p)&&c(e[p],this._i):m(this).has(e))}}),i},def:function(e,t,n){return f(i(t))?(c(t,p)||r(t,p,{}),t[p][e._i]=n):m(e).set(t,n),e},frozenStore:m,WEAK:p}},function(e,t,n){\"use strict\";var r=n(411);n(408)(\"WeakSet\",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(this,e,!0)}},r,!1,!0)},function(e,t,n){var r=n(266),o=Function.apply,i=n(283);r(r.S,\"Reflect\",{apply:function(e,t,n){return o.call(e,t,i(n))}})},function(e,t,n){var r=n(265),o=n(266),i=n(276),a=n(283),s=n(279),u=Function.bind||n(268).Function.prototype.bind;o(o.S+o.F*n(272)(function(){function e(){}return!(Reflect.construct(function(){},[],e)instanceof e)}),\"Reflect\",{construct:function(e,t){i(e),a(t);var n=arguments.length<3?e:i(arguments[2]);if(e==n){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var o=[null];return o.push.apply(o,t),new(u.apply(e,o))}var l=n.prototype,c=r.create(s(l)?l:Object.prototype),p=Function.apply.call(e,c,t);return s(p)?p:c}})},function(e,t,n){var r=n(265),o=n(266),i=n(283);o(o.S+o.F*n(272)(function(){Reflect.defineProperty(r.setDesc({},1,{value:1}),1,{value:2})}),\"Reflect\",{defineProperty:function(e,t,n){i(e);try{return r.setDesc(e,t,n),!0}catch(e){return!1}}})},function(e,t,n){var r=n(266),o=n(265).getDesc,i=n(283);r(r.S,\"Reflect\",{deleteProperty:function(e,t){var n=o(i(e),t);return!(n&&!n.configurable)&&delete e[t]}})},function(e,t,n){\"use strict\";var r=n(266),o=n(283),i=function(e){this._t=o(e),this._i=0;var t,n=this._k=[];for(t in e)n.push(t)};n(364)(i,\"Object\",function(){var e,t=this,n=t._k;do if(t._i>=n.length)return{value:void 0,done:!0};while(!((e=n[t._i++])in t._t));return{value:e,done:!1}}),r(r.S,\"Reflect\",{enumerate:function(e){return new i(e)}})},function(e,t,n){function r(e,t){var n,a,l=arguments.length<3?e:arguments[2];return u(e)===l?e[t]:(n=o.getDesc(e,t))?i(n,\"value\")?n.value:void 0!==n.get?n.get.call(l):void 0:s(a=o.getProto(e))?r(a,t,l):void 0}var o=n(265),i=n(280),a=n(266),s=n(279),u=n(283);a(a.S,\"Reflect\",{get:r})},function(e,t,n){var r=n(265),o=n(266),i=n(283);o(o.S,\"Reflect\",{getOwnPropertyDescriptor:function(e,t){return r.getDesc(i(e),t)}})},function(e,t,n){var r=n(266),o=n(265).getProto,i=n(283);r(r.S,\"Reflect\",{getPrototypeOf:function(e){return o(i(e))}})},function(e,t,n){var r=n(266);r(r.S,\"Reflect\",{has:function(e,t){return t in e}})},function(e,t,n){var r=n(266),o=n(283),i=Object.isExtensible;r(r.S,\"Reflect\",{isExtensible:function(e){return o(e),!i||i(e)}})},function(e,t,n){var r=n(266);r(r.S,\"Reflect\",{ownKeys:n(424)})},function(e,t,n){var r=n(265),o=n(283),i=n(267).Reflect;e.exports=i&&i.ownKeys||function(e){var t=r.getNames(o(e)),n=r.getSymbols;return n?t.concat(n(e)):t}},function(e,t,n){var r=n(266),o=n(283),i=Object.preventExtensions;r(r.S,\"Reflect\",{preventExtensions:function(e){o(e);try{return i&&i(e),!0}catch(e){return!1}}})},function(e,t,n){function r(e,t,n){var a,c,p=arguments.length<4?e:arguments[3],f=o.getDesc(u(e),t);if(!f){if(l(c=o.getProto(e)))return r(c,t,n,p);f=s(0)}return i(f,\"value\")?!(f.writable===!1||!l(p))&&(a=o.getDesc(p,t)||s(0),a.value=n,o.setDesc(p,t,a),!0):void 0!==f.set&&(f.set.call(p,n),!0)}var o=n(265),i=n(280),a=n(266),s=n(270),u=n(283),l=n(279);a(a.S,\"Reflect\",{set:r})},function(e,t,n){var r=n(266),o=n(308);o&&r(r.S,\"Reflect\",{setPrototypeOf:function(e,t){o.check(e,t);try{return o.set(e,t),!0}catch(e){return!1}}})},function(e,t,n){\"use strict\";var r=n(266),o=n(296)(!0);r(r.P,\"Array\",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(381)(\"includes\")},function(e,t,n){\"use strict\";var r=n(266),o=n(361)(!0);r(r.P,\"String\",{at:function(e){return o(this,e)}})},function(e,t,n){\"use strict\";var r=n(266),o=n(431);r(r.P,\"String\",{padLeft:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,n){var r=n(290),o=n(372),i=n(285);e.exports=function(e,t,n,a){var s=String(i(e)),u=s.length,l=void 0===n?\" \":String(n),c=r(t);if(c<=u)return s;\"\"==l&&(l=\" \");var p=c-u,f=o.call(l,Math.ceil(p/l.length));return f.length>p&&(f=f.slice(0,p)),a?f+s:s+f}},function(e,t,n){\"use strict\";var r=n(266),o=n(431);r(r.P,\"String\",{padRight:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,n){\"use strict\";n(326)(\"trimLeft\",function(e){return function(){return e(this,1)}})},function(e,t,n){\"use strict\";n(326)(\"trimRight\",function(e){return function(){return e(this,2)}})},function(e,t,n){var r=n(266),o=n(436)(/[\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\");r(r.S,\"RegExp\",{escape:function(e){return o(e)}})},function(e,t){e.exports=function(e,t){var n=t===Object(t)?function(e){return t[e]}:t;return function(t){return String(t).replace(e,n)}}},function(e,t,n){var r=n(265),o=n(266),i=n(424),a=n(286),s=n(270);o(o.S,\"Object\",{getOwnPropertyDescriptors:function(e){for(var t,n,o=a(e),u=r.setDesc,l=r.getDesc,c=i(o),p={},f=0;c.length>f;)n=l(o,t=c[f++]),t in p?u(p,t,s(0,n)):p[t]=n;return p}})},function(e,t,n){var r=n(266),o=n(439)(!1);r(r.S,\"Object\",{values:function(e){return o(e)}})},function(e,t,n){var r=n(265),o=n(286),i=r.isEnum;e.exports=function(e){return function(t){for(var n,a=o(t),s=r.getKeys(a),u=s.length,l=0,c=[];u>l;)i.call(a,n=s[l++])&&c.push(e?[n,a[n]]:a[n]);return c}}},function(e,t,n){var r=n(266),o=n(439)(!0);r(r.S,\"Object\",{entries:function(e){return o(e)}})},function(e,t,n){var r=n(266);r(r.P,\"Map\",{toJSON:n(442)(\"Map\")})},function(e,t,n){var r=n(401),o=n(310);e.exports=function(e){return function(){if(o(this)!=e)throw TypeError(e+\"#toJSON isn't generic\");var t=[];return r(this,!1,t.push,t),t}}},function(e,t,n){var r=n(266);r(r.P,\"Set\",{toJSON:n(442)(\"Set\")})},function(e,t,n){var r=n(265),o=n(266),i=n(275),a=n(268).Array||Array,s={},u=function(e,t){r.each.call(e.split(\",\"),function(e){void 0==t&&e in a?s[e]=a[e]:e in[]&&(s[e]=i(Function.call,[][e],t))})};u(\"pop,reverse,shift,keys,values,entries\",1),u(\"indexOf,every,some,forEach,map,filter,find,findIndex,includes\",3),u(\"join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\"),o(o.S,\"Array\",s)},function(e,t,n){var r=n(267),o=n(266),i=n(282),a=n(446),s=r.navigator,u=!!s&&/MSIE .\\./.test(s.userAgent),l=function(e){return u?function(t,n){return e(i(a,[].slice.call(arguments,2),\"function\"==typeof t?t:Function(t)),n)}:e};o(o.G+o.B+o.F*u,{setTimeout:l(r.setTimeout),setInterval:l(r.setInterval)})},function(e,t,n){\"use strict\";var r=n(447),o=n(282),i=n(276);e.exports=function(){for(var e=i(this),t=arguments.length,n=Array(t),a=0,s=r._,u=!1;t>a;)(n[a]=arguments[a++])===s&&(u=!0);return function(){var r,i=this,a=arguments,l=a.length,c=0,p=0;if(!u&&!l)return o(e,n,i);if(r=n.slice(),u)for(;t>c;c++)r[c]===s&&(r[c]=a[p++]);for(;l>p;)r.push(a[p++]);return o(e,r,i)}}},function(e,t,n){e.exports=n(267)},function(e,t,n){var r=n(266),o=n(404);r(r.G+r.B,{setImmediate:o.set,clearImmediate:o.clear})},function(e,t,n){n(380);var r=n(267),o=n(269),i=n(363),a=n(294)(\"iterator\"),s=r.NodeList,u=r.HTMLCollection,l=s&&s.prototype,c=u&&u.prototype,p=i.NodeList=i.HTMLCollection=i.Array;l&&!l[a]&&o(l,a,p),c&&!c[a]&&o(c,a,p)},function(e,t,n){(function(t,n){!function(t){\"use strict\";function r(e,t,n,r){var o=Object.create((t||i).prototype),a=new h(r||[]);return o._invoke=p(e,n,a),o}function o(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}function i(){}function a(){}function s(){}function u(e){[\"next\",\"throw\",\"return\"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function l(e){this.arg=e}function c(e){function t(t,n){var r=e[t](n),o=r.value;return o instanceof l?Promise.resolve(o.arg).then(i,a):Promise.resolve(o).then(function(e){return r.value=e,r})}function r(e,n){function r(){return t(e,n)}return o=o?o.then(r,r):new Promise(function(e){e(r())})}\"object\"==typeof n&&n.domain&&(t=n.domain.bind(t));var o,i=t.bind(e,\"next\"),a=t.bind(e,\"throw\");t.bind(e,\"return\");this._invoke=r}function p(e,t,n){var r=O;return function(i,a){if(r===w)throw new Error(\"Generator is already running\");if(r===C){if(\"throw\"===i)throw a;return m()}for(;;){var s=n.delegate;if(s){if(\"return\"===i||\"throw\"===i&&s.iterator[i]===y){n.delegate=null;var u=s.iterator.return;if(u){var l=o(u,s.iterator,a);if(\"throw\"===l.type){i=\"throw\",a=l.arg;continue}}if(\"return\"===i)continue}var l=o(s.iterator[i],s.iterator,a);if(\"throw\"===l.type){n.delegate=null,i=\"throw\",a=l.arg;continue}i=\"next\",a=y;var c=l.arg;if(!c.done)return r=N,c;n[s.resultName]=c.value,n.next=s.nextLoc,n.delegate=null}if(\"next\"===i)r===N?n.sent=a:n.sent=y;else if(\"throw\"===i){if(r===O)throw r=C,a;n.dispatchException(a)&&(i=\"next\",a=y)}else\"return\"===i&&n.abrupt(\"return\",a);r=w;var l=o(e,t,n);if(\"normal\"===l.type){r=n.done?C:N;var c={value:l.arg,done:n.done};if(l.arg!==P)return c;n.delegate&&\"next\"===i&&(a=y)}else\"throw\"===l.type&&(r=C,i=\"throw\",a=l.arg)}}}function f(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function d(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function h(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(f,this),this.reset(!0)}function v(e){if(e){var t=e[b];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n<e.length;)if(g.call(e,n))return t.value=e[n],t.done=!1,t;return t.value=y,t.done=!0,t};return r.next=r}}return{next:m}}function m(){return{value:y,done:!0}}var y,g=Object.prototype.hasOwnProperty,b=\"function\"==typeof Symbol&&Symbol.iterator||\"@@iterator\",E=\"object\"==typeof e,_=t.regeneratorRuntime;if(_)return void(E&&(e.exports=_));_=t.regeneratorRuntime=E?e.exports:{},_.wrap=r;var O=\"suspendedStart\",N=\"suspendedYield\",w=\"executing\",C=\"completed\",P={},x=s.prototype=i.prototype;a.prototype=x.constructor=s,s.constructor=a,a.displayName=\"GeneratorFunction\",_.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===a||\"GeneratorFunction\"===(t.displayName||t.name))},_.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,s):e.__proto__=s,e.prototype=Object.create(x),e},_.awrap=function(e){return new l(e)},u(c.prototype),_.async=function(e,t,n,o){var i=new c(r(e,t,n,o));return _.isGeneratorFunction(t)?i:i.next().then(function(e){return e.done?e.value:i.next()})},u(x),x[b]=function(){return this},x.toString=function(){return\"[object Generator]\"},_.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},_.values=v,h.prototype={constructor:h,reset:function(e){if(this.prev=0,this.next=0,this.sent=y,this.done=!1,this.delegate=null,this.tryEntries.forEach(d),!e)for(var t in this)\"t\"===t.charAt(0)&&g.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=y)},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,r){return i.type=\"throw\",i.arg=e,n.next=t,!!r}if(this.done)throw e;for(var n=this,r=this.tryEntries.length-1;r>=0;--r){var o=this.tryEntries[r],i=o.completion;if(\"root\"===o.tryLoc)return t(\"end\");if(o.tryLoc<=this.prev){var a=g.call(o,\"catchLoc\"),s=g.call(o,\"finallyLoc\");if(a&&s){if(this.prev<o.catchLoc)return t(o.catchLoc,!0);if(this.prev<o.finallyLoc)return t(o.finallyLoc)}else if(a){if(this.prev<o.catchLoc)return t(o.catchLoc,!0)}else{if(!s)throw new Error(\"try statement without catch or finally\");if(this.prev<o.finallyLoc)return t(o.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&g.call(r,\"finallyLoc\")&&this.prev<r.finallyLoc){var o=r;break}}o&&(\"break\"===e||\"continue\"===e)&&o.tryLoc<=t&&t<=o.finallyLoc&&(o=null);var i=o?o.completion:{};return i.type=e,i.arg=t,o?this.next=o.finallyLoc:this.complete(i),P},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=e.arg,this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t)},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),d(n),P}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;d(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:v(e),resultName:t,nextLoc:n},P}}}(\"object\"==typeof t?t:\"object\"==typeof window?window:\"object\"==typeof self?self:this)}).call(t,function(){return this}(),n(6))},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}();n(261);var o=n(160),i=n(452),a=n(1),s=a.FancyWebSocket,u=n(453),l=o.createActions([\"setAll\",\"updateStats\",\"startCrawl\",\"stopCrawl\",\"pauseCrawl\",\"resumeCrawl\"]);t.Actions=l;var c=o.createStore({init:function(){this.jobs=[],this.listenToMany(l),this.triggerDebounced=i(this.trigger,200)},getInitialState:function(){return this.jobs},onSetAll:function(e){this.jobs=e,this.triggerDebounced(e)},onUpdateStats:function(e,t){this.jobs.filter(function(t){return t.id==e}).forEach(function(e){e.stats=Object.assign(e.stats||{},t)}),this.trigger(this.jobs)},onStartCrawl:function(e,t){u.startCrawl(e,t)},onStopCrawl:function(e){u.stopCrawl(e)},onPauseCrawl:function(e){u.pauseCrawl(e)},onResumeCrawl:function(e){u.resumeCrawl(e)}});t.store=c;var p=s.instance();p.on(\"jobs:state\",function(e){l.setAll(e)}),p.on(\"stats:changed\",function(e){var t=r(e,2),n=t[0],o=t[1];l.updateStats(n,o)}),l.setAll(window.INITIAL_DATA.jobs)},function(e,t){e.exports=function(e,t,n){function r(){var l=Date.now()-s;l<t&&l>=0?o=setTimeout(r,t-l):(o=null,n||(u=e.apply(a,i),a=i=null))}var o,i,a,s,u;null==t&&(t=100);var l=function(){a=this,i=arguments,s=Date.now();var l=n&&!o;return o||(o=setTimeout(r,t)),l&&(u=e.apply(a,i),a=i=null),u};return l.clear=function(){o&&(clearTimeout(o),o=null)},l.flush=function(){o&&(u=e.apply(a,i),a=i=null,clearTimeout(o),o=null)},l}},function(e,t){\"use strict\";function n(e,t){var n=window.START_CRAWL_URL,r={domain:e,options:t};$.post(n,r)}function r(e){$.post(window.STOP_CRAWL_URL,{job_id:e})}function o(e){$.post(window.PAUSE_CRAWL_URL,{job_id:e})}function i(e){$.post(window.RESUME_CRAWL_URL,{job_id:e})}Object.defineProperty(t,\"__esModule\",{value:!0}),t.startCrawl=n,t.stopCrawl=r,t.pauseCrawl=o,t.resumeCrawl=i},function(e,t,n){\"use strict\";function r(e){return a(1e3*e||0,{compact:!1})}function o(e){s.render(s.createElement(h,null),document.getElementById(e))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.installHeader=o;var i=n(455),a=n(456),s=n(4),u=n(160),l=n(180),c=(l.Table,n(461)),p=n(260),f=n(462),d=f.KeyValueTable,h=s.createClass({displayName:\"HeaderProcessStats\",mixins:[u.connect(c.store,\"stats\"),u.connect(p.store,\"connectionStatus\")],render:function(){if(\"offline\"==this.state.connectionStatus)return s.createElement(\"span\",null);var e=this.state.stats,t={marginTop:15};return s.createElement(\"div\",{className:\"navbar-text\",style:t},i(e.ram_rss||0),\", CPU: \",(e.cpu_percent||0).toFixed(1),\"%\")}});t.HeaderProcessStats=h;var v=s.createClass({displayName:\"ProcessStatsTable\",mixins:[u.connect(c.store,\"stats\")],render:function(){var e=this.state.stats,t=[[\"CPU %\",(e.cpu_percent||0).toFixed(1)],[\"User Time\",r(e.cpu_time_user)],[\"System Time\",r(e.cpu_time_system)],[\"RSS\",i(e.ram_rss||0,{round:1})],[\"VMS\",i(e.ram_vms||0)],[\"RAM %\",(e.ram_percent||0).toFixed(2)],[\"File Descriptors\",e.num_fds],[\"Threads\",e.num_threads]],n=this.props.fill,o=t.map(function(e){return s.createElement(\"tr\",{key:e[0]},s.createElement(\"td\",null,e[0]),s.createElement(\"td\",null,e[1]))});return s.createElement(d,{noheader:n},o)}});t.ProcessStatsTable=v},function(e,t,n){(function(t){\"use strict\";/**\n\t * filesize\n\t *\n\t * @copyright 2017 Jason Mulligan <jason.mulligan@avoidwork.com>\n\t * @license BSD-3-Clause\n\t * @version 3.5.11\n\t */\n!function(t){function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],a=0,s=void 0,u=void 0,l=void 0,c=void 0,p=void 0,f=void 0,d=void 0,h=void 0,v=void 0,m=void 0,y=void 0,g=void 0,b=void 0,E=void 0;if(isNaN(e))throw new Error(\"Invalid arguments\");return l=t.bits===!0,y=t.unix===!0,u=t.base||2,m=void 0!==t.round?t.round:y?1:2,g=void 0!==t.spacer?t.spacer:y?\"\":\" \",E=t.symbols||t.suffixes||{},b=2===u?t.standard||\"jedec\":\"jedec\",v=t.output||\"string\",p=t.fullform===!0,f=t.fullforms instanceof Array?t.fullforms:[],s=void 0!==t.exponent?t.exponent:-1,h=Number(e),d=h<0,c=u>2?1e3:1024,d&&(h=-h),(s===-1||isNaN(s))&&(s=Math.floor(Math.log(h)/Math.log(c)),s<0&&(s=0)),s>8&&(s=8),0===h?(n[0]=0,n[1]=y?\"\":o[b][l?\"bits\":\"bytes\"][s]):(a=h/(2===u?Math.pow(2,10*s):Math.pow(1e3,s)),l&&(a*=8,a>=c&&s<8&&(a/=c,s++)),n[0]=Number(a.toFixed(s>0?m:0)),n[1]=10===u&&1===s?l?\"kb\":\"kB\":o[b][l?\"bits\":\"bytes\"][s],y&&(n[1]=\"jedec\"===b?n[1].charAt(0):s>0?n[1].replace(/B$/,\"\"):n[1],r.test(n[1])&&(n[0]=Math.floor(n[0]),n[1]=\"\"))),d&&(n[0]=-n[0]),n[1]=E[n[1]]||n[1],\"array\"===v?n:\"exponent\"===v?s:\"object\"===v?{value:n[0],suffix:n[1],symbol:n[1]}:(p&&(n[1]=f[s]?f[s]:i[b][s]+(l?\"bit\":\"byte\")+(1===n[0]?\"\":\"s\")),n.join(g))}var r=/^(b|B)$/,o={iec:{bits:[\"b\",\"Kib\",\"Mib\",\"Gib\",\"Tib\",\"Pib\",\"Eib\",\"Zib\",\"Yib\"],bytes:[\"B\",\"KiB\",\"MiB\",\"GiB\",\"TiB\",\"PiB\",\"EiB\",\"ZiB\",\"YiB\"]},jedec:{bits:[\"b\",\"Kb\",\"Mb\",\"Gb\",\"Tb\",\"Pb\",\"Eb\",\"Zb\",\"Yb\"],bytes:[\"B\",\"KB\",\"MB\",\"GB\",\"TB\",\"PB\",\"EB\",\"ZB\",\"YB\"]}},i={iec:[\"\",\"kibi\",\"mebi\",\"gibi\",\"tebi\",\"pebi\",\"exbi\",\"zebi\",\"yobi\"],jedec:[\"\",\"kilo\",\"mega\",\"giga\",\"tera\",\"peta\",\"exa\",\"zetta\",\"yotta\"]};n.partial=function(e){return function(t){return n(t,e)}},e.exports=n}(\"undefined\"!=typeof window?window:t)}).call(t,function(){return this}())},function(e,t,n){\"use strict\";var r=n(457),o=n(458),i=n(459);e.exports=function(e,t){if(!i(e))throw new TypeError(\"Expected a finite number\");if(t=t||{},e<1e3)return Math.ceil(e)+(t.verbose?\" \"+o(\"millisecond\",Math.ceil(e)):\"ms\");var n=[],a=function(e,r,i,a){if(0!==e){var s=t.verbose?\" \"+o(r,e):i;n.push((a||e)+s)}},s=r(e);if(a(s.days,\"day\",\"d\"),a(s.hours,\"hour\",\"h\"),a(s.minutes,\"minute\",\"m\"),t.compact)return a(s.seconds,\"second\",\"s\"),\"~\"+n[0];var u=e/1e3%60,l=\"number\"==typeof t.secDecimalDigits?t.secDecimalDigits:1,c=u.toFixed(l).replace(/\\.0$/,\"\");return a(u,\"second\",\"s\",c),n.join(\" \")}},function(e,t){\"use strict\";e.exports=function(e){if(\"number\"!=typeof e)throw new TypeError(\"Expected a number\");var t=e>0?Math.floor:Math.ceil;return{days:t(e/864e5),hours:t(e/36e5)%24,minutes:t(e/6e4)%60,seconds:t(e/1e3)%60,milliseconds:t(e)%1e3}}},function(e,t){\"use strict\";e.exports=function(e,t,n){return\"number\"==typeof t&&(n=t,t=e+\"s\"),1===n?e:t}},function(e,t,n){\"use strict\";var r=n(460);e.exports=Number.isFinite||function(e){return!(\"number\"!=typeof e||r(e)||e===1/0||e===-(1/0))}},function(e,t){\"use strict\";e.exports=Number.isNaN||function(e){return e!==e}},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(160),o=n(1),i=o.FancyWebSocket;n(261);var a=r.createActions([\"update\"]);t.Actions=a;var s=r.createStore({init:function(){this.stats={},this.listenTo(a.update,this.onUpdate)},getInitialState:function(){return this.stats},onUpdate:function(e){this.stats=e,e.server_time&&(this.stats.serverTime=new Date(e.server_time)),this.trigger(this.stats)}});t.store=s;var u=i.instance();u.on(\"process:stats\",function(e){a.update(e)}),window.INITIAL_PROCESS_STATS&&a.update(window.INITIAL_PROCESS_STATS)},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(4),o=n(180),i=o.Table,a=r.createClass({displayName:\"KeyValueTable\",render:function(){if(this.props.noheader)var e=r.createElement(\"thead\",null);else var e=r.createElement(\"thead\",null,r.createElement(\"th\",null,\"Name\"),r.createElement(\"th\",{className:\"col-md-3\"},\"Value\"));return r.createElement(i,{condensed:!0},e,r.createElement(\"tbody\",null,this.props.children))}});t.KeyValueTable=a},function(e,t,n){\"use strict\";t.DefaultRoute=n(464),t.Link=n(479),t.NotFoundRoute=n(480),t.Redirect=n(481),t.Route=n(478),t.ActiveHandler=n(476),t.RouteHandler=t.ActiveHandler,t.HashLocation=n(482),t.HistoryLocation=n(486),t.RefreshLocation=n(487),t.StaticLocation=n(488),t.TestLocation=n(489),t.ImitateBrowserBehavior=n(490),t.ScrollToTopBehavior=n(491),t.History=n(484),t.Navigation=n(492),t.State=n(493),t.createRoute=n(467).createRoute,t.createDefaultRoute=n(467).createDefaultRoute,t.createNotFoundRoute=n(467).createNotFoundRoute,t.createRedirect=n(467).createRedirect,t.createRoutesFromReactChildren=n(494),t.create=n(495),t.run=n(504)},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},a=n(465),s=n(476),u=n(478),l=function(e){function t(){r(this,t),i(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),t}(u);l.propTypes={name:a.string,path:a.falsy,children:a.falsy,handler:a.func.isRequired},l.defaultProps={handler:s},e.exports=l},function(e,t,n){\"use strict\";var r=n(466),o=n(4).PropTypes,i=n(467),a=r({},o,{falsy:function(e,t,n){if(e[t])return new Error(\"<\"+n+'> should not have a \"'+t+'\" prop')},route:o.instanceOf(i),router:o.func});e.exports=a},function(e,t){\"use strict\";function n(e){if(null==e)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(e)}e.exports=Object.assign||function(e,t){for(var r,o,i=n(e),a=1;a<arguments.length;a++){r=arguments[a],o=Object.keys(Object(r));for(var s=0;s<o.length;s++)i[o[s]]=r[o[s]]}return i}},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var o,i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(466),s=n(468),u=n(469),l=n(470),c=function(){function e(t,n,o,i,a,s,u,c){r(this,e),this.name=t,this.path=n,this.paramNames=l.extractParamNames(this.path),this.ignoreScrollBehavior=!!o,this.isDefault=!!i,this.isNotFound=!!a,this.onEnter=s,this.onLeave=u,this.handler=c}return i(e,null,[{key:\"createRoute\",value:function(t,n){t=t||{},\"string\"==typeof t&&(t={path:t});var r=o;r?u(null==t.parentRoute||t.parentRoute===r,\"You should not use parentRoute with createRoute inside another route's child callback; it is ignored\"):r=t.parentRoute;var i=t.name,a=t.path||i;!a||t.isDefault||t.isNotFound?a=r?r.path:\"/\":l.isAbsolute(a)?r&&s(a===r.path||0===r.paramNames.length,'You cannot nest path \"%s\" inside \"%s\"; the parent requires URL parameters',a,r.path):a=r?l.join(r.path,a):\"/\"+a,t.isNotFound&&!/\\*$/.test(a)&&(a+=\"*\");var c=new e(i,a,t.ignoreScrollBehavior,t.isDefault,t.isNotFound,t.onEnter,t.onLeave,t.handler);if(r&&(c.isDefault?(s(null==r.defaultRoute,\"%s may not have more than one default route\",r),r.defaultRoute=c):c.isNotFound&&(s(null==r.notFoundRoute,\"%s may not have more than one not found route\",r),r.notFoundRoute=c),r.appendChild(c)),\"function\"==typeof n){var p=o;o=c,n.call(c,c),o=p}return c}},{key:\"createDefaultRoute\",value:function(t){return e.createRoute(a({},t,{isDefault:!0}))}},{key:\"createNotFoundRoute\",value:function(t){return e.createRoute(a({},t,{isNotFound:!0}))}},{key:\"createRedirect\",value:function(t){return e.createRoute(a({},t,{path:t.path||t.from||\"*\",onEnter:function(e,n,r){e.redirect(t.to,t.params||n,t.query||r)}}))}}]),i(e,[{key:\"appendChild\",value:function(t){s(t instanceof e,\"route.appendChild must use a valid Route\"),this.childRoutes||(this.childRoutes=[]),this.childRoutes.push(t)}},{key:\"toString\",value:function(){var e=\"<Route\";return this.name&&(e+=' name=\"'+this.name+'\"'),e+=' path=\"'+this.path+'\">'}}]),e}();e.exports=c},function(e,t,n){(function(t){\"use strict\";var n=function(e,n,r,o,i,a,s,u){if(\"production\"!==t.env.NODE_ENV&&void 0===n)throw new Error(\"invariant requires an error message argument\");if(!e){var l;if(void 0===n)l=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[r,o,i,a,s,u],p=0;l=new Error(n.replace(/%s/g,function(){return c[p++]})),l.name=\"Invariant Violation\"}throw l.framesToPop=1,l}};e.exports=n}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";var n=\"production\"!==t.env.NODE_ENV,r=function(){};n&&(r=function(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),o=2;o<n;o++)r[o-2]=arguments[o];if(void 0===t)throw new Error(\"`warning(condition, format, ...args)` requires a warning message argument\");if(t.length<10||/^[s\\W]*$/.test(t))throw new Error(\"The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: \"+t);if(0!==t.indexOf(\"Failed Composite propType: \")&&!e){var i=0,a=\"Warning: \"+t.replace(/%s/g,function(){return r[i++]});console.warn(a);try{throw new Error(a)}catch(e){}}}),e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){if(!(e in p)){var t=[],n=e.replace(s,function(e,n){return n?(t.push(n),\"([^/?#]+)\"):\"*\"===e?(t.push(\"splat\"),\"(.*?)\"):\"\\\\\"+e});p[e]={matcher:new RegExp(\"^\"+n+\"$\",\"i\"),paramNames:t}}return p[e]}var o=n(468),i=n(466),a=n(471),s=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\\[\\]\\\\+|{}^$]/g,u=/:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g,l=/\\/\\/\\?|\\/\\?\\/|\\/\\?(?![^\\/=]+=.*$)/g,c=/\\?(.*)$/,p={},f={isAbsolute:function(e){return\"/\"===e.charAt(0)},join:function(e,t){return e.replace(/\\/*$/,\"/\")+t},extractParamNames:function(e){return r(e).paramNames},extractParams:function(e,t){var n=r(e),o=n.matcher,i=n.paramNames,a=t.match(o);if(!a)return null;var s={};return i.forEach(function(e,t){s[e]=a[t+1]}),s},injectParams:function(e,t){t=t||{};var n=0;return e.replace(u,function(r,i){if(i=i||\"splat\",\"?\"===i.slice(-1)){if(i=i.slice(0,-1),null==t[i])return\"\"}else o(null!=t[i],'Missing \"%s\" parameter for path \"%s\"',i,e);var a;return\"splat\"===i&&Array.isArray(t[i])?(a=t[i][n++],o(null!=a,'Missing splat # %s for path \"%s\"',n,e)):a=t[i],a}).replace(l,\"/\")},extractQuery:function(e){var t=e.match(c);return t&&a.parse(t[1])},withoutQuery:function(e){return e.replace(c,\"\")},withQuery:function(e,t){var n=f.extractQuery(e);n&&(t=t?i(n,t):n);var r=a.stringify(t,{arrayFormat:\"brackets\"});return r?f.withoutQuery(e)+\"?\"+r:f.withoutQuery(e)}};e.exports=f},function(e,t,n){e.exports=n(472)},function(e,t,n){var r=n(473),o=n(475);e.exports={stringify:r,parse:o}},function(e,t,n){var r=n(474),o={delimiter:\"&\",arrayPrefixGenerators:{brackets:function(e,t){return e+\"[]\"},indices:function(e,t){return e+\"[\"+t+\"]\"},repeat:function(e,t){return e}}};o.stringify=function(e,t,n){if(r.isBuffer(e)?e=e.toString():e instanceof Date?e=e.toISOString():null===e&&(e=\"\"),\"string\"==typeof e||\"number\"==typeof e||\"boolean\"==typeof e)return[encodeURIComponent(t)+\"=\"+encodeURIComponent(e)];var i=[];if(\"undefined\"==typeof e)return i;for(var a=Object.keys(e),s=0,u=a.length;s<u;++s){var l=a[s];i=Array.isArray(e)?i.concat(o.stringify(e[l],n(t,l),n)):i.concat(o.stringify(e[l],t+\"[\"+l+\"]\",n))}return i},e.exports=function(e,t){t=t||{};var n=\"undefined\"==typeof t.delimiter?o.delimiter:t.delimiter,r=[];if(\"object\"!=typeof e||null===e)return\"\";var i;i=t.arrayFormat in o.arrayPrefixGenerators?t.arrayFormat:\"indices\"in t?t.indices?\"indices\":\"repeat\":\"indices\";for(var a=o.arrayPrefixGenerators[i],s=Object.keys(e),u=0,l=s.length;u<l;++u){var c=s[u];r=r.concat(o.stringify(e[c],c,a))}return r.join(n)}},function(e,t){t.arrayToObject=function(e){for(var t={},n=0,r=e.length;n<r;++n)\"undefined\"!=typeof e[n]&&(t[n]=e[n]);return t},t.merge=function(e,n){if(!n)return e;if(\"object\"!=typeof n)return Array.isArray(e)?e.push(n):e[n]=!0,e;if(\"object\"!=typeof e)return e=[e].concat(n);Array.isArray(e)&&!Array.isArray(n)&&(e=t.arrayToObject(e));for(var r=Object.keys(n),o=0,i=r.length;o<i;++o){var a=r[o],s=n[a];e[a]?e[a]=t.merge(e[a],s):e[a]=s}return e},t.decode=function(e){try{return decodeURIComponent(e.replace(/\\+/g,\" \"))}catch(t){return e}},t.compact=function(e,n){if(\"object\"!=typeof e||null===e)return e;n=n||[];var r=n.indexOf(e);if(r!==-1)return n[r];if(n.push(e),Array.isArray(e)){for(var o=[],i=0,a=e.length;i<a;++i)\"undefined\"!=typeof e[i]&&o.push(e[i]);return o}var s=Object.keys(e);for(i=0,a=s.length;i<a;++i){var u=s[i];e[u]=t.compact(e[u],n)}return e},t.isRegExp=function(e){return\"[object RegExp]\"===Object.prototype.toString.call(e)},t.isBuffer=function(e){return null!==e&&\"undefined\"!=typeof e&&!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))}},function(e,t,n){var r=n(474),o={delimiter:\"&\",depth:5,arrayLimit:20,parameterLimit:1e3};o.parseValues=function(e,t){for(var n={},o=e.split(t.delimiter,t.parameterLimit===1/0?void 0:t.parameterLimit),i=0,a=o.length;i<a;++i){var s=o[i],u=s.indexOf(\"]=\")===-1?s.indexOf(\"=\"):s.indexOf(\"]=\")+1;if(u===-1)n[r.decode(s)]=\"\";else{var l=r.decode(s.slice(0,u)),c=r.decode(s.slice(u+1));if(Object.prototype.hasOwnProperty(l))continue;n.hasOwnProperty(l)?n[l]=[].concat(n[l]).concat(c):n[l]=c}}return n},o.parseObject=function(e,t,n){if(!e.length)return t;var r=e.shift(),i={};if(\"[]\"===r)i=[],i=i.concat(o.parseObject(e,t,n));else{var a=\"[\"===r[0]&&\"]\"===r[r.length-1]?r.slice(1,r.length-1):r,s=parseInt(a,10),u=\"\"+s;!isNaN(s)&&r!==a&&u===a&&s>=0&&s<=n.arrayLimit?(i=[],i[s]=o.parseObject(e,t,n)):i[a]=o.parseObject(e,t,n)}return i},o.parseKeys=function(e,t,n){if(e){var r=/^([^\\[\\]]*)/,i=/(\\[[^\\[\\]]*\\])/g,a=r.exec(e);if(!Object.prototype.hasOwnProperty(a[1])){var s=[];a[1]&&s.push(a[1]);for(var u=0;null!==(a=i.exec(e))&&u<n.depth;)++u,Object.prototype.hasOwnProperty(a[1].replace(/\\[|\\]/g,\"\"))||s.push(a[1]);return a&&s.push(\"[\"+e.slice(a.index)+\"]\"),o.parseObject(s,t,n)}}},e.exports=function(e,t){if(\"\"===e||null===e||\"undefined\"==typeof e)return{};t=t||{},t.delimiter=\"string\"==typeof t.delimiter||r.isRegExp(t.delimiter)?t.delimiter:o.delimiter,t.depth=\"number\"==typeof t.depth?t.depth:o.depth,t.arrayLimit=\"number\"==typeof t.arrayLimit?t.arrayLimit:o.arrayLimit,t.parameterLimit=\"number\"==typeof t.parameterLimit?t.parameterLimit:o.parameterLimit;for(var n=\"string\"==typeof e?o.parseValues(e,t):e,i={},a=Object.keys(n),s=0,u=a.length;s<u;++s){var l=a[s],c=o.parseKeys(l,n[l],t);i=r.merge(i,c)}return r.compact(i)}},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},s=n(4),u=n(477),l=n(466),c=n(465),p=\"__routeHandler__\",f=function(e){function t(){r(this,t),a(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),i(t,[{key:\"getChildContext\",value:function(){return{routeDepth:this.context.routeDepth+1}}},{key:\"componentDidMount\",value:function(){this._updateRouteComponent(this.refs[p])}},{key:\"componentDidUpdate\",value:function(){this._updateRouteComponent(this.refs[p])}},{key:\"componentWillUnmount\",value:function(){this._updateRouteComponent(null)}},{key:\"_updateRouteComponent\",value:function(e){this.context.router.setRouteComponentAtDepth(this.getRouteDepth(),e)}},{key:\"getRouteDepth\",value:function(){return this.context.routeDepth}},{key:\"createChildRouteHandler\",value:function(e){var t=this.context.router.getRouteAtDepth(this.getRouteDepth());if(null==t)return null;var n=l({},e||this.props,{ref:p,params:this.context.router.getCurrentParams(),query:this.context.router.getCurrentQuery()});return s.createElement(t.handler,n)}},{key:\"render\",value:function(){var e=this.createChildRouteHandler();return e?s.createElement(u,null,e):s.createElement(\"script\",null)}}]),t}(s.Component);f.contextTypes={routeDepth:c.number.isRequired,router:c.router.isRequired},f.childContextTypes={routeDepth:c.number.isRequired},e.exports=f},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},s=n(4),u=function(e){function t(){r(this,t),a(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),i(t,[{key:\"render\",value:function(){return this.props.children}}]),t}(s.Component);e.exports=u},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},s=n(4),u=n(468),l=n(465),c=n(476),p=function(e){function t(){r(this,t),a(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),i(t,[{key:\"render\",value:function(){u(!1,\"%s elements are for router configuration only and should not be rendered\",this.constructor.name)}}]),t}(s.Component);p.propTypes={name:l.string,path:l.string,handler:l.func,ignoreScrollBehavior:l.bool},p.defaultProps={handler:c},e.exports=p},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e){return 0===e.button}function a(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}var s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),u=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},l=n(4),c=n(466),p=n(465),f=function(e){function t(){r(this,t),u(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),s(t,[{key:\"handleClick\",value:function(e){var t,n=!0;this.props.onClick&&(t=this.props.onClick(e)),!a(e)&&i(e)&&(t!==!1&&e.defaultPrevented!==!0||(n=!1),e.preventDefault(),n&&this.context.router.transitionTo(this.props.to,this.props.params,this.props.query))}},{key:\"getHref\",value:function(){return this.context.router.makeHref(this.props.to,this.props.params,this.props.query)}},{key:\"getClassName\",value:function(){var e=this.props.className;return this.getActiveState()&&(e+=\" \"+this.props.activeClassName),e}},{key:\"getActiveState\",value:function(){return this.context.router.isActive(this.props.to,this.props.params,this.props.query)}},{key:\"render\",value:function(){var e=c({},this.props,{href:this.getHref(),className:this.getClassName(),onClick:this.handleClick.bind(this)});return e.activeStyle&&this.getActiveState()&&(e.style=e.activeStyle),delete e.to,delete e.params,delete e.query,delete e.activeClassName,delete e.activeStyle,l.DOM.a(e,this.props.children)}}]),t}(l.Component);f.contextTypes={router:p.router.isRequired},f.propTypes={activeClassName:p.string.isRequired,to:p.oneOfType([p.string,p.route]).isRequired,params:p.object,query:p.object,activeStyle:p.object,onClick:p.func},f.defaultProps={activeClassName:\"active\",className:\"\"},e.exports=f},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},a=n(465),s=n(476),u=n(478),l=function(e){function t(){r(this,t),i(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),t}(u);l.propTypes={name:a.string,path:a.falsy,children:a.falsy,handler:a.func.isRequired},l.defaultProps={handler:s},e.exports=l},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var i=function(e,t,n){for(var r=!0;r;){var o=e,i=t,a=n;r=!1,null===o&&(o=Function.prototype);var s=Object.getOwnPropertyDescriptor(o,i);if(void 0!==s){if(\"value\"in s)return s.value;var u=s.get;if(void 0===u)return;return u.call(a)}var l=Object.getPrototypeOf(o);if(null===l)return;e=l,t=i,n=a,r=!0,s=l=void 0}},a=n(465),s=n(478),u=function(e){function t(){r(this,t),i(Object.getPrototypeOf(t.prototype),\"constructor\",this).apply(this,arguments)}return o(t,e),t}(s);u.propTypes={path:a.string,from:a.string,to:a.string,handler:a.falsy},u.defaultProps={},e.exports=u},function(e,t,n){\"use strict\";function r(e){e===s.PUSH&&(u.length+=1);var t={path:p.getCurrentPath(),type:e};l.forEach(function(e){e.call(p,t)})}function o(){var e=p.getCurrentPath();return\"/\"===e.charAt(0)||(p.replace(\"/\"+e),!1)}function i(){if(o()){var e=a;a=null,r(e||s.POP)}}var a,s=n(483),u=n(484),l=[],c=!1,p={addChangeListener:function(e){l.push(e),o(),c||(window.addEventListener?window.addEventListener(\"hashchange\",i,!1):window.attachEvent(\"onhashchange\",i),c=!0)},removeChangeListener:function(e){l=l.filter(function(t){return t!==e}),0===l.length&&(window.removeEventListener?window.removeEventListener(\"hashchange\",i,!1):window.removeEvent(\"onhashchange\",i),c=!1)},push:function(e){a=s.PUSH,window.location.hash=e},replace:function(e){a=s.REPLACE,window.location.replace(window.location.pathname+window.location.search+\"#\"+e)},pop:function(){a=s.POP,u.back()},getCurrentPath:function(){return decodeURI(window.location.href.split(\"#\")[1]||\"\")},toString:function(){return\"<HashLocation>\"}};e.exports=p},function(e,t){\"use strict\";var n={PUSH:\"push\",REPLACE:\"replace\",POP:\"pop\"};e.exports=n},function(e,t,n){\"use strict\";var r=n(468),o=n(485),i={length:1,back:function(){r(o,\"Cannot use History.back without a DOM\"),i.length-=1,window.history.back()}};e.exports=i},function(e,t){var n=!(\"undefined\"==typeof window||!window.document||!window.document.createElement);e.exports=n},function(e,t,n){\"use strict\";function r(e){var t={path:l.getCurrentPath(),type:e};s.forEach(function(e){e.call(l,t)})}function o(e){void 0!==e.state&&r(i.POP)}var i=n(483),a=n(484),s=[],u=!1,l={addChangeListener:function(e){s.push(e),u||(window.addEventListener?window.addEventListener(\"popstate\",o,!1):window.attachEvent(\"onpopstate\",o),u=!0)},removeChangeListener:function(e){s=s.filter(function(t){return t!==e}),0===s.length&&(window.addEventListener?window.removeEventListener(\"popstate\",o,!1):window.removeEvent(\"onpopstate\",o),u=!1)},push:function(e){window.history.pushState({path:e},\"\",e),a.length+=1,r(i.PUSH)},replace:function(e){window.history.replaceState({path:e},\"\",e),r(i.REPLACE)},pop:a.back,getCurrentPath:function(){return decodeURI(window.location.pathname+window.location.search)},toString:function(){return\"<HistoryLocation>\"}};e.exports=l},function(e,t,n){\"use strict\";var r=n(486),o=n(484),i={push:function(e){window.location=e},replace:function(e){window.location.replace(e)},pop:o.back,getCurrentPath:r.getCurrentPath,toString:function(){return\"<RefreshLocation>\"}};e.exports=i},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(){a(!1,\"You cannot modify a static location\")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(468),s=function(){function e(t){r(this,e),this.path=t}return i(e,[{key:\"getCurrentPath\",value:function(){return this.path}},{key:\"toString\",value:function(){return'<StaticLocation path=\"'+this.path+'\">'}}]),e}();s.prototype.push=o,s.prototype.replace=o,s.prototype.pop=o,e.exports=s},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}var o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(468),a=n(483),s=n(484),u=function(){function e(t){r(this,e),this.history=t||[],this.listeners=[],this.needsDOM=!1,this._updateHistoryLength()}return o(e,[{key:\"_updateHistoryLength\",value:function(){s.length=this.history.length}},{key:\"_notifyChange\",value:function(e){for(var t={path:this.getCurrentPath(),type:e},n=0,r=this.listeners.length;n<r;++n)this.listeners[n].call(this,t)}},{key:\"addChangeListener\",value:function(e){this.listeners.push(e)}},{key:\"removeChangeListener\",value:function(e){this.listeners=this.listeners.filter(function(t){return t!==e})}},{key:\"push\",value:function(e){this.history.push(e),this._updateHistoryLength(),this._notifyChange(a.PUSH)}},{key:\"replace\",value:function(e){i(this.history.length,\"You cannot replace the current path with no history\"),this.history[this.history.length-1]=e,this._notifyChange(a.REPLACE)}},{key:\"pop\",value:function(){this.history.pop(),this._updateHistoryLength(),this._notifyChange(a.POP)}},{key:\"getCurrentPath\",value:function(){return this.history[this.history.length-1]}},{key:\"toString\",value:function(){return\"<TestLocation>\"}}]),e}();e.exports=u},function(e,t,n){\"use strict\";var r=n(483),o={updateScrollPosition:function(e,t){switch(t){case r.PUSH:case r.REPLACE:window.scrollTo(0,0);break;case r.POP:e?window.scrollTo(e.x,e.y):window.scrollTo(0,0)}}};e.exports=o},function(e,t){\"use strict\";var n={updateScrollPosition:function(){window.scrollTo(0,0)}};e.exports=n},function(e,t,n){\"use strict\";var r=n(465),o={contextTypes:{router:r.router.isRequired},makePath:function(e,t,n){return this.context.router.makePath(e,t,n)},makeHref:function(e,t,n){return this.context.router.makeHref(e,t,n)},transitionTo:function(e,t,n){this.context.router.transitionTo(e,t,n)},replaceWith:function(e,t,n){this.context.router.replaceWith(e,t,n)},goBack:function(){return this.context.router.goBack()}};e.exports=o},function(e,t,n){\"use strict\";var r=n(465),o={contextTypes:{router:r.router.isRequired},getPath:function(){return this.context.router.getCurrentPath()},getPathname:function(){return this.context.router.getCurrentPathname()},getParams:function(){return this.context.router.getCurrentParams()},getQuery:function(){return this.context.router.getCurrentQuery()},getRoutes:function(){return this.context.router.getCurrentRoutes()},isActive:function(e,t,n){return this.context.router.isActive(e,t,n)}};e.exports=o},function(e,t,n){\"use strict\";function r(e,t,n){e=e||\"UnknownComponent\";for(var r in t)if(t.hasOwnProperty(r)){var o=t[r](n,r,e);o instanceof Error&&l(!1,o.message)}}function o(e){var t=u({},e),n=t.handler;return n&&(t.onEnter=n.willTransitionTo,t.onLeave=n.willTransitionFrom),t}function i(e){if(s.isValidElement(e)){var t=e.type,n=u({},t.defaultProps,e.props);return t.propTypes&&r(t.displayName,t.propTypes,n),t===c?d.createDefaultRoute(o(n)):t===p?d.createNotFoundRoute(o(n)):t===f?d.createRedirect(o(n)):d.createRoute(o(n),function(){n.children&&a(n.children)})}}function a(e){var t=[];return s.Children.forEach(e,function(e){(e=i(e))&&t.push(e)}),t}var s=n(4),u=n(466),l=n(469),c=n(464),p=n(480),f=n(481),d=n(467);e.exports=a},function(e,t,n){(function(t){\"use strict\";function r(e,t){for(var n in t)if(t.hasOwnProperty(n)&&e[n]!==t[n])return!1;return!0}function o(e,t,n,o,i,a){return e.some(function(e){if(e!==t)return!1;for(var s,u=t.paramNames,l=0,c=u.length;l<c;++l)if(s=u[l],o[s]!==n[s])return!1;return r(i,a)&&r(a,i)})}function i(e,t){for(var n,r=0,o=e.length;r<o;++r)n=e[r],n.name&&(f(null==t[n.name],'You may not have more than one route named \"%s\"',n.name),t[n.name]=n),n.childRoutes&&i(n.childRoutes,t)}function a(e,t){return e.some(function(e){return e.name===t})}function s(e,t){for(var n in t)if(String(e[n])!==String(t[n]))return!1;return!0}function u(e,t){for(var n in t)if(String(e[n])!==String(t[n]))return!1;return!0}function l(e){e=e||{},O(e)&&(e={routes:e});var n=[],r=e.location||k,l=e.scrollBehavior||I,v={},R={},A=null,j=null;\"string\"==typeof r&&(r=new b(r)),\nr instanceof b?p(!d||\"test\"===t.env.NODE_ENV,\"You should not use a static location in a DOM environment because the router will not be kept in sync with the current URL\"):f(d||r.needsDOM===!1,\"You cannot use %s without a DOM\",r),r!==y||M()||(r=g);var L=c.createClass({displayName:\"Router\",statics:{isRunning:!1,cancelPendingTransition:function(){A&&(A.cancel(),A=null)},clearAllRoutes:function(){L.cancelPendingTransition(),L.namedRoutes={},L.routes=[]},addRoutes:function(e){O(e)&&(e=_(e)),i(e,L.namedRoutes),L.routes.push.apply(L.routes,e)},replaceRoutes:function(e){L.clearAllRoutes(),L.addRoutes(e),L.refresh()},match:function(e){return T.findMatch(L.routes,e)},makePath:function(e,t,n){var r;if(S.isAbsolute(e))r=e;else{var o=e instanceof D?e:L.namedRoutes[e];f(o instanceof D,'Cannot find a route named \"%s\"',e),r=o.path}return S.withQuery(S.injectParams(r,t),n)},makeHref:function(e,t,n){var o=L.makePath(e,t,n);return r===m?\"#\"+o:o},transitionTo:function(e,t,n){var o=L.makePath(e,t,n);A?r.replace(o):r.push(o)},replaceWith:function(e,t,n){r.replace(L.makePath(e,t,n))},goBack:function(){return P.length>1||r===g?(r.pop(),!0):(p(!1,\"goBack() was ignored because there is no router history\"),!1)},handleAbort:e.onAbort||function(e){if(r instanceof b)throw new Error(\"Unhandled aborted transition! Reason: \"+e);e instanceof x||(e instanceof C?r.replace(L.makePath(e.to,e.params,e.query)):r.pop())},handleError:e.onError||function(e){throw e},handleLocationChange:function(e){L.dispatch(e.path,e.type)},dispatch:function(e,t){L.cancelPendingTransition();var r=v.path,i=null==t;if(r!==e||i){r&&t===h.PUSH&&L.recordScrollPosition(r);var a=L.match(e);p(null!=a,'No route matches path \"%s\". Make sure you have <Route path=\"%s\"> somewhere in your routes',e,e),null==a&&(a={});var s,u,l=v.routes||[],c=v.params||{},f=v.query||{},d=a.routes||[],m=a.params||{},y=a.query||{};l.length?(s=l.filter(function(e){return!o(d,e,c,m,f,y)}),u=d.filter(function(e){return!o(l,e,c,m,f,y)})):(s=[],u=d);var g=new N(e,L.replaceWith.bind(L,e));A=g;var b=n.slice(l.length-s.length);N.from(g,s,b,function(n){return n||g.abortReason?j.call(L,n,g):void N.to(g,u,m,y,function(n){j.call(L,n,g,{path:e,action:t,pathname:a.pathname,routes:d,params:m,query:y})})})}},run:function(e){f(!L.isRunning,\"Router is already running\"),j=function(t,n,r){t&&L.handleError(t),A===n&&(A=null,n.abortReason?L.handleAbort(n.abortReason):e.call(L,L,R=r))},r instanceof b||(r.addChangeListener&&r.addChangeListener(L.handleLocationChange),L.isRunning=!0),L.refresh()},refresh:function(){L.dispatch(r.getCurrentPath(),null)},stop:function(){L.cancelPendingTransition(),r.removeChangeListener&&r.removeChangeListener(L.handleLocationChange),L.isRunning=!1},getLocation:function(){return r},getScrollBehavior:function(){return l},getRouteAtDepth:function(e){var t=v.routes;return t&&t[e]},setRouteComponentAtDepth:function(e,t){n[e]=t},getCurrentPath:function(){return v.path},getCurrentPathname:function(){return v.pathname},getCurrentParams:function(){return v.params},getCurrentQuery:function(){return v.query},getCurrentRoutes:function(){return v.routes},isActive:function(e,t,n){return S.isAbsolute(e)?e===v.path:a(v.routes,e)&&s(v.params,t)&&(null==n||u(v.query,n))}},mixins:[E],propTypes:{children:w.falsy},childContextTypes:{routeDepth:w.number.isRequired,router:w.router.isRequired},getChildContext:function(){return{routeDepth:1,router:L}},getInitialState:function(){return v=R},componentWillReceiveProps:function(){this.setState(v=R)},componentWillUnmount:function(){L.stop()},render:function(){var e=L.getRouteAtDepth(0);return e?c.createElement(e.handler,this.props):null}});return L.clearAllRoutes(),e.routes&&L.addRoutes(e.routes),L}var c=n(4),p=n(469),f=n(468),d=n(485),h=n(483),v=n(490),m=n(482),y=n(486),g=n(487),b=n(488),E=n(496),_=n(494),O=n(498),N=n(499),w=n(465),C=n(501),P=n(484),x=n(500),T=n(502),D=n(467),M=n(503),S=n(470),k=d?m:\"/\",I=d?v:null;e.exports=l}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e,t){if(!t)return!0;if(e.pathname===t.pathname)return!1;var n=e.routes,r=t.routes,o=n.filter(function(e){return r.indexOf(e)!==-1});return!o.some(function(e){return e.ignoreScrollBehavior})}var o=n(468),i=n(485),a=n(497),s={statics:{recordScrollPosition:function(e){this.scrollHistory||(this.scrollHistory={}),this.scrollHistory[e]=a()},getScrollPosition:function(e){return this.scrollHistory||(this.scrollHistory={}),this.scrollHistory[e]||null}},componentWillMount:function(){o(null==this.constructor.getScrollBehavior()||i,\"Cannot use scroll behavior without a DOM\")},componentDidMount:function(){this._updateScroll()},componentDidUpdate:function(e,t){this._updateScroll(t)},_updateScroll:function(e){if(r(this.state,e)){var t=this.constructor.getScrollBehavior();t&&t.updateScrollPosition(this.constructor.getScrollPosition(this.state.path),this.state.action)}}};e.exports=s},function(e,t,n){\"use strict\";function r(){return o(i,\"Cannot get current scroll position without a DOM\"),{x:window.pageXOffset||document.documentElement.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop}}var o=n(468),i=n(485);e.exports=r},function(e,t,n){\"use strict\";function r(e){return null==e||i.isValidElement(e)}function o(e){return r(e)||Array.isArray(e)&&e.every(r)}var i=n(4);e.exports=o},function(e,t,n){\"use strict\";function r(e,t){this.path=e,this.abortReason=null,this.retry=t.bind(this)}var o=n(500),i=n(501);r.prototype.abort=function(e){null==this.abortReason&&(this.abortReason=e||\"ABORT\")},r.prototype.redirect=function(e,t,n){this.abort(new i(e,t,n))},r.prototype.cancel=function(){this.abort(new o)},r.from=function(e,t,n,r){t.reduce(function(t,r,o){return function(i){if(i||e.abortReason)t(i);else if(r.onLeave)try{r.onLeave(e,n[o],t),r.onLeave.length<3&&t()}catch(e){t(e)}else t()}},r)()},r.to=function(e,t,n,r,o){t.reduceRight(function(t,o){return function(i){if(i||e.abortReason)t(i);else if(o.onEnter)try{o.onEnter(e,n,r,t),o.onEnter.length<4&&t()}catch(e){t(e)}else t()}},o)()},e.exports=r},function(e,t){\"use strict\";function n(){}e.exports=n},function(e,t){\"use strict\";function n(e,t,n){this.to=e,this.params=t,this.query=n}e.exports=n},function(e,t,n){\"use strict\";function r(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function o(e,t,n){var r=e.childRoutes;if(r)for(var i,u,l=0,c=r.length;l<c;++l)if(u=r[l],!u.isDefault&&!u.isNotFound&&(i=o(u,t,n)))return i.routes.unshift(e),i;var p=e.defaultRoute;if(p&&(d=a.extractParams(p.path,t)))return new s(t,d,n,[e,p]);var f=e.notFoundRoute;if(f&&(d=a.extractParams(f.path,t)))return new s(t,d,n,[e,f]);var d=a.extractParams(e.path,t);return d?new s(t,d,n,[e]):null}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=n(470),s=function(){function e(t,n,o,i){r(this,e),this.pathname=t,this.params=n,this.query=o,this.routes=i}return i(e,null,[{key:\"findMatch\",value:function(e,t){for(var n=a.withoutQuery(t),r=a.extractQuery(t),i=null,s=0,u=e.length;null==i&&s<u;++s)i=o(e[s],n,r);return i}}]),e}();e.exports=s},function(e,t){\"use strict\";function n(){/*! taken from modernizr\n\t   * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n\t   * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n\t   * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586\n\t   */\nvar e=navigator.userAgent;return(e.indexOf(\"Android 2.\")===-1&&e.indexOf(\"Android 4.0\")===-1||e.indexOf(\"Mobile Safari\")===-1||e.indexOf(\"Chrome\")!==-1||e.indexOf(\"Windows Phone\")!==-1)&&(window.history&&\"pushState\"in window.history)}e.exports=n},function(e,t,n){\"use strict\";function r(e,t,n){\"function\"==typeof t&&(n=t,t=null);var r=o({routes:e,location:t});return r.run(n),r}var o=n(495);e.exports=r},,,,,,,function(e,t,n){e.exports=n(512)},function(e,t,n){(function(t){\"use strict\";var r=n(513),o=n(5),i=n(516),a=n(517),s=n(13),u=n(518),l=n(29),c=n(526),p=n(520),f=n(527);o.addons={CSSTransitionGroup:a,LinkedStateMixin:r,PureRenderMixin:i,TransitionGroup:u,batchedUpdates:l.batchedUpdates,classSet:c,cloneWithProps:p,createFragment:s.create,update:f},\"production\"!==t.env.NODE_ENV&&(o.addons.Perf=n(153),o.addons.TestUtils=n(528)),e.exports=o}).call(t,n(6))},function(e,t,n){\"use strict\";var r=n(514),o=n(515),i={linkState:function(e){return new r(this.state[e],o.createStateKeySetter(this,e))}};e.exports=i},function(e,t,n){\"use strict\";function r(e,t){this.value=e,this.requestChange=t}function o(e){var t={value:\"undefined\"==typeof e?i.PropTypes.any.isRequired:e.isRequired,requestChange:i.PropTypes.func.isRequired};return i.PropTypes.shape(t)}var i=n(5);r.PropTypes={link:o},e.exports=r},function(e,t){\"use strict\";function n(e,t){var n={};return function(r){n[t]=r,e.setState(n)}}var r={createStateSetter:function(e,t){return function(n,r,o,i,a,s){var u=t.call(e,n,r,o,i,a,s);u&&e.setState(u)}},createStateKeySetter:function(e,t){var r=e.__keySetters||(e.__keySetters={});return r[t]||(r[t]=n(e,t))}};r.Mixin={createStateSetter:function(e){return r.createStateSetter(this,e)},createStateKeySetter:function(e){return r.createStateKeySetter(this,e)}},e.exports=r},function(e,t,n){\"use strict\";var r=n(140),o={shouldComponentUpdate:function(e,t){return!r(this.props,e)||!r(this.state,t)}};e.exports=o},function(e,t,n){\"use strict\";var r=n(5),o=n(16),i=r.createFactory(n(518)),a=r.createFactory(n(523)),s=r.createClass({displayName:\"ReactCSSTransitionGroup\",propTypes:{transitionName:r.PropTypes.string.isRequired,transitionAppear:r.PropTypes.bool,transitionEnter:r.PropTypes.bool,transitionLeave:r.PropTypes.bool},getDefaultProps:function(){return{transitionAppear:!1,transitionEnter:!0,transitionLeave:!0}},_wrapChild:function(e){return a({name:this.props.transitionName,appear:this.props.transitionAppear,enter:this.props.transitionEnter,leave:this.props.transitionLeave},e)},render:function(){return i(o({},this.props,{childFactory:this._wrapChild}))}});e.exports=s},function(e,t,n){\"use strict\";var r=n(5),o=n(519),i=n(16),a=n(520),s=n(19),u=r.createClass({displayName:\"ReactTransitionGroup\",propTypes:{component:r.PropTypes.any,childFactory:r.PropTypes.func},getDefaultProps:function(){return{component:\"span\",childFactory:s.thatReturnsArgument}},getInitialState:function(){return{children:o.getChildMapping(this.props.children)}},componentWillMount:function(){this.currentlyTransitioningKeys={},this.keysToEnter=[],this.keysToLeave=[]},componentDidMount:function(){var e=this.state.children;for(var t in e)e[t]&&this.performAppear(t)},componentWillReceiveProps:function(e){var t=o.getChildMapping(e.children),n=this.state.children;this.setState({children:o.mergeChildMappings(n,t)});var r;for(r in t){var i=n&&n.hasOwnProperty(r);!t[r]||i||this.currentlyTransitioningKeys[r]||this.keysToEnter.push(r)}for(r in n){var a=t&&t.hasOwnProperty(r);!n[r]||a||this.currentlyTransitioningKeys[r]||this.keysToLeave.push(r)}},componentDidUpdate:function(){var e=this.keysToEnter;this.keysToEnter=[],e.forEach(this.performEnter);var t=this.keysToLeave;this.keysToLeave=[],t.forEach(this.performLeave)},performAppear:function(e){this.currentlyTransitioningKeys[e]=!0;var t=this.refs[e];t.componentWillAppear?t.componentWillAppear(this._handleDoneAppearing.bind(this,e)):this._handleDoneAppearing(e)},_handleDoneAppearing:function(e){var t=this.refs[e];t.componentDidAppear&&t.componentDidAppear(),delete this.currentlyTransitioningKeys[e];var n=o.getChildMapping(this.props.children);n&&n.hasOwnProperty(e)||this.performLeave(e)},performEnter:function(e){this.currentlyTransitioningKeys[e]=!0;var t=this.refs[e];t.componentWillEnter?t.componentWillEnter(this._handleDoneEntering.bind(this,e)):this._handleDoneEntering(e)},_handleDoneEntering:function(e){var t=this.refs[e];t.componentDidEnter&&t.componentDidEnter(),delete this.currentlyTransitioningKeys[e];var n=o.getChildMapping(this.props.children);n&&n.hasOwnProperty(e)||this.performLeave(e)},performLeave:function(e){this.currentlyTransitioningKeys[e]=!0;var t=this.refs[e];t.componentWillLeave?t.componentWillLeave(this._handleDoneLeaving.bind(this,e)):this._handleDoneLeaving(e)},_handleDoneLeaving:function(e){var t=this.refs[e];t.componentDidLeave&&t.componentDidLeave(),delete this.currentlyTransitioningKeys[e];var n=o.getChildMapping(this.props.children);if(n&&n.hasOwnProperty(e))this.performEnter(e);else{var r=i({},this.state.children);delete r[e],this.setState({children:r})}},render:function(){var e=[];for(var t in this.state.children){var n=this.state.children[t];n&&e.push(a(this.props.childFactory(n),{ref:t,key:t}))}return r.createElement(this.props.component,this.props,e)}});e.exports=u},function(e,t,n){\"use strict\";var r=n(11),o=n(13),i={getChildMapping:function(e){return e?o.extract(r.map(e,function(e){return e})):e},mergeChildMappings:function(e,t){function n(n){return t.hasOwnProperty(n)?t[n]:e[n]}e=e||{},t=t||{};var r={},o=[];for(var i in e)t.hasOwnProperty(i)?o.length&&(r[i]=o,o=[]):o.push(i);var a,s={};for(var u in t){if(r.hasOwnProperty(u))for(a=0;a<r[u].length;a++){var l=r[u][a];s[r[u][a]]=n(l)}s[u]=n(u)}for(a=0;a<o.length;a++)s[o[a]]=n(o[a]);return s}};e.exports=i},function(e,t,n){(function(t){\"use strict\";function r(e,n){\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?s(!e.ref,\"You are calling cloneWithProps() on a child with a ref. This is dangerous because you're creating a new child which will not be added as a ref to its parent.\"):null);var r=i.mergeProps(n,e.props);return!r.hasOwnProperty(u)&&e.props.hasOwnProperty(u)&&(r.children=e.props.children),o.createElement(e.type,r)}var o=n(14),i=n(521),a=n(42),s=n(18),u=a({children:null});e.exports=r}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){return function(t,n,r){t.hasOwnProperty(n)?t[n]=e(t[n],r):t[n]=r}}function o(e,t){for(var n in t)if(t.hasOwnProperty(n)){var r=l[n];r&&l.hasOwnProperty(n)?r(e,n,t[n]):e.hasOwnProperty(n)||(e[n]=t[n])}return e}var i=n(16),a=n(19),s=n(522),u=r(function(e,t){return i({},t,e)}),l={children:a,className:r(s),style:u},c={mergeProps:function(e,t){return o(i({},e),t)}};e.exports=c},function(e,t){\"use strict\";function n(e){e||(e=\"\");var t,n=arguments.length;if(n>1)for(var r=1;r<n;r++)t=arguments[r],t&&(e=(e?e+\" \":\"\")+t);return e}e.exports=n},function(e,t,n){(function(t){\"use strict\";var r=n(5),o=n(524),i=n(525),a=n(159),s=n(18),u=17,l=5e3,c=null;\"production\"!==t.env.NODE_ENV&&(c=function(){\"production\"!==t.env.NODE_ENV?s(!1,\"transition(): tried to perform an animation without an animationend or transitionend event after timeout (%sms). You should either disable this transition in JS or add a CSS animation/transition.\",l):null});var p=r.createClass({displayName:\"ReactCSSTransitionGroupChild\",transition:function(e,n){var r=this.getDOMNode(),a=this.props.name+\"-\"+e,s=a+\"-active\",u=null,p=function(e){e&&e.target!==r||(\"production\"!==t.env.NODE_ENV&&clearTimeout(u),o.removeClass(r,a),o.removeClass(r,s),i.removeEndEventListener(r,p),n&&n())};i.addEndEventListener(r,p),o.addClass(r,a),this.queueClass(s),\"production\"!==t.env.NODE_ENV&&(u=setTimeout(c,l))},queueClass:function(e){this.classNameQueue.push(e),this.timeout||(this.timeout=setTimeout(this.flushClassNameQueue,u))},flushClassNameQueue:function(){this.isMounted()&&this.classNameQueue.forEach(o.addClass.bind(o,this.getDOMNode())),this.classNameQueue.length=0,this.timeout=null},componentWillMount:function(){this.classNameQueue=[]},componentWillUnmount:function(){this.timeout&&clearTimeout(this.timeout)},componentWillAppear:function(e){this.props.appear?this.transition(\"appear\",e):e()},componentWillEnter:function(e){this.props.enter?this.transition(\"enter\",e):e()},componentWillLeave:function(e){this.props.leave?this.transition(\"leave\",e):e()},render:function(){return a(this.props.children)}});e.exports=p}).call(t,n(6))},function(e,t,n){(function(t){var r=n(10),o={addClass:function(e,n){return\"production\"!==t.env.NODE_ENV?r(!/\\s/.test(n),'CSSCore.addClass takes only a single class name. \"%s\" contains multiple classes.',n):r(!/\\s/.test(n)),n&&(e.classList?e.classList.add(n):o.hasClass(e,n)||(e.className=e.className+\" \"+n)),e},removeClass:function(e,n){return\"production\"!==t.env.NODE_ENV?r(!/\\s/.test(n),'CSSCore.removeClass takes only a single class name. \"%s\" contains multiple classes.',n):r(!/\\s/.test(n)),n&&(e.classList?e.classList.remove(n):o.hasClass(e,n)&&(e.className=e.className.replace(new RegExp(\"(^|\\\\s)\"+n+\"(?:\\\\s|$)\",\"g\"),\"$1\").replace(/\\s+/g,\" \").replace(/^\\s*|\\s*$/g,\"\"))),e},conditionClass:function(e,t,n){return(n?o.addClass:o.removeClass)(e,t)},hasClass:function(e,n){return\"production\"!==t.env.NODE_ENV?r(!/\\s/.test(n),\"CSS.hasClass takes only a single class name.\"):r(!/\\s/.test(n)),e.classList?!!n&&e.classList.contains(n):(\" \"+e.className+\" \").indexOf(\" \"+n+\" \")>-1}};e.exports=o}).call(t,n(6))},function(e,t,n){\"use strict\";function r(){var e=document.createElement(\"div\"),t=e.style;\"AnimationEvent\"in window||delete s.animationend.animation,\"TransitionEvent\"in window||delete s.transitionend.transition;for(var n in s){var r=s[n];for(var o in r)if(o in t){u.push(r[o]);break}}}function o(e,t,n){e.addEventListener(t,n,!1)}function i(e,t,n){e.removeEventListener(t,n,!1)}var a=n(54),s={transitionend:{transition:\"transitionend\",WebkitTransition:\"webkitTransitionEnd\",MozTransition:\"mozTransitionEnd\",OTransition:\"oTransitionEnd\",msTransition:\"MSTransitionEnd\"},animationend:{animation:\"animationend\",WebkitAnimation:\"webkitAnimationEnd\",MozAnimation:\"mozAnimationEnd\",OAnimation:\"oAnimationEnd\",msAnimation:\"MSAnimationEnd\"}},u=[];a.canUseDOM&&r();var l={addEndEventListener:function(e,t){return 0===u.length?void window.setTimeout(t,0):void u.forEach(function(n){o(e,n,t)})},removeEndEventListener:function(e,t){0!==u.length&&u.forEach(function(n){i(e,n,t)})}};e.exports=l},function(e,t,n){(function(t){\"use strict\";function r(e){return\"production\"!==t.env.NODE_ENV&&(\"production\"!==t.env.NODE_ENV?o(i,\"React.addons.classSet will be deprecated in a future version. See http://fb.me/react-addons-classset\"):null,i=!0),\"object\"==typeof e?Object.keys(e).filter(function(t){return e[t]}).join(\" \"):Array.prototype.join.call(arguments,\" \")}var o=n(18),i=!1;e.exports=r}).call(t,n(6))},function(e,t,n){(function(t){\"use strict\";function r(e){return Array.isArray(e)?e.concat():e&&\"object\"==typeof e?a(new e.constructor,e):e}function o(e,n,r){\"production\"!==t.env.NODE_ENV?u(Array.isArray(e),\"update(): expected target of %s to be an array; got %s.\",r,e):u(Array.isArray(e));var o=n[r];\"production\"!==t.env.NODE_ENV?u(Array.isArray(o),\"update(): expected spec of %s to be an array; got %s. Did you forget to wrap your parameter in an array?\",r,o):u(Array.isArray(o))}function i(e,n){if(\"production\"!==t.env.NODE_ENV?u(\"object\"==typeof n,\"update(): You provided a key path to update() that did not contain one of %s. Did you forget to include {%s: ...}?\",m.join(\", \"),d):u(\"object\"==typeof n),l.call(n,d))return\"production\"!==t.env.NODE_ENV?u(1===Object.keys(n).length,\"Cannot have more than one key in an object with %s\",d):u(1===Object.keys(n).length),n[d];var s=r(e);if(l.call(n,h)){var g=n[h];\"production\"!==t.env.NODE_ENV?u(g&&\"object\"==typeof g,\"update(): %s expects a spec of type 'object'; got %s\",h,g):u(g&&\"object\"==typeof g),\"production\"!==t.env.NODE_ENV?u(s&&\"object\"==typeof s,\"update(): %s expects a target of type 'object'; got %s\",h,s):u(s&&\"object\"==typeof s),a(s,n[h])}l.call(n,c)&&(o(e,n,c),n[c].forEach(function(e){s.push(e)})),l.call(n,p)&&(o(e,n,p),n[p].forEach(function(e){s.unshift(e)})),l.call(n,f)&&(\"production\"!==t.env.NODE_ENV?u(Array.isArray(e),\"Expected %s target to be an array; got %s\",f,e):u(Array.isArray(e)),\"production\"!==t.env.NODE_ENV?u(Array.isArray(n[f]),\"update(): expected spec of %s to be an array of arrays; got %s. Did you forget to wrap your parameters in an array?\",f,n[f]):u(Array.isArray(n[f])),n[f].forEach(function(e){\"production\"!==t.env.NODE_ENV?u(Array.isArray(e),\"update(): expected spec of %s to be an array of arrays; got %s. Did you forget to wrap your parameters in an array?\",f,n[f]):u(Array.isArray(e)),s.splice.apply(s,e)})),l.call(n,v)&&(\"production\"!==t.env.NODE_ENV?u(\"function\"==typeof n[v],\"update(): expected spec of %s to be a function; got %s.\",v,n[v]):u(\"function\"==typeof n[v]),s=n[v](s));for(var b in n)y.hasOwnProperty(b)&&y[b]||(s[b]=i(e[b],n[b]));return s}var a=n(16),s=n(42),u=n(10),l={}.hasOwnProperty,c=s({$push:null}),p=s({$unshift:null}),f=s({$splice:null}),d=s({$set:null}),h=s({$merge:null}),v=s({$apply:null}),m=[c,p,f,d,h,v],y={};m.forEach(function(e){y[e]=!0}),e.exports=i}).call(t,n(6))},function(e,t,n){\"use strict\";function r(e){}function o(e){return function(t,n){var o;N.isDOMComponent(t)?o=t.getDOMNode():t.tagName&&(o=t);var i=new r;i.target=o;var a=new b(d.eventNameDispatchConfigs[e],y.getID(o),i);E(a,n),l.accumulateTwoPhaseDispatches(a),g.batchedUpdates(function(){u.enqueueEvents(a),u.processEventQueue()})}}function i(){N.Simulate={};var e;for(e in d.eventNameDispatchConfigs)N.Simulate[e]=o(e)}function a(e){return function(t,n){var o=new r(e);E(o,n),N.isDOMComponent(t)?N.simulateNativeEventOnDOMComponent(e,t,o):t.tagName&&N.simulateNativeEventOnNode(e,t,o)}}var s=n(8),u=n(72),l=n(96),c=n(5),p=n(14),f=n(79),d=n(71),h=n(87),v=n(22),m=n(28),y=n(70),g=n(29),b=n(100),E=n(16),_=n(17),O=s.topLevelTypes,N={renderIntoDocument:function(e){var t=document.createElement(\"div\");return c.render(e,t)},isElement:function(e){return p.isValidElement(e)},isElementOfType:function(e,t){return p.isValidElement(e)&&e.type===t},isDOMComponent:function(e){return!!(e&&e.tagName&&e.getDOMNode)},isDOMComponentElement:function(e){return!!(e&&p.isValidElement(e)&&e.tagName)},isCompositeComponent:function(e){return\"function\"==typeof e.render&&\"function\"==typeof e.setState},isCompositeComponentWithType:function(e,t){return!(!N.isCompositeComponent(e)||e.constructor!==t)},isCompositeComponentElement:function(e){if(!p.isValidElement(e))return!1;var t=e.type.prototype;return\"function\"==typeof t.render&&\"function\"==typeof t.setState},isCompositeComponentElementWithType:function(e,t){return!(!N.isCompositeComponentElement(e)||e.constructor!==t)},getRenderedChildOfCompositeComponent:function(e){if(!N.isCompositeComponent(e))return null;var t=m.get(e);return t._renderedComponent.getPublicInstance()},findAllInRenderedTree:function(e,t){if(!e)return[];var n=t(e)?[e]:[];if(N.isDOMComponent(e)){var r,o=m.get(e),i=o._renderedComponent._renderedChildren;for(r in i)i.hasOwnProperty(r)&&i[r].getPublicInstance&&(n=n.concat(N.findAllInRenderedTree(i[r].getPublicInstance(),t)))}else N.isCompositeComponent(e)&&(n=n.concat(N.findAllInRenderedTree(N.getRenderedChildOfCompositeComponent(e),t)));return n},scryRenderedDOMComponentsWithClass:function(e,t){return N.findAllInRenderedTree(e,function(e){var n=e.props.className;return N.isDOMComponent(e)&&n&&(\" \"+n+\" \").indexOf(\" \"+t+\" \")!==-1})},findRenderedDOMComponentWithClass:function(e,t){var n=N.scryRenderedDOMComponentsWithClass(e,t);if(1!==n.length)throw new Error(\"Did not find exactly one match (found: \"+n.length+\") for class:\"+t);return n[0]},scryRenderedDOMComponentsWithTag:function(e,t){return N.findAllInRenderedTree(e,function(e){return N.isDOMComponent(e)&&e.tagName===t.toUpperCase()})},findRenderedDOMComponentWithTag:function(e,t){var n=N.scryRenderedDOMComponentsWithTag(e,t);if(1!==n.length)throw new Error(\"Did not find exactly one match for tag:\"+t);return n[0]},scryRenderedComponentsWithType:function(e,t){return N.findAllInRenderedTree(e,function(e){return N.isCompositeComponentWithType(e,t)})},findRenderedComponentWithType:function(e,t){var n=N.scryRenderedComponentsWithType(e,t);if(1!==n.length)throw new Error(\"Did not find exactly one match for componentType:\"+t);return n[0]},mockComponent:function(e,t){return t=t||e.mockTagName||\"div\",e.prototype.render.mockImplementation(function(){return c.createElement(t,null,this.props.children)}),this},simulateNativeEventOnNode:function(e,t,n){n.target=t,d.ReactEventListener.dispatchEvent(e,n)},simulateNativeEventOnDOMComponent:function(e,t,n){N.simulateNativeEventOnNode(e,t.getDOMNode(),n)},nativeTouchData:function(e,t){return{touches:[{pageX:e,pageY:t}]}},createRenderer:function(){return new w},Simulate:null,SimulateNative:{}},w=function(){this._instance=null};w.prototype.getRenderOutput=function(){return this._instance&&this._instance._renderedComponent&&this._instance._renderedComponent._renderedOutput||null};var C=function(e){this._renderedOutput=e,this._currentElement=null===e||e===!1?f.emptyElement:e};C.prototype={mountComponent:function(){},receiveComponent:function(e){this._renderedOutput=e,this._currentElement=null===e||e===!1?f.emptyElement:e},unmountComponent:function(){}};var P=function(){};E(P.prototype,h.Mixin,{_instantiateReactComponent:function(e){return new C(e)},_replaceNodeWithMarkupByID:function(){},_renderValidatedComponent:h.Mixin._renderValidatedComponentWithoutOwnerOrContext}),w.prototype.render=function(e,t){t||(t=_);var n=g.ReactReconcileTransaction.getPooled();this._render(e,n,t),g.ReactReconcileTransaction.release(n)},w.prototype.unmount=function(){this._instance&&this._instance.unmountComponent()},w.prototype._render=function(e,t,n){if(this._instance)this._instance.receiveComponent(e,t,n);else{var r=v.createReactRootID(),o=new P(e.type);o.construct(e),o.mountComponent(r,t,n),this._instance=o}};var x=u.injection.injectEventPluginOrder;u.injection.injectEventPluginOrder=function(){x.apply(this,arguments),i()};var T=u.injection.injectEventPluginsByName;u.injection.injectEventPluginsByName=function(){T.apply(this,arguments),i()},i();var D;for(D in O){var M=0===D.indexOf(\"top\")?D.charAt(3).toLowerCase()+D.substr(4):D;N.SimulateNative[M]=a(D)}e.exports=N}]);"
  },
  {
    "path": "server/static/css/base.css",
    "content": "/* 鼠标手势 */\n.cursor-pointer{\n    cursor: pointer;\n}"
  },
  {
    "path": "server/static/css/config-style.css",
    "content": "\n/* 总记录数 */\n.table_operation {\n    min-height: 36px;\n    position: relative;\n}\n\n.table_total {\n    position: absolute;\n    top: 5px;\n    font-size: 16px;\n    color: #77797B;\n    margin-left: 20px;\n}\n\n/* 分页栏 */\n.page {\n    float: right;\n    font-size: 0;\n}\n\n.page span {\n    padding: 4px 10px;\n    display: inline-block;\n    font-size: 14px;\n    border: 1px solid #DDDDDD;\n    border-right: 0;\n    color: #77797B;\n}\n\n.page span.current {\n    color: #000;\n    cursor: pointer;\n    background: #EEEEEE;\n}\n\n.page span:hover {\n    color: #000;\n    cursor: pointer;\n    background: #EEEEEE;\n}"
  },
  {
    "path": "server/static/css/content_script.css",
    "content": ".-sitemap-parent {\n\toutline: 2px #FFCC33 solid !important;\n    background-color: rgba(255, 204, 51, 0.20) !important;\n\tbackground: rgba(255, 204, 51, 0.20) !important;\n}\n\n.-sitemap-parent * {\n    background-color: rgba(255, 204, 51, 0.20) !important;\n\tbackground: rgba(255, 204, 51, 0.20) !important;\n}\n\n.-sitemap-select-item-hover {\n\toutline: 2px solid green !important;\n    background-color: rgba(0, 213, 0, 0.20) !important;\n\tbackground: rgba(0, 213, 0, 0.20) !important;\n}\n\n.-sitemap-select-item-hover * {\n    background-color: rgba(0, 213, 0, 0.20) !important;\n\tbackground: rgba(0, 213, 0, 0.20) !important;\n}\n\n.-sitemap-select-item-selected {\n\toutline: 2px solid #C70000 !important;\n    background-color: rgba(213, 0, 0, 0.2) !important;\n\tbackground: rgba(213, 0, 0, 0.2) !important;\n}\n\n.-sitemap-select-item-selected * {\n    background-color: rgba(213, 0, 0, 0.2) !important;\n\tbackground: rgba(213, 0, 0, 0.2) !important;\n}\n\n#-selector-toolbar {\n\toutline:1px red solid;\n}\n\n/**\n * reset all css values for a div\n * http://jsfiddle.net/Gb89Y/2/\n * after loading css with this script you need to fix width, height\n */\n#-selector-toolbar, #-selector-toolbar div {\n\talign-content: stretch !important;\n\talign-items: stretch !important;\n\talign-self: stretch !important;\n\talignment-baseline: auto !important;\n\tbackground: rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box !important;\n\tbackground-attachment: scroll !important;\n\tbackground-clip: border-box !important;\n\tbackground-color: rgba(0, 0, 0, 0) !important;\n\tbackground-image: none !important;\n\tbackground-origin: padding-box !important;\n\tbackground-position: 0% 0% !important;\n\tbackground-position-x: 0% !important;\n\tbackground-position-y: 0% !important;\n\tbackground-repeat: repeat !important;\n\tbackground-size: auto !important;\n\tbaseline-shift: baseline !important;\n\tborder: 0px none rgb(0, 0, 0) !important;\n\tborder-bottom: 0px none rgb(0, 0, 0) !important;\n\tborder-bottom-color: rgb(0, 0, 0) !important;\n\tborder-bottom-left-radius: 0px !important;\n\tborder-bottom-right-radius: 0px !important;\n\tborder-bottom-style: none !important;\n\tborder-bottom-width: 0px !important;\n\tborder-collapse: separate !important;\n\tborder-color: rgb(0, 0, 0) !important;\n\tborder-image: none !important;\n\tborder-image-outset: 0px !important;\n\tborder-image-repeat: stretch !important;\n\tborder-image-slice: 100% !important;\n\tborder-image-source: none !important;\n\tborder-image-width: 1 !important;\n\tborder-left: 0px none rgb(0, 0, 0) !important;\n\tborder-left-color: rgb(0, 0, 0) !important;\n\tborder-left-style: none !important;\n\tborder-left-width: 0px !important;\n\tborder-radius: 0px !important;\n\tborder-right: 0px none rgb(0, 0, 0) !important;\n\tborder-right-color: rgb(0, 0, 0) !important;\n\tborder-right-style: none !important;\n\tborder-right-width: 0px !important;\n\tborder-spacing: 0px 0px !important;\n\tborder-style: none !important;\n\tborder-top: 0px none rgb(0, 0, 0) !important;\n\tborder-top-color: rgb(0, 0, 0) !important;\n\tborder-top-left-radius: 0px !important;\n\tborder-top-right-radius: 0px !important;\n\tborder-top-style: none !important;\n\tborder-top-width: 0px !important;\n\tborder-width: 0px !important;\n\tbottom: auto !important;\n\tbox-shadow: none !important;\n\tbox-sizing: content-box !important;\n\tbuffered-rendering: auto !important;\n\tcaption-side: top !important;\n\tclear: none !important;\n\tclip: auto !important;\n\tclip-path: none !important;\n\tclip-rule: nonzero !important;\n\tcolor: rgb(0, 0, 0) !important;\n\tcolor-interpolation: srgb !important;\n\tcolor-interpolation-filters: linearrgb !important;\n\tcolor-rendering: auto !important;\n\tcursor: auto !important;\n\tdirection: ltr !important;\n\tdisplay: block !important;\n\tdominant-baseline: auto !important;\n\tempty-cells: show !important;\n\tfill: rgb(0, 0, 0) !important;\n\tfill-opacity: 1 !important;\n\tfill-rule: nonzero !important;\n\tfilter: none !important;\n\tflex: 0 1 auto !important;\n\tflex-basis: auto !important;\n\tflex-direction: row !important;\n\tflex-flow: row nowrap !important;\n\tflex-grow: 0 !important;\n\tflex-shrink: 1 !important;\n\tflex-wrap: nowrap !important;\n\tfloat: none !important;\n\tflood-color: rgb(0, 0, 0) !important;\n\tflood-opacity: 1 !important;\n\tfont: normal normal normal 16px/normal 'Times New Roman' !important;\n\tfont-family: 'Times New Roman' !important;\n\tfont-kerning: auto !important;\n\tfont-size: 16px !important;\n\tfont-style: normal !important;\n\tfont-variant: normal !important;\n\tfont-variant-ligatures: normal !important;\n\tfont-weight: normal !important;\n\tglyph-orientation-horizontal: 0deg !important;\n\tglyph-orientation-vertical: auto !important;\n\theight: auto !important;\n\timage-rendering: auto !important;\n\tjustify-content: flex-start !important;\n\tkerning: 0 !important;\n\tleft: auto !important;\n\tletter-spacing: normal !important;\n\tlighting-color: rgb(255, 255, 255) !important;\n\tline-height: normal !important;\n\tlist-style: disc outside none !important;\n\tlist-style-image: none !important;\n\tlist-style-position: outside !important;\n\tlist-style-type: disc !important;\n\tmargin: 0px !important;\n\tmargin-bottom: 0px !important;\n\tmargin-left: 0px !important;\n\tmargin-right: 0px !important;\n\tmargin-top: 0px !important;\n\tmarker-end: none !important;\n\tmarker-mid: none !important;\n\tmarker-start: none !important;\n\tmask: none !important;\n\tmask-type: luminance !important;\n\tmax-height: none !important;\n\tmax-width: none !important;\n\tmin-height: 0px !important;\n\tmin-width: 0px !important;\n\tobject-fit: fill !important;\n\tobject-position: 50% 50% !important;\n\topacity: 1 !important;\n\torder: 0 !important;\n\torphans: auto !important;\n\toutline: rgb(0, 0, 0) none 0px !important;\n\toutline-color: rgb(0, 0, 0) !important;\n\toutline-offset: 0px !important;\n\toutline-style: none !important;\n\toutline-width: 0px !important;\n\toverflow: visible !important;\n\toverflow-wrap: normal !important;\n\toverflow-x: visible !important;\n\toverflow-y: visible !important;\n\tpadding: 0px !important;\n\tpadding-bottom: 0px !important;\n\tpadding-left: 0px !important;\n\tpadding-right: 0px !important;\n\tpadding-top: 0px !important;\n\tpage-break-after: auto !important;\n\tpage-break-before: auto !important;\n\tpage-break-inside: auto !important;\n\tpointer-events: auto !important;\n\tposition: static !important;\n\tresize: none !important;\n\tright: auto !important;\n\tshape-rendering: auto !important;\n\tspeak: normal !important;\n\tstop-color: rgb(0, 0, 0) !important;\n\tstop-opacity: 1 !important;\n\tstroke: none !important;\n\tstroke-dasharray: none !important;\n\tstroke-dashoffset: 0 !important;\n\tstroke-linecap: butt !important;\n\tstroke-linejoin: miter !important;\n\tstroke-miterlimit: 4 !important;\n\tstroke-opacity: 1 !important;\n\tstroke-width: 1 !important;\n\ttab-size: 8 !important;\n\ttable-layout: auto !important;\n\ttext-align: start !important;\n\ttext-anchor: start !important;\n\ttext-decoration: none solid rgb(0, 0, 0) !important;\n\ttext-indent: 0px !important;\n\ttext-overflow: clip !important;\n\ttext-rendering: auto !important;\n\ttext-shadow: none !important;\n\ttext-transform: none !important;\n\ttop: auto !important;\n\ttransition: all 0s ease 0s !important;\n\ttransition-delay: 0s !important;\n\ttransition-duration: 0s !important;\n\ttransition-property: all !important;\n\ttransition-timing-function: ease !important;\n\tunicode-bidi: normal !important;\n\tvector-effect: none !important;\n\tvertical-align: baseline !important;\n\tvisibility: visible !important;\n\t-webkit-animation: none 0s ease 0s 1 normal none running !important;\n\t-webkit-animation-delay: 0s !important;\n\t-webkit-animation-direction: normal !important;\n\t-webkit-animation-duration: 0s !important;\n\t-webkit-animation-fill-mode: none !important;\n\t-webkit-animation-iteration-count: 1 !important;\n\t-webkit-animation-name: none !important;\n\t-webkit-animation-play-state: running !important;\n\t-webkit-animation-timing-function: ease !important;\n\t-webkit-app-region: no-drag !important;\n\t-webkit-appearance: none !important;\n\t-webkit-aspect-ratio: none !important;\n\t-webkit-backface-visibility: visible !important;\n\t-webkit-background-clip: border-box !important;\n\t-webkit-background-composite: source-over !important;\n\t-webkit-background-origin: padding-box !important;\n\t-webkit-background-size: auto !important;\n\t-webkit-border-after: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-after-color: rgb(0, 0, 0) !important;\n\t-webkit-border-after-style: none !important;\n\t-webkit-border-after-width: 0px !important;\n\t-webkit-border-before: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-before-color: rgb(0, 0, 0) !important;\n\t-webkit-border-before-style: none !important;\n\t-webkit-border-before-width: 0px !important;\n\t-webkit-border-end: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-end-color: rgb(0, 0, 0) !important;\n\t-webkit-border-end-style: none !important;\n\t-webkit-border-end-width: 0px !important;\n\t-webkit-border-fit: border !important;\n\t-webkit-border-horizontal-spacing: 0px !important;\n\t-webkit-border-image: none !important;\n\t-webkit-border-start: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-start-color: rgb(0, 0, 0) !important;\n\t-webkit-border-start-style: none !important;\n\t-webkit-border-start-width: 0px !important;\n\t-webkit-border-vertical-spacing: 0px !important;\n\t-webkit-box-align: stretch !important;\n\t-webkit-box-decoration-break: slice !important;\n\t-webkit-box-direction: normal !important;\n\t-webkit-box-flex: 0 !important;\n\t-webkit-box-flex-group: 1 !important;\n\t-webkit-box-lines: single !important;\n\t-webkit-box-ordinal-group: 1 !important;\n\t-webkit-box-orient: horizontal !important;\n\t-webkit-box-pack: start !important;\n\t-webkit-box-reflect: none !important;\n\t-webkit-box-shadow: none !important;\n\t-webkit-clip-path: none !important;\n\t-webkit-column-axis: auto !important;\n\t-webkit-column-break-after: auto !important;\n\t-webkit-column-break-before: auto !important;\n\t-webkit-column-break-inside: auto !important;\n\t-webkit-column-count: auto !important;\n\t-webkit-column-gap: normal !important;\n\t-webkit-column-progression: normal !important;\n\t-webkit-column-rule: 0px none rgb(0, 0, 0) !important;\n\t-webkit-column-rule-color: rgb(0, 0, 0) !important;\n\t-webkit-column-rule-style: none !important;\n\t-webkit-column-rule-width: 0px !important;\n\t-webkit-column-span: none !important;\n\t-webkit-column-width: auto !important;\n\t-webkit-columns: auto auto !important;\n\t-webkit-filter: none !important;\n\t-webkit-font-feature-settings: normal !important;\n\t-webkit-font-smoothing: auto !important;\n\t-webkit-highlight: none !important;\n\t-webkit-hyphenate-character: auto !important;\n\t-webkit-line-box-contain: block inline replaced !important;\n\t-webkit-line-break: auto !important;\n\t-webkit-line-clamp: none !important;\n\t-webkit-locale: auto !important;\n\t-webkit-logical-height: auto !important;\n\t-webkit-logical-width: auto !important;\n\t-webkit-margin-after: 0px !important;\n\t-webkit-margin-after-collapse: collapse !important;\n\t-webkit-margin-before: 0px !important;\n\t-webkit-margin-before-collapse: collapse !important;\n\t-webkit-margin-bottom-collapse: collapse !important;\n\t-webkit-margin-end: 0px !important;\n\t-webkit-margin-start: 0px !important;\n\t-webkit-margin-top-collapse: collapse !important;\n\t-webkit-mask-box-image: none !important;\n\t-webkit-mask-box-image-outset: 0px !important;\n\t-webkit-mask-box-image-repeat: stretch !important;\n\t-webkit-mask-box-image-slice: 0 fill !important;\n\t-webkit-mask-box-image-source: none !important;\n\t-webkit-mask-box-image-width: auto !important;\n\t-webkit-mask-clip: border-box !important;\n\t-webkit-mask-composite: source-over !important;\n\t-webkit-mask-image: none !important;\n\t-webkit-mask-origin: border-box !important;\n\t-webkit-mask-position: 0% 0% !important;\n\t-webkit-mask-position-x: 0% !important;\n\t-webkit-mask-position-y: 0% !important;\n\t-webkit-mask-repeat: repeat !important;\n\t-webkit-mask-size: auto !important;\n\t-webkit-max-logical-height: none !important;\n\t-webkit-max-logical-width: none !important;\n\t-webkit-min-logical-height: 0px !important;\n\t-webkit-min-logical-width: 0px !important;\n\t-webkit-padding-after: 0px !important;\n\t-webkit-padding-before: 0px !important;\n\t-webkit-padding-end: 0px !important;\n\t-webkit-padding-start: 0px !important;\n\t-webkit-perspective: none !important;\n\t-webkit-perspective-origin: 396px 0px !important;\n\t-webkit-print-color-adjust: economy !important;\n\t-webkit-rtl-ordering: logical !important;\n\t-webkit-ruby-position: before !important;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0.180392) !important;\n\t-webkit-text-combine: none !important;\n\t-webkit-text-decorations-in-effect: none !important;\n\t-webkit-text-emphasis-color: rgb(0, 0, 0) !important;\n\t-webkit-text-emphasis-position: over !important;\n\t-webkit-text-emphasis-style: none !important;\n\t-webkit-text-fill-color: rgb(0, 0, 0) !important;\n\t-webkit-text-orientation: vertical-right !important;\n\t-webkit-text-security: none !important;\n\t-webkit-text-stroke-color: rgb(0, 0, 0) !important;\n\t-webkit-text-stroke-width: 0px !important;\n\t-webkit-transform: none !important;\n\t-webkit-transform-origin: 396px 0px !important;\n\t-webkit-transform-style: flat !important;\n\t-webkit-transition: all 0s ease 0s !important;\n\t-webkit-transition-delay: 0s !important;\n\t-webkit-transition-duration: 0s !important;\n\t-webkit-transition-property: all !important;\n\t-webkit-transition-timing-function: ease !important;\n\t-webkit-user-drag: auto !important;\n\t-webkit-user-modify: read-only !important;\n\t-webkit-user-select: text !important;\n\t-webkit-writing-mode: horizontal-tb !important;\n\twhite-space: normal !important;\n\twidows: auto !important;\n\twidth: auto !important;\n\tword-break: normal !important;\n\tword-spacing: 0px !important;\n\tword-wrap: normal !important;\n\twriting-mode: lr-tb !important;\n\tz-index: auto !important;\n\tzoom: 1 !important;\n}\n\n#-selector-toolbar:after, #-selector-toolbar:before, #-selector-toolbar *:after, #-selector-toolbar *:before {\n\tcontent: \"\";\n\tdisplay: none;\n\tbox-sizing: border-box;\n}\n\n#-selector-toolbar input {\n\talign-content: stretch !important;\n\talign-items: stretch !important;\n\talign-self: stretch !important;\n\talignment-baseline: auto !important;\n\tbackground: rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box !important;\n\tbackground-attachment: scroll !important;\n\tbackground-clip: border-box !important;\n\tbackground-color: rgba(0, 0, 0, 0) !important;\n\tbackground-image: none !important;\n\tbackground-origin: padding-box !important;\n\tbackground-position: 0% 0% !important;\n\tbackground-position-x: 0% !important;\n\tbackground-position-y: 0% !important;\n\tbackground-repeat: repeat !important;\n\tbackground-size: auto !important;\n\tbaseline-shift: baseline !important;\n\tborder: 0px none rgb(0, 0, 0) !important;\n\tborder-bottom: 0px none rgb(0, 0, 0) !important;\n\tborder-bottom-color: rgb(0, 0, 0) !important;\n\tborder-bottom-left-radius: 0px !important;\n\tborder-bottom-right-radius: 0px !important;\n\tborder-bottom-style: none !important;\n\tborder-bottom-width: 0px !important;\n\tborder-collapse: separate !important;\n\tborder-color: rgb(0, 0, 0) !important;\n\tborder-image: none !important;\n\tborder-image-outset: 0px !important;\n\tborder-image-repeat: stretch !important;\n\tborder-image-slice: 100% !important;\n\tborder-image-source: none !important;\n\tborder-image-width: 1 !important;\n\tborder-left: 0px none rgb(0, 0, 0) !important;\n\tborder-left-color: rgb(0, 0, 0) !important;\n\tborder-left-style: none !important;\n\tborder-left-width: 0px !important;\n\tborder-radius: 0px !important;\n\tborder-right: 0px none rgb(0, 0, 0) !important;\n\tborder-right-color: rgb(0, 0, 0) !important;\n\tborder-right-style: none !important;\n\tborder-right-width: 0px !important;\n\tborder-spacing: 0px 0px !important;\n\tborder-style: none !important;\n\tborder-top: 0px none rgb(0, 0, 0) !important;\n\tborder-top-color: rgb(0, 0, 0) !important;\n\tborder-top-left-radius: 0px !important;\n\tborder-top-right-radius: 0px !important;\n\tborder-top-style: none !important;\n\tborder-top-width: 0px !important;\n\tborder-width: 0px !important;\n\tbottom: auto !important;\n\tbox-shadow: none !important;\n\tbox-sizing: border-box !important;\n\tbuffered-rendering: auto !important;\n\tcaption-side: top !important;\n\tclear: none !important;\n\tclip: auto !important;\n\tclip-path: none !important;\n\tclip-rule: nonzero !important;\n\tcolor: rgb(0, 0, 0) !important;\n\tcolor-interpolation: srgb !important;\n\tcolor-interpolation-filters: linearrgb !important;\n\tcolor-rendering: auto !important;\n\tcursor: auto !important;\n\tdirection: ltr !important;\n\tdisplay: inline-block !important;\n\tdominant-baseline: auto !important;\n\tempty-cells: show !important;\n\tfill: rgb(0, 0, 0) !important;\n\tfill-opacity: 1 !important;\n\tfill-rule: nonzero !important;\n\tfilter: none !important;\n\tflex: 0 1 auto !important;\n\tflex-basis: auto !important;\n\tflex-direction: row !important;\n\tflex-flow: row nowrap !important;\n\tflex-grow: 0 !important;\n\tflex-shrink: 1 !important;\n\tflex-wrap: nowrap !important;\n\tfloat: none !important;\n\tflood-color: rgb(0, 0, 0) !important;\n\tflood-opacity: 1 !important;\n\tfont: normal normal normal 13px/normal Arial !important;\n\tfont-family: Arial !important;\n\tfont-kerning: auto !important;\n\tfont-size: 13px !important;\n\tfont-style: normal !important;\n\tfont-variant: normal !important;\n\tfont-variant-ligatures: normal !important;\n\tfont-weight: normal !important;\n\tglyph-orientation-horizontal: 0deg !important;\n\tglyph-orientation-vertical: auto !important;\n\theight: 13px !important;\n\timage-rendering: auto !important;\n\tjustify-content: flex-start !important;\n\tkerning: 0 !important;\n\tleft: auto !important;\n\tletter-spacing: normal !important;\n\tlighting-color: rgb(255, 255, 255) !important;\n\tline-height: normal !important;\n\tlist-style: disc outside none !important;\n\tlist-style-image: none !important;\n\tlist-style-position: outside !important;\n\tlist-style-type: disc !important;\n\tmargin: 3px 3px 3px 4px !important;\n\tmargin-bottom: 3px !important;\n\tmargin-left: 4px !important;\n\tmargin-right: 3px !important;\n\tmargin-top: 3px !important;\n\tmarker-end: none !important;\n\tmarker-mid: none !important;\n\tmarker-start: none !important;\n\tmask: none !important;\n\tmask-type: luminance !important;\n\tmax-height: none !important;\n\tmax-width: none !important;\n\tmin-height: 0px !important;\n\tmin-width: 0px !important;\n\tobject-fit: fill !important;\n\tobject-position: 50% 50% !important;\n\topacity: 1 !important;\n\torder: 0 !important;\n\torphans: auto !important;\n\toutline: rgb(0, 0, 0) none 0px !important;\n\toutline-color: rgb(0, 0, 0) !important;\n\toutline-offset: 0px !important;\n\toutline-style: none !important;\n\toutline-width: 0px !important;\n\toverflow: visible !important;\n\toverflow-wrap: normal !important;\n\toverflow-x: visible !important;\n\toverflow-y: visible !important;\n\tpadding: 0px !important;\n\tpadding-bottom: 0px !important;\n\tpadding-left: 0px !important;\n\tpadding-right: 0px !important;\n\tpadding-top: 0px !important;\n\tpage-break-after: auto !important;\n\tpage-break-before: auto !important;\n\tpage-break-inside: auto !important;\n\tpointer-events: auto !important;\n\tposition: static !important;\n\tresize: none !important;\n\tright: auto !important;\n\tshape-rendering: auto !important;\n\tspeak: normal !important;\n\tstop-color: rgb(0, 0, 0) !important;\n\tstop-opacity: 1 !important;\n\tstroke: none !important;\n\tstroke-dasharray: none !important;\n\tstroke-dashoffset: 0 !important;\n\tstroke-linecap: butt !important;\n\tstroke-linejoin: miter !important;\n\tstroke-miterlimit: 4 !important;\n\tstroke-opacity: 1 !important;\n\tstroke-width: 1 !important;\n\ttab-size: 8 !important;\n\ttable-layout: auto !important;\n\ttext-align: start !important;\n\ttext-anchor: start !important;\n\ttext-decoration: none solid rgb(0, 0, 0) !important;\n\ttext-indent: 0px !important;\n\ttext-overflow: clip !important;\n\ttext-rendering: auto !important;\n\ttext-shadow: none !important;\n\ttext-transform: none !important;\n\ttop: auto !important;\n\ttransition: all 0s ease 0s !important;\n\ttransition-delay: 0s !important;\n\ttransition-duration: 0s !important;\n\ttransition-property: all !important;\n\ttransition-timing-function: ease !important;\n\tunicode-bidi: normal !important;\n\tvector-effect: none !important;\n\tvertical-align: baseline !important;\n\tvisibility: visible !important;\n\t-webkit-animation: none 0s ease 0s 1 normal none running !important;\n\t-webkit-animation-delay: 0s !important;\n\t-webkit-animation-direction: normal !important;\n\t-webkit-animation-duration: 0s !important;\n\t-webkit-animation-fill-mode: none !important;\n\t-webkit-animation-iteration-count: 1 !important;\n\t-webkit-animation-name: none !important;\n\t-webkit-animation-play-state: running !important;\n\t-webkit-animation-timing-function: ease !important;\n\t-webkit-app-region: no-drag !important;\n\t-webkit-appearance: checkbox !important;\n\t-webkit-aspect-ratio: none !important;\n\t-webkit-backface-visibility: visible !important;\n\t-webkit-background-clip: border-box !important;\n\t-webkit-background-composite: source-over !important;\n\t-webkit-background-origin: padding-box !important;\n\t-webkit-background-size: auto !important;\n\t-webkit-border-after: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-after-color: rgb(0, 0, 0) !important;\n\t-webkit-border-after-style: none !important;\n\t-webkit-border-after-width: 0px !important;\n\t-webkit-border-before: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-before-color: rgb(0, 0, 0) !important;\n\t-webkit-border-before-style: none !important;\n\t-webkit-border-before-width: 0px !important;\n\t-webkit-border-end: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-end-color: rgb(0, 0, 0) !important;\n\t-webkit-border-end-style: none !important;\n\t-webkit-border-end-width: 0px !important;\n\t-webkit-border-fit: border !important;\n\t-webkit-border-horizontal-spacing: 0px !important;\n\t-webkit-border-image: none !important;\n\t-webkit-border-start: 0px none rgb(0, 0, 0) !important;\n\t-webkit-border-start-color: rgb(0, 0, 0) !important;\n\t-webkit-border-start-style: none !important;\n\t-webkit-border-start-width: 0px !important;\n\t-webkit-border-vertical-spacing: 0px !important;\n\t-webkit-box-align: stretch !important;\n\t-webkit-box-decoration-break: slice !important;\n\t-webkit-box-direction: normal !important;\n\t-webkit-box-flex: 0 !important;\n\t-webkit-box-flex-group: 1 !important;\n\t-webkit-box-lines: single !important;\n\t-webkit-box-ordinal-group: 1 !important;\n\t-webkit-box-orient: horizontal !important;\n\t-webkit-box-pack: start !important;\n\t-webkit-box-reflect: none !important;\n\t-webkit-box-shadow: none !important;\n\t-webkit-clip-path: none !important;\n\t-webkit-column-axis: auto !important;\n\t-webkit-column-break-after: auto !important;\n\t-webkit-column-break-before: auto !important;\n\t-webkit-column-break-inside: auto !important;\n\t-webkit-column-count: auto !important;\n\t-webkit-column-gap: normal !important;\n\t-webkit-column-progression: normal !important;\n\t-webkit-column-rule: 0px none rgb(0, 0, 0) !important;\n\t-webkit-column-rule-color: rgb(0, 0, 0) !important;\n\t-webkit-column-rule-style: none !important;\n\t-webkit-column-rule-width: 0px !important;\n\t-webkit-column-span: none !important;\n\t-webkit-column-width: auto !important;\n\t-webkit-columns: auto auto !important;\n\t-webkit-filter: none !important;\n\t-webkit-font-feature-settings: normal !important;\n\t-webkit-font-smoothing: auto !important;\n\t-webkit-highlight: none !important;\n\t-webkit-hyphenate-character: auto !important;\n\t-webkit-line-box-contain: block inline replaced !important;\n\t-webkit-line-break: auto !important;\n\t-webkit-line-clamp: none !important;\n\t-webkit-locale: auto !important;\n\t-webkit-logical-height: 13px !important;\n\t-webkit-logical-width: 13px !important;\n\t-webkit-margin-after: 3px !important;\n\t-webkit-margin-after-collapse: collapse !important;\n\t-webkit-margin-before: 3px !important;\n\t-webkit-margin-before-collapse: collapse !important;\n\t-webkit-margin-bottom-collapse: collapse !important;\n\t-webkit-margin-end: 3px !important;\n\t-webkit-margin-start: 4px !important;\n\t-webkit-margin-top-collapse: collapse !important;\n\t-webkit-mask-box-image: none !important;\n\t-webkit-mask-box-image-outset: 0px !important;\n\t-webkit-mask-box-image-repeat: stretch !important;\n\t-webkit-mask-box-image-slice: 0 fill !important;\n\t-webkit-mask-box-image-source: none !important;\n\t-webkit-mask-box-image-width: auto !important;\n\t-webkit-mask-clip: border-box !important;\n\t-webkit-mask-composite: source-over !important;\n\t-webkit-mask-image: none !important;\n\t-webkit-mask-origin: border-box !important;\n\t-webkit-mask-position: 0% 0% !important;\n\t-webkit-mask-position-x: 0% !important;\n\t-webkit-mask-position-y: 0% !important;\n\t-webkit-mask-repeat: repeat !important;\n\t-webkit-mask-size: auto !important;\n\t-webkit-max-logical-height: none !important;\n\t-webkit-max-logical-width: none !important;\n\t-webkit-min-logical-height: 0px !important;\n\t-webkit-min-logical-width: 0px !important;\n\t-webkit-padding-after: 0px !important;\n\t-webkit-padding-before: 0px !important;\n\t-webkit-padding-end: 0px !important;\n\t-webkit-padding-start: 0px !important;\n\t-webkit-perspective: none !important;\n\t-webkit-perspective-origin: 6.5px 6.5px !important;\n\t-webkit-print-color-adjust: economy !important;\n\t-webkit-rtl-ordering: logical !important;\n\t-webkit-ruby-position: before !important;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0.180392) !important;\n\t-webkit-text-combine: none !important;\n\t-webkit-text-decorations-in-effect: none !important;\n\t-webkit-text-emphasis-color: rgb(0, 0, 0) !important;\n\t-webkit-text-emphasis-position: over !important;\n\t-webkit-text-emphasis-style: none !important;\n\t-webkit-text-fill-color: rgb(0, 0, 0) !important;\n\t-webkit-text-orientation: vertical-right !important;\n\t-webkit-text-security: none !important;\n\t-webkit-text-stroke-color: rgb(0, 0, 0) !important;\n\t-webkit-text-stroke-width: 0px !important;\n\t-webkit-transform: none !important;\n\t-webkit-transform-origin: 6.5px 6.5px !important;\n\t-webkit-transform-style: flat !important;\n\t-webkit-transition: all 0s ease 0s !important;\n\t-webkit-transition-delay: 0s !important;\n\t-webkit-transition-duration: 0s !important;\n\t-webkit-transition-property: all !important;\n\t-webkit-transition-timing-function: ease !important;\n\t-webkit-user-drag: auto !important;\n\t-webkit-user-modify: read-only !important;\n\t-webkit-user-select: text !important;\n\t-webkit-writing-mode: horizontal-tb !important;\n\twhite-space: normal !important;\n\twidows: auto !important;\n\twidth: 13px !important;\n\tword-break: normal !important;\n\tword-spacing: 0px !important;\n\tword-wrap: normal !important;\n\twriting-mode: lr-tb !important;\n\tz-index: auto !important;\n\tzoom: 1 !important;\n}\n\n#-selector-toolbar {\n\tposition: fixed !important;\n\tbottom: 20px !important;\n\tleft: 10px !important;\n\tz-index: 99999 !important;\n\tbackground-color: #FFF !important;\n}\n\n#-selector-toolbar div.list-item {\n\tfont: 100%/1em Verdana, Helvetica, sans-serif !important;\n\tpadding: 0px 5px !important;\n\tcolor: #333333 !important;\n\tfont-size: 14px !important;\n\tborder: 1px solid #285e8e !important;\n\tborder-right:none !important;\n\tdisplay: table-cell !important;\n\ttext-align: right !important;\n\theight: 26px !important;\n\twidth:20px !important;\n\tline-height:26px !important;\n\ttext-align: center !important;\n}\n\n#-selector-toolbar div.list-item:first-child {\n\tborder-radius: 4px 0 0 4px !important;\n}\n\n#-selector-toolbar div.list-item:last-child {\n\tborder-radius: 0 4px 4px 0 !important;\n}\n\n#-selector-toolbar div.done-selecting-button {\n\tcolor: #ffffff !important;\n\t-webkit-text-fill-color: #FFF !important;\n\tbackground-color: #3276b1 !important;\n\tcursor: pointer !important;\n\twidth:130px !important;\n}\n\n#-selector-toolbar div.selector-container {\n\twidth: 350px !important;\n\toverflow: hidden !important;\n\tmargin-bottom:-100px !important;\n}\n\n#-selector-toolbar div.selector {\n\twidth: 10000px !important;\n\tfloat:right !important;\n\tcolor: #333333 !important;\n\ttext-align: right !important;\n\tfont: 100%/1em Verdana, Helvetica, sans-serif !important;\n\tline-height:26px !important;\n\tfont-size: 14px !important;\n}\n\n#-selector-toolbar div.key-button {\n\tcursor: help !important;\n\tbackground: #FFF !important;\n}\n\n#-selector-toolbar div.key-button.clicked {\n\tbackground: #88bc43 !important;\n}\n\n#-selector-toolbar div.key-button.clicked-animation {\n\ttransition: background 0.5s ease-in !important;\n\tbackground: #FFF !important;\n}\n\n#-selector-toolbar div.key-events {\n\twidth: 83px !important;\n}\n\n#-selector-toolbar div.key-events div {\n\tcursor: pointer !important;\n\twidth: 83px !important;\n\tfloat:right !important;\n\tfont: 100%/1em Verdana, Helvetica, sans-serif !important;\n\tline-height:26px !important;\n\tfont-size: 9px !important;\n\tmargin-bottom:-100px !important;\n}\n\n#-selector-toolbar div.hide {\n\tdisplay:none !important;\n}\n\n#-selector-toolbar div.input-group-addon {\n\tbackground-color:#eeeeee !important;\n\tposition:relative !important;\n}\n\n#-selector-toolbar div.popover {\n\tposition: absolute !important;\n\tdisplay: none !important;\n\tfloat: left !important;\n\twidth: 260px !important;\n\tmargin: 20px !important;\n\ttop: -138px !important;\n\tleft: -137px !important;\n\tz-index: 1060 !important;\n\tmax-width: 276px !important;\n\tpadding: 1px !important;\n\ttext-align: left !important;\n\twhite-space: normal !important;\n\tbackground-color: #fff !important;\n\tbackground-clip: padding-box !important;\n\tborder: 1px solid rgba(0,0,0,.2) !important;\n\tborder-radius: 6px !important;\n\tbox-shadow: 0 5px 10px rgba(0,0,0,.2) !important;\n}\n\n#-selector-toolbar div.popover div.arrow {\n\tposition: absolute !important;\n\tdisplay: block !important;\n\twidth: 0 !important;\n\theight: 0 !important;\n\tborder-color: transparent !important;\n\tborder-style: solid !important;\n\tborder-width: 11px !important;\n\tbottom: -11px !important;\n\tleft: 50% !important;\n\tmargin-left: -11px !important;\n\tborder-top-color: #999 !important;\n\tborder-top-color: rgba(0,0,0,.25) !important;\n\tborder-bottom-width: 0 !important;\n}\n\n#-selector-toolbar div.popover div.arrow:after {\n\tbox-sizing: border-box !important;\n\tposition: absolute !important;\n\tdisplay: block !important;\n\twidth: 0 !important;\n\theight: 0 !important;\n\tborder-color: transparent !important;\n\tborder-style: solid !important;\n\tborder-width: 10px !important;\n\tbottom: 1px !important;\n\tmargin-left: -10px !important;\n\tcontent: \" \" !important;\n\tborder-top-color: #fff !important;\n\tborder-bottom-width: 0 !important;\n\tvisibility: visible !important;\n}\n\n#-selector-toolbar div.popover div.close {\n\ttext-shadow: 0 1px 0 #ffffff !important;\n\tfloat: right !important;\n\tfont-size: 21px !important;\n\tfont-weight: bold !important;\n\tline-height: 1 !important;\n\tbackground: transparent !important;\n\tborder: 0 !important;\n\tpadding: 0 3px 0 0 !important;\n}\n\n#-selector-toolbar div.popover div.close:hover {\n\tcolor: #000000 !important;\n\ttext-decoration: none !important;\n\tcursor: pointer !important;\n\topacity: 0.5 !important;\n\tfilter: alpha(opacity=50) !important;\n}\n\n#-selector-toolbar div.popover-content {\n\tpadding: 9px 14px !important;\n}\n\n/**\n * Move images to top while selecting\n */\nbody.-web-scraper-selection-active img.-web-scraper-img-on-top {\n\tz-index:2147483647 !important; /* max z-index */\n\tposition:relative !important; /* will break images with position:absolute */\n}\n"
  },
  {
    "path": "server/static/css/devtools_scraper_panel.css",
    "content": "/*body > form, body > div {*/\n    /*display:none;*/\n/*}*/\n\na, tbody tr {\n    cursor: pointer;\n}\n\n\n.selector-list-tpl, .sitemap-list-tpl {\n    display:none\n}\n\n/**\n * Compact elements\n */\n#sitemap-nav-button {\n    padding-top: 3px;\n    padding-bottom: 3px;\n}\n\n.navbar-text {\n\tmargin-top:4px;\n\tmargin-bottom:4px;\n\tpadding-right:3px;\n}\n\n.navbar {\n    min-height:26px;\n    margin-bottom: 6px;\n}\n.table-condensed tbody>tr>td {\n    padding:1px 5px;\n}\n\nbody {\n    font-size: 12px;\n}\n\nform .form-control {\n    font-size: 12px;\n    padding: 3px 12px;\n    height: 25px;\n}\n\ntextarea.form-control {\n    height: auto;\n}\n\nform .btn {\n    font-size: 12px;\n    padding: 3px 12px;\n}\n\nform .form-group {\n    margin-bottom:5px;\n}\n\nform select[multiple], select[size] {\n    height: auto;\n}\n\n#selector-graph .node circle {\n\tcursor: pointer;\n\tfill: #fff;\n\tstroke: steelblue;\n\tstroke-width: 1px;\n}\n\n#selector-graph .node text {\n\tfont-size: 11px;\n}\n\n#selector-graph path.link {\n\tfill: none;\n\tstroke: #ccc;\n\tstroke-width: 1px;\n}\n\n.data-preview-modal .modal-dialog {\n\twidth:auto;\n}\n\n.data-preview-modal .modal-body {\n\toverflow-y:scroll;\n}\n\n.data-preview-modal tbody tr {\n\tcursor: initial;\n}"
  },
  {
    "path": "server/static/css/jquery.mloading.css",
    "content": "/* Author：mingyuhisoft@163.com\n * Github:https://github.com/imingyu/jquery.mloading\n * Npm:npm install jquery.mloading.js\n * Date：2016-7-4\n */\n.mloading-container {\n  position: relative;\n  min-height: 70px;\n  -webkit-transition: height 0.6s ease-in-out;\n  -o-transition: height 0.6s ease-in-out;\n  transition: height 0.6s ease-in-out;\n}\n.mloading {\n  position: absolute;\n  background: #E9E9E8;\n  font: normal 12px/22px \"Microsoft Yahei\", \"微软雅黑\", \"宋体\";\n  display: none;\n  z-index: 1600;\n  background: rgba(233, 233, 232, 0);\n}\n.mloading.active {\n  display: block;\n}\n.mloading.mloading-mask {\n  background: rgba(233, 233, 232, 0.75);\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=75);\n}\n.mloading-full {\n  position: fixed;\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n}\n.mloading-container > .mloading {\n  top: 0px;\n  left: 0px;\n  width: 100%;\n  height: 100%;\n}\n.mloading-body {\n  width: 100%;\n  height: 100%;\n  position: relative;\n}\n.mloading-bar {\n  width: 250px;\n  min-height: 22px;\n  text-align: center;\n  background: #fff;\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.27);\n  border-radius: 7px;\n  padding: 20px 15px;\n  font-size: 14px;\n  color: #999;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  margin-left: -140px;\n  margin-top: -30px;\n  word-break: break-all;\n}\n@media (max-width: 300px) {\n  .mloading-bar {\n    width: 62px;\n    height: 56px;\n    margin-left: -30px !important;\n    margin-top: -30px !important;\n    padding: 0;\n    line-height: 56px;\n  }\n  .mloading-bar > .mloading-text {\n    display: none;\n  }\n}\n.mloading-bar-sm {\n  width: 62px;\n  height: 56px;\n  margin-left: -30px !important;\n  margin-top: -30px !important;\n  padding: 0;\n  line-height: 56px;\n}\n.mloading-bar-sm > .mloading-text {\n  display: none;\n}\n.mloading-icon {\n  width: 16px;\n  height: 16px;\n  vertical-align: middle;\n}\n.mloading-text {\n  margin-left: 10px;\n}"
  },
  {
    "path": "server/static/css/wiz_style/bootstrap-tmp.css",
    "content": "a {\n  color: #008cba;\n  text-decoration: none;\n}\n.navbar {\n  position: relative;\n  min-height: 45px;\n  margin-bottom: 21px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 12px 15px;\n  font-size: 19px;\n  line-height: 21px;\n  height: 45px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 5.5px;\n  margin-bottom: 5.5px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 0;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 6px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 21px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 21px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 12px;\n    padding-bottom: 12px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 3px;\n  margin-bottom: 3px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 3px;\n  margin-bottom: 3px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 4.5px;\n  margin-bottom: 4.5px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 11.5px;\n  margin-bottom: 11.5px;\n}\n.navbar-text {\n  margin-top: 12px;\n  margin-bottom: 12px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #333333;\n  border-color: #222222;\n}\n.navbar-default .navbar-brand {\n  color: #ffffff;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #ffffff;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: #272727;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #272727;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: transparent;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #222222;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #272727;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #ffffff;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: #272727;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #272727;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #ffffff;\n}\n.navbar-default .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-default .btn-link {\n  color: #ffffff;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #cccccc;\n}\n.navbar-inverse {\n  background-color: #008cba;\n  border-color: #006687;\n}\n.navbar-inverse .navbar-brand {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: #006687;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #006687;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: transparent;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #007196;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #006687;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #ffffff;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444444;\n}\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.navbar {\n  border: none;\n  font-size: 13px;\n  font-weight: 300;\n}\n.navbar .navbar-toggle:hover .icon-bar {\n  background-color: #b3b3b3;\n}\n.navbar-collapse {\n  border-top-color: rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.navbar .btn {\n  padding-top: 6px;\n  padding-bottom: 6px;\n}\n.navbar-form {\n  margin-top: 7px;\n  margin-bottom: 5px;\n}\n.navbar-form .form-control {\n  height: auto;\n  padding: 4px 6px;\n}\n.navbar-text {\n  margin: 12px 15px;\n  line-height: 21px;\n}\n.navbar .dropdown-menu {\n  border: none;\n}\n.navbar .dropdown-menu > li > a,\n.navbar .dropdown-menu > li > a:focus {\n  background-color: transparent;\n  font-size: 13px;\n  font-weight: 300;\n}\n.navbar .dropdown-header {\n  color: rgba(255, 255, 255, 0.5);\n}\n.navbar-default .dropdown-menu {\n  background-color: #333333;\n}\n.navbar-default .dropdown-menu > li > a,\n.navbar-default .dropdown-menu > li > a:focus {\n  color: #ffffff;\n}\n.navbar-default .dropdown-menu > li > a:hover,\n.navbar-default .dropdown-menu > .active > a,\n.navbar-default .dropdown-menu > .active > a:hover {\n  background-color: #272727;\n}\n.navbar-inverse .dropdown-menu {\n  background-color: #008cba;\n}\n.navbar-inverse .dropdown-menu > li > a,\n.navbar-inverse .dropdown-menu > li > a:focus {\n  color: #ffffff;\n}\n.navbar-inverse .dropdown-menu > li > a:hover,\n.navbar-inverse .dropdown-menu > .active > a,\n.navbar-inverse .dropdown-menu > .active > a:hover {\n  background-color: #006687;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 0;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 68px;\n  }\n}\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.container:after,\n.container-fluid:after,\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #999999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #008cba;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9.5px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.4;\n  border: 1px solid transparent;\n  border-radius: 0 0 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #6f6f6f;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 0;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 0 0 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 0;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #008cba;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 0;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 0 0 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 45px;\n  margin-bottom: 21px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 12px 15px;\n  font-size: 19px;\n  line-height: 21px;\n  height: 45px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 5.5px;\n  margin-bottom: 5.5px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 0;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 6px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 21px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 21px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 12px;\n    padding-bottom: 12px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 3px;\n  margin-bottom: 3px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 3px;\n  margin-bottom: 3px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 4.5px;\n  margin-bottom: 4.5px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 11.5px;\n  margin-bottom: 11.5px;\n}\n.navbar-text {\n  margin-top: 12px;\n  margin-bottom: 12px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #333333;\n  border-color: #222222;\n}\n.navbar-default .navbar-brand {\n  color: #ffffff;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #ffffff;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: #272727;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #272727;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: transparent;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #222222;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #272727;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #ffffff;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: #272727;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #272727;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #ffffff;\n}\n.navbar-default .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-default .btn-link {\n  color: #ffffff;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #cccccc;\n}\n.navbar-inverse {\n  background-color: #008cba;\n  border-color: #006687;\n}\n.navbar-inverse .navbar-brand {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: #006687;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #006687;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: transparent;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #007196;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #006687;\n  color: #ffffff;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #ffffff;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #006687;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #ffffff;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444444;\n}\n.nav-pills > .active > a > .badge {\n  color: #008cba;\n  background-color: #ffffff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.nav:after,\n.navbar {\n  border: none;\n  font-size: 13px;\n  font-weight: 300;\n}\n.navbar .navbar-toggle:hover .icon-bar {\n  background-color: #b3b3b3;\n}\n.navbar-collapse {\n  border-top-color: rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.navbar .btn {\n  padding-top: 6px;\n  padding-bottom: 6px;\n}\n.navbar-form {\n  margin-top: 7px;\n  margin-bottom: 5px;\n}\n.navbar-form .form-control {\n  height: auto;\n  padding: 4px 6px;\n}\n.navbar-text {\n  margin: 12px 15px;\n  line-height: 21px;\n}\n.navbar .dropdown-menu {\n  border: none;\n}\n.navbar .dropdown-menu > li > a,\n.navbar .dropdown-menu > li > a:focus {\n  background-color: transparent;\n  font-size: 13px;\n  font-weight: 300;\n}\n.navbar .dropdown-header {\n  color: rgba(255, 255, 255, 0.5);\n}\n.navbar-default .dropdown-menu {\n  background-color: #333333;\n}\n.navbar-default .dropdown-menu > li > a,\n.navbar-default .dropdown-menu > li > a:focus {\n  color: #ffffff;\n}\n.navbar-default .dropdown-menu > li > a:hover,\n.navbar-default .dropdown-menu > .active > a,\n.navbar-default .dropdown-menu > .active > a:hover {\n  background-color: #272727;\n}\n.navbar-inverse .dropdown-menu {\n  background-color: #008cba;\n}\n.navbar-inverse .dropdown-menu > li > a,\n.navbar-inverse .dropdown-menu > li > a:focus {\n  color: #ffffff;\n}\n.navbar-inverse .dropdown-menu > li > a:hover,\n.navbar-inverse .dropdown-menu > .active > a,\n.navbar-inverse .dropdown-menu > .active > a:hover {\n  background-color: #006687;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  border-color: transparent;\n}\n.nav-tabs > li > a {\n  background-color: #e7e7e7;\n  color: #222222;\n}\n.nav-tabs .caret {\n  border-top-color: #222222;\n  border-bottom-color: #222222;\n}\n.nav-pills {\n  font-weight: 300;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #999999;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #008cba;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9.5px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.4;\n  border: 1px solid transparent;\n  border-radius: 0 0 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #6f6f6f;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}"
  },
  {
    "path": "server/static/css/wiz_style/github2.css",
    "content": "/*.markdown-body {*/\n    /*font-family: Helvetica, \"Hiragino Sans GB\", \"微软雅黑\", \"Microsoft YaHei UI\", SimSun, SimHei, arial, sans-serif;*/\n    /*line-height: 1.6;*/\n    /*!*background-color: white;*!*/\n    /*margin: 0 auto;*/\n    /*padding: 20px 36px;*/\n/*}*/\n/*.markdown-body,*/\n/*.markdown-body p,*/\n/*.markdown-body div {*/\n    /*font-size: 15px;*/\n/*}*/\n\n.markdown-body.mobile {\n    padding: 0;\n}\n\n.markdown-body > *:first-child {\n    margin-top: 0 !important;\n}\n\n.markdown-body > *:last-child {\n    margin-bottom: 0 !important;\n}\n\n.markdown-body a {\n    color: #448aff;\n    text-decoration: none;\n}\n.markdown-body a:hover {\n    text-decoration: underline;\n}\n\n.markdown-body a.absent {\n    color: #cc0000;\n}\n\n.markdown-body a.anchor {\n    display: block;\n    padding-left: 30px;\n    margin-left: -30px;\n    cursor: pointer;\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n}\n\n.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {\n    margin: 20px 0 10px;\n    padding: 0;\n    font-weight: bold;\n    /*-webkit-font-smoothing: antialiased;*/\n    cursor: text;\n    position: relative;\n}\n\n.markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor {\n    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center;\n    text-decoration: none;\n}\n\n/*.markdown-body h1 tt, .markdown-body h1 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h2 tt, .markdown-body h2 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h3 tt, .markdown-body h3 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h4 tt, .markdown-body h4 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h5 tt, .markdown-body h5 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h6 tt, .markdown-body h6 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h1 {*/\n    /*font-size: 21px;*/\n    /*color: black;*/\n/*}*/\n\n/*.markdown-body h2 {*/\n    /*font-size: 20px;*/\n    /*color: black;*/\n/*}*/\n\n/*.markdown-body h3 {*/\n    /*font-size: 18px;*/\n/*}*/\n\n/*.markdown-body h4 {*/\n    /*font-size: 17px;*/\n/*}*/\n\n/*.markdown-body h5 {*/\n    /*font-size: 15px;*/\n/*}*/\n\n/*.markdown-body h6 {*/\n    /*color: #777777;*/\n    /*font-size: 15px;*/\n    /*margin: 1em 0;*/\n/*}*/\n\n.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol,\n.markdown-body dl, .markdown-body pre {\n    margin: 10px 0;\n    margin: .83rem 0;\n}\n\n.markdown-body li {\n    margin: 5px 0;\n}\n\n.markdown-body li.wiz-md-todo-list-item {\n    list-style: none;\n}\n.markdown-body li.wiz-md-todo-list-item input.wiz-md-todo-checkbox {\n    margin: 0px 5px 0px -1rem;\n    vertical-align:middle;\n}\n\n.markdown-body hr {\n    border: 0;\n    border-bottom: 1px dashed #cfcfcf;\n    margin: 30px 0;\n}\n\n.markdown-body > h2:first-child {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body > h1:first-child {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body > h1:first-child + h2 {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body > h3:first-child, .markdown-body > h4:first-child, .markdown-body > h5:first-child, .markdown-body > h6:first-child {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body h1 p, .markdown-body h2 p, .markdown-body h3 p, .markdown-body h4 p, .markdown-body h5 p, .markdown-body h6 p {\n    margin-top: 0;\n}\n\n.markdown-body li p.first {\n    display: inline-block;\n}\n\n.markdown-body pre li {\n    margin: 0;\n}\n\n.markdown-body ul, .markdown-body ol {\n    padding-left: 34px;\n    padding-left: 2.13rem;\n}\n.markdown-body ul p, .markdown-body ol p{\n    margin: 0;\n}\n\n.markdown-body ul :first-child, .markdown-body ol :first-child {\n    margin-top: 0;\n}\n\n.markdown-body dl {\n    padding: 0;\n}\n\n.markdown-body dl dt {\n    font-size: 10pt;\n    font-size: 0.83rem;\n    font-weight: bold;\n    font-style: italic;\n    padding: 0;\n    margin: 8px 0 5px;\n}\n\n.markdown-body dl dt:first-child {\n    padding: 0;\n}\n\n.markdown-body dl dt > :first-child {\n    margin-top: 0;\n}\n\n.markdown-body dl dt > :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body dl dd {\n    margin: 0 0 8px;\n    padding: 0 15px;\n}\n\n.markdown-body dl dd > :first-child {\n    margin-top: 0;\n}\n\n.markdown-body dl dd > :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body blockquote {\n    border-left: 4px solid #dddddd;\n    padding: 0 12px;\n    color: #aaa;\n}\n\n.markdown-body blockquote > :first-child {\n    margin-top: 0;\n}\n\n.markdown-body blockquote > :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body table {\n    padding: 0;\n    border-collapse: collapse;\n}\n\n.markdown-body table tr {\n    border-top: 1px solid #cccccc;\n    background-color: white;\n    margin: 0;\n    padding: 0;\n}\n\n.markdown-body table tr:nth-child(2n) {\n    background-color: #f8f8f8;\n}\n\n.markdown-body table tr th {\n    font-size: 10pt;\n    font-size: 0.83rem;\n    font-weight: bold;\n    border: 1px solid #cccccc;\n    margin: 0;\n    padding: 6px 13px;\n}\n\n.markdown-body table tr td {\n    border: 1px solid #cccccc;\n    margin: 0;\n    padding: 6px 13px;\n    font-size: 10pt;\n    font-size: 0.83rem;\n}\n\n.markdown-body table tr th :first-child, .markdown-body table tr td :first-child {\n    margin-top: 0;\n}\n\n.markdown-body table tr th :last-child, .markdown-body table tr td :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body img {\n    max-width: 100%;\n}\n\n.markdown-body .footnote {\n    vertical-align: top;\n    position: relative;\n    top: -0.5em;\n    font-size: 9pt;\n    font-size: .75rem\n}\n\n.markdown-body span.frame {\n    display: block;\n    overflow: hidden;\n}\n\n.markdown-body span.frame > span {\n    border: 1px solid #dddddd;\n    display: block;\n    float: left;\n    overflow: hidden;\n    margin: 13px 0 0;\n    padding: 7px;\n    width: auto;\n}\n\n.markdown-body span.frame span img {\n    display: block;\n    float: left;\n}\n\n.markdown-body span.frame span span {\n    clear: both;\n    color: #333333;\n    display: block;\n    padding: 5px 0 0;\n}\n\n.markdown-body span.align-center {\n    display: block;\n    overflow: hidden;\n    clear: both;\n}\n\n.markdown-body span.align-center > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px auto 0;\n    text-align: center;\n}\n\n.markdown-body span.align-center span img {\n    margin: 0 auto;\n    text-align: center;\n}\n\n.markdown-body span.align-right {\n    display: block;\n    overflow: hidden;\n    clear: both;\n}\n\n.markdown-body span.align-right > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px 0 0;\n    text-align: right;\n}\n\n.markdown-body span.align-right span img {\n    margin: 0;\n    text-align: right;\n}\n\n.markdown-body span.float-left {\n    display: block;\n    margin-right: 13px;\n    overflow: hidden;\n    float: left;\n}\n\n.markdown-body span.float-left span {\n    margin: 13px 0 0;\n}\n\n.markdown-body span.float-right {\n    display: block;\n    margin-left: 13px;\n    overflow: hidden;\n    float: right;\n}\n\n.markdown-body span.float-right > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px auto 0;\n    text-align: right;\n}\n\n.markdown-body code, .markdown-body tt {\n    margin: 0 2px;\n    padding: 2px 4px;\n    white-space: pre-wrap;\n    color: #c7254e;\n    background-color: #f9f2f4;\n    border-radius: 4px;\n}\n\n.markdown-body pre code {\n    margin: 0;\n    padding: 0;\n    word-wrap: break-word;\n    max-width: 100%;\n    border: none;\n    background: transparent;\n    color: #666;\n}\n\n.markdown-body pre {\n    background-color: #f8f8f8;\n    border: 1px solid #cccccc;\n    font-size: 10pt;\n    font-size: 0.83rem;\n    line-height: 14pt;\n    line-height: 1.17rem;\n    overflow: auto;\n    padding: 6px 10px;\n    border-radius: 3px;\n}\n\n.markdown-body .CodeMirror pre {\n    background-color: transparent;\n    border: 0px;\n    font-size: inherit;\n    line-height: inherit;\n    overflow: initial;\n    padding: 0 4px;\n    border-radius: initial;\n    margin: 0;\n}\n\n.markdown-body pre code, .markdown-body pre tt {\n    background-color: transparent;\n    border: none;\n}\n\n@media screen {\n    .markdown-body pre, .markdown-body code {\n        word-wrap: break-word;\n    }\n}\n\n@media print {\n    .markdown-body table, .markdown-body pre {\n        page-break-inside: avoid;\n    }\n\n    pre {\n        word-wrap: break-word;\n    }\n}\n\n/*wiz code highlight*/\n.markdown-body pre, .markdown-body code {\n    font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n}\n\n.markdown-body .pln {\n    color: #48484C;\n}\n\n.markdown-body .str {\n    color: #DD1144;\n}\n\n.markdown-body .kwd {\n    color: #1E347B;\n}\n\n.markdown-body .com {\n    color: #93A1A1;\n}\n\n.markdown-body .typ {\n    color: teal;\n}\n\n.markdown-body .lit {\n    color: #195F91;\n}\n\n.markdown-body .pun {\n    color: #93A1A1;\n}\n\n.markdown-body .opn {\n    color: #93A1A1;\n}\n\n.markdown-body .clo {\n    color: #93A1A1;\n}\n\n.markdown-body .tag {\n    color: #008;\n}\n\n.markdown-body .atn {\n    color: teal;\n}\n\n.markdown-body .atv {\n    color: #DD1144;\n}\n\n.markdown-body .dec {\n    color: teal;\n}\n\n.markdown-body .var {\n    color: teal;\n}\n\n.markdown-body .fun {\n    color: #DC322F;\n}\n\n/* Put a border around prettyprinted code snippets. */\n/*.markdown-body pre.prettyprint {*/\n    /*background-color: #F7F7F9;*/\n    /*padding: 0;*/\n    /*border: 1px solid #E1E1E8;*/\n/*}*/\n\n/*.markdown-body pre.prettyprint.linenums {*/\n    /*overflow: auto;*/\n    /*-webkit-overflow-scrolling: touch;*/\n/*}*/\n\n/*!* Specify class=linenums on a pre to get line numbering *!*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums {*/\n    /*box-shadow: 40px 0 0 #FBFBFC inset, 41px 0 0 #ECECF0 inset;*/\n    /*padding: 10px 10px 10px 40px !important;*/\n    /*color: #1E347B;*/\n    /*margin-top: 0;*/\n    /*margin-bottom: 0;*/\n/*}*/\n\n/*.markdown-body pre.prettyprint.linenums ol.linenums li {*/\n    /*color: #BEBEC5;*/\n    /*line-height: 18px;*/\n    /*padding-left: 12px !important;*/\n/*}*/\n\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L0,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L1,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L2,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L3,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L4,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L5,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L6,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L7,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L8,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L9 {*/\n    /*list-style-type: decimal !important;*/\n/*}*/\n\n\n@media screen and (max-width: 660px) {\n    .markdown-body {\n        padding: 20px 18px;\n    }\n}\n\n\n@media only screen and (-webkit-max-device-width: 1024px),\nonly screen and (-o-max-device-width: 1024px),\nonly screen and (max-device-width: 1024px),\nonly screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (-o-min-device-pixel-ratio: 3),\nonly screen and (min-device-pixel-ratio: 3) {\n    .markdown-body {\n        padding: 12px 15px;\n        /*color: #353c47;*/\n    }\n\n    /*.markdown-body,*/\n    /*.markdown-body p,*/\n    /*.markdown-body div {*/\n        /*font-size: 17px;*/\n        /*line-height: 1.7;*/\n    /*}*/\n\n    /*.markdown-body h1 {*/\n        /*font-size: 34px;*/\n    /*}*/\n\n    /*.markdown-body h2 {*/\n        /*font-size: 30px;*/\n    /*}*/\n\n    /*.markdown-body h3 {*/\n        /*font-size: 26px;*/\n    /*}*/\n\n    /*.markdown-body h4 {*/\n        /*font-size: 22px;*/\n    /*}*/\n\n    /*.markdown-body h5 {*/\n        /*font-size: 18px;*/\n    /*}*/\n\n    /*.markdown-body h6 {*/\n        /*color: inherit;*/\n    /*}*/\n\n    .markdown-body ul, .markdown-body ol {\n        padding-left: 40px;\n    }\n\n    .markdown-body blockquote {\n        /*border-left: 4px solid #c8d4e8;*/\n        padding: 0 15px;\n        /*color: #b3c2dd;*/\n    }\n}\n\n/*评论页面修正*/\n.comment-list-item .markdown-body {\n    padding: 0;\n    margin: 1em .5em 1em 0;\n}\n/* 修正 CodeMirror & table */\n.markdown-body .wiz-code-container,\n.markdown-body .wiz-table-body {\n    padding: 0;\n}"
  },
  {
    "path": "server/static/css/wiz_style/temp.css",
    "content": ".navbar {\n    border: none;\n    font-size: 13px;\n    font-weight: 300;\n}\n.navbar-default {\n    background-color: #333333;\n}\n@media (min-width: 768px){\n    .navbar-static-top {\n        border-radius: 0;\n    }\n}\n.navbar-static-top {\n    z-index: 1000;\n}\n.navbar {\n    position: relative;\n    min-height: 45px;\n    margin-bottom: 21px;\n}\nnav {\n    display: block;\n}\n* {\n    box-sizing: border-box;\n}\nbody {\n    font-family: \"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;\n    line-height: 1.4;\n    color: #222222;\n    background-color: #ffffff;\n}\nhtml {\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n.clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after {\n    content: \" \";\n    display: table;\n}\n*:before, *:after {\n    box-sizing: border-box;\n}\n.clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical>.btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-header:after, .modal-footer:after {\n    clear: both;\n}\n.clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical>.btn-group:before, .btn-group-vertical>.btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after {\n    content: \" \";\n    display: table;\n}\n*:after {\n    box-sizing: border-box;\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container {\n    margin-right: auto;\n    margin-left: auto;\n    padding-left: 15px;\n    padding-right: 15px;\n}\n.navbar {\n    border: none;\n    font-size: 13px;\n    font-weight: 300;\n}\nbody {\n    font-family: \"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;\n    line-height: 1.4;\n    color: #222222;\n    background-color: #ffffff;\n}"
  },
  {
    "path": "server/static/css/wiz_style/wizToc.css",
    "content": "\n.wiz_toc_layer {\n    background: #F9F9F5;\n    padding: 20px 25px;\n    word-break: break-word;\n}\n\n.wiz_toc {\n    text-decoration: none;\n    display: inline-block;\n    line-height: 27px;\n}\n.wiz_toc:hover{\n    text-decoration: underline;\n}\n.wiz_toc.h1 {\n    margin-left: 0;\n}\n.wiz_toc.h2 {\n    margin-left: 20px;\n}\n.wiz_toc.h3 {\n    margin-left: 40px;\n}\n.wiz_toc.h4 {\n    margin-left: 60px;\n}\n.wiz_toc.h5 {\n    margin-left: 80px;\n}\n.wiz_toc.h6 {\n    margin-left: 100px;\n}"
  },
  {
    "path": "server/static/css/wiz_style/wiz_tmp_editor_style.css",
    "content": "html {height:100%;} body {min-height:100%;box-sizing:border-box;word-wrap: break-word !important;}a {word-wrap: break-word;}img::selection {background-color: rgba(0, 0, 255, 0.3);}.wiz-table-container {border:0px !important;}.wiz-table-body {border:0px !important;position:relative;margin:10px 0;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;}.wiz-table-body table {margin:0;outline:none;}td,th {outline:none;}undefinedundefined\n.wiz-code-container{position: relative; padding:8px 0; margin: 5px 25px 5px 5px;text-indent:0; text-align:left;}.CodeMirror {font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace; color: black; font-size: 10pt; font-size: 0.83rem}.CodeMirror-lines {padding: 4px 0;}.CodeMirror pre {padding: 0 4px;}.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {background-color: white;}.CodeMirror-gutters {border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap;}.CodeMirror-linenumbers {}.CodeMirror-linenumber {padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; white-space: nowrap;}.CodeMirror-guttermarker {color: black;}.CodeMirror-guttermarker-subtle {color: #999;}.CodeMirror-cursor {border-left: 1px solid black; border-right: none; width: 0;}.CodeMirror div.CodeMirror-secondarycursor {border-left: 1px solid silver;}.cm-fat-cursor .CodeMirror-cursor {width: auto; border: 0 !important; background: #7e7;}.cm-fat-cursor div.CodeMirror-cursors {z-index: 1;}.cm-animate-fat-cursor {width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite; background-color: #7e7;}@-moz-keyframes blink {  0% {}  50% { background-color: transparent; }  100% {}}@-webkit-keyframes blink {  0% {}  50% { background-color: transparent; }  100% {}}@keyframes blink {  0% {}  50% { background-color: transparent; }  100% {}}.CodeMirror-overwrite .CodeMirror-cursor {}.cm-tab { display: inline-block; text-decoration: inherit; }.CodeMirror-rulers {position: absolute; left: 0; right: 0; top: -50px; bottom: -20px; overflow: hidden;}.CodeMirror-ruler {border-left: 1px solid #ccc; top: 0; bottom: 0; position: absolute;}.cm-s-default .cm-header {color: blue;}.cm-s-default .cm-quote {color: #090;}.cm-negative {color: #d44;}.cm-positive {color: #292;}.cm-header, .cm-strong {font-weight: bold;}.cm-em {font-style: italic;}.cm-link {text-decoration: underline;}.cm-strikethrough {text-decoration: line-through;}.cm-s-default .cm-keyword {color: #708;}.cm-s-default .cm-atom {color: #219;}.cm-s-default .cm-number {color: #164;}.cm-s-default .cm-def {color: #00f;}.cm-s-default .cm-variable,.cm-s-default .cm-punctuation,.cm-s-default .cm-property,.cm-s-default .cm-operator {}.cm-s-default .cm-variable-2 {color: #05a;}.cm-s-default .cm-variable-3 {color: #085;}.cm-s-default .cm-comment {color: #a50;}.cm-s-default .cm-string {color: #a11;}.cm-s-default .cm-string-2 {color: #f50;}.cm-s-default .cm-meta {color: #555;}.cm-s-default .cm-qualifier {color: #555;}.cm-s-default .cm-builtin {color: #30a;}.cm-s-default .cm-bracket {color: #997;}.cm-s-default .cm-tag {color: #170;}.cm-s-default .cm-attribute {color: #00c;}.cm-s-default .cm-hr {color: #999;}.cm-s-default .cm-link {color: #00c;}.cm-s-default .cm-error {color: #f00;}.cm-invalidchar {color: #f00;}.CodeMirror-composing { border-bottom: 2px solid; }div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }.CodeMirror-activeline-background {background: #e8f2ff;}.CodeMirror {position: relative; background: #f5f5f5;}.CodeMirror-scroll {overflow: hidden !important; margin-bottom: 0; margin-right: -30px; padding: 16px 30px 16px 0; outline: none; position: relative;}.CodeMirror-sizer {position: relative; border-right: 30px solid transparent;}.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {position: absolute; z-index: 6; display: none;}.CodeMirror-vscrollbar {right: 0; top: 0; overflow-x: hidden; overflow-y: scroll;}.CodeMirror-hscrollbar {bottom: 0; left: 0 !important; overflow-y: hidden; overflow-x: scroll;}.CodeMirror-scrollbar-filler {right: 0; bottom: 0;}.CodeMirror-gutter-filler {left: 0; bottom: 0;}.CodeMirror-gutters {position: absolute; left: 0; top: -5px; min-height: 100%; z-index: 3;}.CodeMirror-gutter {white-space: normal; height: inherit; display: inline-block; vertical-align: top; margin-bottom: -30px;}.CodeMirror-gutter-wrapper {position: absolute; z-index: 4; background: none !important; border: none !important;}.CodeMirror-gutter-background {position: absolute; top: 0; bottom: 0; z-index: 4;}.CodeMirror-gutter-elt {position: absolute; cursor: default; z-index: 4; text-align: center;}.CodeMirror-gutter-wrapper ::selection { background-color: transparent }.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }.CodeMirror-lines {cursor: text; min-height: 1px;}.CodeMirror pre {-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; -webkit-font-variant-ligatures: contextual; font-variant-ligatures: contextual;}.CodeMirror-wrap pre {word-wrap: break-word; white-space: pre-wrap; word-break: normal;}.CodeMirror-linebackground {position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0;}.CodeMirror-linewidget {position: relative; z-index: 2; overflow: auto;}.CodeMirror-widget {}.CodeMirror-rtl pre { direction: rtl; }.CodeMirror-code {outline: none;}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber {-moz-box-sizing: content-box; box-sizing: content-box;}.CodeMirror-measure {position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden;}.CodeMirror-cursor {position: absolute; pointer-events: none;}.CodeMirror-measure pre { position: static; }div.CodeMirror-cursors {visibility: hidden; position: relative; z-index: 3;}div.CodeMirror-dragcursors {visibility: visible;}.CodeMirror-focused div.CodeMirror-cursors {visibility: visible;}.CodeMirror-selected { background: #d9d9d9; }.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }.CodeMirror-crosshair { cursor: crosshair; }.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }.cm-searching {background: #ffa; background: rgba(255, 255, 0, .4);}.cm-force-border { padding-right: .1px; }@media print {  .CodeMirror div.CodeMirror-cursors {visibility: hidden;}}.cm-tab-wrap-hack:after { content: \"\"; }span.CodeMirror-selectedtext { background: none; }.CodeMirror-activeline-background, .CodeMirror-selected {transition: visibility 0ms 100ms;}.CodeMirror-blur .CodeMirror-activeline-background, .CodeMirror-blur .CodeMirror-selected {visibility:hidden;}.CodeMirror-blur .CodeMirror-matchingbracket {color:inherit !important;outline:none !important;text-decoration:none !important;}\n.wiz-code-tools {display:none;position: absolute; top: -32px; right: 0; opacity: .95; z-index: 10;}.CodeMirror-focused .wiz-code-tools {display:block;}.CodeMirror-sizer {border-right: 0 !important;}body pre.prettyprint {padding:0;}body pre.prettyprint code {white-space: pre;}body pre.prettyprint.linenums {box-shadow:none; overflow: auto;-webkit-overflow-scrolling: touch;}body pre.prettyprint.linenums ol.linenums {box-shadow: 40px 0 0 #FBFBFC inset, 41px 0 0 #ECECF0 inset; padding: 10px 10px 10px 40px !important;}\n.CodeMirror-cursors {visibility: hidden !important;}"
  },
  {
    "path": "server/static/css/work-style.css",
    "content": "/* 下方侧边栏 */\n.sidebar {\n    min-height: 400px;\n    max-height: 500px;\n    border-right: 1px solid #eee;\n    width: 100%;\n    overflow: scroll;\n}\n/* 高度拖动按钮 */\n.expander{\n    height: 3px;\n    background-color: #888888;\n}\n.expander:hover{\n    cursor: n-resize;\n}\n\n/* 主页面显示值 */\n.index{\n    position: relative;\n    top: 45%;\n    text-align: center;\n    font-size: 38px;\n    color: #ccc;\n}\n\n/* item自定义样式 */\n.item-style > li > a {\n    padding: 0;\n}\n\n/* 总记录数 */\n.table_operation {\n    padding: 20px 30px;\n    background: #ecf5ff;\n    min-height: 36px;\n    position: relative;\n}\n\n.table_total {\n    position: absolute;\n    top: 25px;\n    font-size: 13px;\n    color: #77797B;\n}\n\n/* 分页栏 */\n.return-button {\n    line-height: 24px;\n    overflow: hidden;\n    color: #8590a6;\n    padding: 10px 10px 10px 10px;\n    background: #ecf5ff;\n    font-size: 15px;\n    box-shadow: 0 1px 3px rgba(0,37,55,.05);\n    box-sizing: border-box;\n}\n\n.page {\n    float: right;\n    font-size: 0;\n}\n\n.page span {\n    padding: 4px 8px;\n    display: inline-block;\n    font-size: 14px;\n    border: 1px solid #DDDDDD;\n    border-right: 0;\n    color: #77797B;\n}\n\n.page span.current {\n    color: #000;\n    cursor: pointer;\n    background: #EEEEEE;\n}\n\n.page span:hover {\n    color: #000;\n    cursor: pointer;\n    background: #EEEEEE;\n}\n\n/* 浮动窗 */\n.float-frame {\n    position: fixed;\n}\n.attribute {\n    margin: 2px 0 2px 0;\n}\n\n.attribute span{\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    width: 210px;\n}\n\n.attribute span:nth-child(2){\n    color: #AAA;\n}\n\n.show-element {\n    display: none;\n    color: #fff;\n    padding: 8px;\n    max-width: 450px;\n    float: left;\n    background-color: #777777;\n    box-shadow: 0 4px 6px 0 rgba(0,0,0,.8);\n    margin-right: 15px;\n    pointer-events: all;\n    border-radius: 3px;\n}\n\n.button {\n    float: right;\n    margin: -3px -3px 0 5px;\n    background: 0 0;\n    border-color: rgba(0,0,0,.2);\n    border-style: solid;\n    color: #6F92BF;\n}\n\n.start-sel {\n    background-color: #CCF7BE;\n    outline-color: #008000;\n    outline-style: solid;\n    outline-width: 2px;\n}\n\n.end-sel {\n    background-color: #F7CCBE;\n    outline-color: #C70000;\n    outline-style: solid;\n    outline-width: 2px;\n}\n\n.table-hover {\n    font-size: 10px;\n}\n\n.select-form {\n    display: block;\n    width: 75px;\n    padding: 2px 4px;\n    font-size: 13px;\n    line-height: 1.42857143;\n    color: #555;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n}\n\n.btn-custom {\n    color: #333;\n    background-color: #fff;\n    border-color: #ccc;\n    display: inline-block;\n    margin-bottom: 0;\n    font-size: 14px;\n    font-weight: 400;\n    line-height: 1.42857143;\n    text-align: center;\n    white-space: nowrap;\n    vertical-align: middle;\n    touch-action: manipulation;\n    cursor: pointer;\n    -webkit-user-select: none;\n    background-image: none;\n    border-radius: 4px;\n}\n\n.select-view {\n    display: none;\n    top: 10%;\n    left: 35%;\n    position: fixed;\n    color: #fff;\n    padding: 6px 6px 8px 6px;\n    background-color: rgba(0,0,0,.8);\n    box-shadow: 0 0 9px 1px rgba(0,0,0,.8);\n    border: none;\n    width: 500px;\n}\n\n.row-float {\n    margin-right: 0;\n    margin-left: 0;\n}\n\n.row-float .btn-close{\n    float: right;\n}\n\n.row-float .btn-done{\n    position: relative;\n    left: 41%;\n    background-color: #5cb85c;\n    border-color: #3e8f3e;\n    border-radius: 4px;\n}\n\n.form-float {\n    display: block;\n    width: 100%;\n    padding: 2px 4px;\n    font-size: 10px;\n    line-height: 1.42857143;\n    color: #555;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #ccc;\n    border-radius: 4px;\n}\n\n#save-sel > tr > td {\n    max-width: 100px;\n    overflow: hidden;\n}\n\n.sel-table{\n    table-layout:fixed;\n    width: 450px;\n    height:121px;\n}\n\n.sel-table td {\n    width: inherit;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n}\n\n/*body > form, body > div {*/\n    /*display:none;*/\n/*}*/\n\na, tbody tr {\n    cursor: pointer;\n}\n\n\n.selector-list-tpl, .sitemap-list-tpl {\n    display:none\n}\n\n/**\n * Compact elements\n */\n#sitemap-nav-button {\n    padding-top: 3px;\n    padding-bottom: 3px;\n}\n\n.navbar-text {\n\tmargin-top:4px;\n\tmargin-bottom:4px;\n\tpadding-right:3px;\n}\n\n.navbar {\n    min-height:26px;\n    margin-bottom: 6px;\n}\n.table-condensed tbody>tr>td {\n    padding:1px 5px;\n}\n\nbody {\n    font-size: 12px;\n}\n\nform .form-control {\n    font-size: 12px;\n    padding: 3px 12px;\n    height: 25px;\n}\n\ntextarea.form-control {\n    height: auto;\n}\n\nform .btn {\n    font-size: 12px;\n    padding: 3px 12px;\n}\n\nform .form-group {\n    margin-bottom:5px;\n}\n\nform select[multiple], select[size] {\n    height: auto;\n}\n\n#selector-graph .node circle {\n\tcursor: pointer;\n\tfill: #fff;\n\tstroke: steelblue;\n\tstroke-width: 1px;\n}\n\n#selector-graph .node text {\n\tfont-size: 11px;\n}\n\n#selector-graph path.link {\n\tfill: none;\n\tstroke: #ccc;\n\tstroke-width: 1px;\n}\n\n.data-preview-modal .modal-dialog {\n\twidth:auto;\n}\n\n.data-preview-modal .modal-body {\n\toverflow-y:scroll;\n}\n\n.data-preview-modal tbody tr {\n\tcursor: initial;\n}\n\n/* 加载中效果 */\n.loader-05 {\n  border: .2em solid transparent;\n  border-top-color: currentcolor;\n  border-radius: 50%;\n  -webkit-animation: 1s loader-05 linear infinite;\n  animation: 1s loader-05 linear infinite;\n  position: relative;\n}"
  },
  {
    "path": "server/static/css/work_iframe-style.css",
    "content": ".start-sel {\n    background-color: #CCF7BE;\n    outline-color: #008000;\n    outline-style: solid;\n    outline-width: 2px;\n}\n\n.end-sel {\n    background-color: #F7CCBE;\n    outline-color: #C70000;\n    outline-style: solid;\n    outline-width: 2px;\n}"
  },
  {
    "path": "server/static/images/github2.css",
    "content": ".markdown-body {\n    font-family: Helvetica, \"Hiragino Sans GB\", \"微软雅黑\", \"Microsoft YaHei UI\", SimSun, SimHei, arial, sans-serif;\n    line-height: 1.6;\n    /*background-color: white;*/\n    margin: 0 auto;\n    padding: 20px 36px;\n}\n/*.markdown-body,*/\n/*.markdown-body p,*/\n/*.markdown-body div {*/\n    /*font-size: 15px;*/\n/*}*/\n\n.markdown-body.mobile {\n    padding: 0;\n}\n\n.markdown-body > *:first-child {\n    margin-top: 0 !important;\n}\n\n.markdown-body > *:last-child {\n    margin-bottom: 0 !important;\n}\n\n.markdown-body a {\n    color: #448aff;\n    text-decoration: none;\n}\n.markdown-body a:hover {\n    text-decoration: underline;\n}\n\n.markdown-body a.absent {\n    color: #cc0000;\n}\n\n.markdown-body a.anchor {\n    display: block;\n    padding-left: 30px;\n    margin-left: -30px;\n    cursor: pointer;\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n}\n\n.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {\n    margin: 20px 0 10px;\n    padding: 0;\n    font-weight: bold;\n    /*-webkit-font-smoothing: antialiased;*/\n    cursor: text;\n    position: relative;\n}\n\n.markdown-body h1:hover a.anchor, .markdown-body h2:hover a.anchor, .markdown-body h3:hover a.anchor, .markdown-body h4:hover a.anchor, .markdown-body h5:hover a.anchor, .markdown-body h6:hover a.anchor {\n    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center;\n    text-decoration: none;\n}\n\n/*.markdown-body h1 tt, .markdown-body h1 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h2 tt, .markdown-body h2 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h3 tt, .markdown-body h3 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h4 tt, .markdown-body h4 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h5 tt, .markdown-body h5 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h6 tt, .markdown-body h6 code {*/\n    /*font-size: inherit;*/\n/*}*/\n\n/*.markdown-body h1 {*/\n    /*font-size: 21px;*/\n    /*color: black;*/\n/*}*/\n\n/*.markdown-body h2 {*/\n    /*font-size: 20px;*/\n    /*color: black;*/\n/*}*/\n\n/*.markdown-body h3 {*/\n    /*font-size: 18px;*/\n/*}*/\n\n/*.markdown-body h4 {*/\n    /*font-size: 17px;*/\n/*}*/\n\n/*.markdown-body h5 {*/\n    /*font-size: 15px;*/\n/*}*/\n\n/*.markdown-body h6 {*/\n    /*color: #777777;*/\n    /*font-size: 15px;*/\n    /*margin: 1em 0;*/\n/*}*/\n\n.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol,\n.markdown-body dl, .markdown-body pre {\n    margin: 10px 0;\n    margin: .83rem 0;\n}\n\n.markdown-body li {\n    margin: 5px 0;\n}\n\n.markdown-body li.wiz-md-todo-list-item {\n    list-style: none;\n}\n.markdown-body li.wiz-md-todo-list-item input.wiz-md-todo-checkbox {\n    margin: 0px 5px 0px -1rem;\n    vertical-align:middle;\n}\n\n.markdown-body hr {\n    border: 0;\n    border-bottom: 1px dashed #cfcfcf;\n    margin: 30px 0;\n}\n\n.markdown-body > h2:first-child {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body > h1:first-child {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body > h1:first-child + h2 {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body > h3:first-child, .markdown-body > h4:first-child, .markdown-body > h5:first-child, .markdown-body > h6:first-child {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body a:first-child h1, .markdown-body a:first-child h2, .markdown-body a:first-child h3, .markdown-body a:first-child h4, .markdown-body a:first-child h5, .markdown-body a:first-child h6 {\n    margin-top: 0;\n    padding-top: 0;\n}\n\n.markdown-body h1 p, .markdown-body h2 p, .markdown-body h3 p, .markdown-body h4 p, .markdown-body h5 p, .markdown-body h6 p {\n    margin-top: 0;\n}\n\n.markdown-body li p.first {\n    display: inline-block;\n}\n\n.markdown-body pre li {\n    margin: 0;\n}\n\n.markdown-body ul, .markdown-body ol {\n    padding-left: 34px;\n    padding-left: 2.13rem;\n}\n.markdown-body ul p, .markdown-body ol p{\n    margin: 0;\n}\n\n.markdown-body ul :first-child, .markdown-body ol :first-child {\n    margin-top: 0;\n}\n\n.markdown-body dl {\n    padding: 0;\n}\n\n.markdown-body dl dt {\n    font-size: 10pt;\n    font-size: 0.83rem;\n    font-weight: bold;\n    font-style: italic;\n    padding: 0;\n    margin: 8px 0 5px;\n}\n\n.markdown-body dl dt:first-child {\n    padding: 0;\n}\n\n.markdown-body dl dt > :first-child {\n    margin-top: 0;\n}\n\n.markdown-body dl dt > :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body dl dd {\n    margin: 0 0 8px;\n    padding: 0 15px;\n}\n\n.markdown-body dl dd > :first-child {\n    margin-top: 0;\n}\n\n.markdown-body dl dd > :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body blockquote {\n    border-left: 4px solid #dddddd;\n    padding: 0 12px;\n    color: #aaa;\n}\n\n.markdown-body blockquote > :first-child {\n    margin-top: 0;\n}\n\n.markdown-body blockquote > :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body table {\n    padding: 0;\n    border-collapse: collapse;\n}\n\n.markdown-body table tr {\n    border-top: 1px solid #cccccc;\n    background-color: white;\n    margin: 0;\n    padding: 0;\n}\n\n.markdown-body table tr:nth-child(2n) {\n    background-color: #f8f8f8;\n}\n\n.markdown-body table tr th {\n    font-size: 10pt;\n    font-size: 0.83rem;\n    font-weight: bold;\n    border: 1px solid #cccccc;\n    margin: 0;\n    padding: 6px 13px;\n}\n\n.markdown-body table tr td {\n    border: 1px solid #cccccc;\n    margin: 0;\n    padding: 6px 13px;\n    font-size: 10pt;\n    font-size: 0.83rem;\n}\n\n.markdown-body table tr th :first-child, .markdown-body table tr td :first-child {\n    margin-top: 0;\n}\n\n.markdown-body table tr th :last-child, .markdown-body table tr td :last-child {\n    margin-bottom: 0;\n}\n\n.markdown-body img {\n    max-width: 100%;\n}\n\n.markdown-body .footnote {\n    vertical-align: top;\n    position: relative;\n    top: -0.5em;\n    font-size: 9pt;\n    font-size: .75rem\n}\n\n.markdown-body span.frame {\n    display: block;\n    overflow: hidden;\n}\n\n.markdown-body span.frame > span {\n    border: 1px solid #dddddd;\n    display: block;\n    float: left;\n    overflow: hidden;\n    margin: 13px 0 0;\n    padding: 7px;\n    width: auto;\n}\n\n.markdown-body span.frame span img {\n    display: block;\n    float: left;\n}\n\n.markdown-body span.frame span span {\n    clear: both;\n    color: #333333;\n    display: block;\n    padding: 5px 0 0;\n}\n\n.markdown-body span.align-center {\n    display: block;\n    overflow: hidden;\n    clear: both;\n}\n\n.markdown-body span.align-center > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px auto 0;\n    text-align: center;\n}\n\n.markdown-body span.align-center span img {\n    margin: 0 auto;\n    text-align: center;\n}\n\n.markdown-body span.align-right {\n    display: block;\n    overflow: hidden;\n    clear: both;\n}\n\n.markdown-body span.align-right > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px 0 0;\n    text-align: right;\n}\n\n.markdown-body span.align-right span img {\n    margin: 0;\n    text-align: right;\n}\n\n.markdown-body span.float-left {\n    display: block;\n    margin-right: 13px;\n    overflow: hidden;\n    float: left;\n}\n\n.markdown-body span.float-left span {\n    margin: 13px 0 0;\n}\n\n.markdown-body span.float-right {\n    display: block;\n    margin-left: 13px;\n    overflow: hidden;\n    float: right;\n}\n\n.markdown-body span.float-right > span {\n    display: block;\n    overflow: hidden;\n    margin: 13px auto 0;\n    text-align: right;\n}\n\n.markdown-body code, .markdown-body tt {\n    margin: 0 2px;\n    padding: 2px 4px;\n    white-space: pre-wrap;\n    color: #c7254e;\n    background-color: #f9f2f4;\n    border-radius: 4px;\n}\n\n.markdown-body pre code {\n    margin: 0;\n    padding: 0;\n    word-wrap: break-word;\n    max-width: 100%;\n    border: none;\n    background: transparent;\n    color: #666;\n}\n\n.markdown-body pre {\n    background-color: #f8f8f8;\n    border: 1px solid #cccccc;\n    font-size: 10pt;\n    font-size: 0.83rem;\n    line-height: 14pt;\n    line-height: 1.17rem;\n    overflow: auto;\n    padding: 6px 10px;\n    border-radius: 3px;\n}\n\n.markdown-body .CodeMirror pre {\n    background-color: transparent;\n    border: 0px;\n    font-size: inherit;\n    line-height: inherit;\n    overflow: initial;\n    padding: 0 4px;\n    border-radius: initial;\n    margin: 0;\n}\n\n.markdown-body pre code, .markdown-body pre tt {\n    background-color: transparent;\n    border: none;\n}\n\n@media screen {\n    .markdown-body pre, .markdown-body code {\n        word-wrap: break-word;\n    }\n}\n\n@media print {\n    .markdown-body table, .markdown-body pre {\n        page-break-inside: avoid;\n    }\n\n    pre {\n        word-wrap: break-word;\n    }\n}\n\n/*wiz code highlight*/\n.markdown-body pre, .markdown-body code {\n    font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n}\n\n.markdown-body .pln {\n    color: #48484C;\n}\n\n.markdown-body .str {\n    color: #DD1144;\n}\n\n.markdown-body .kwd {\n    color: #1E347B;\n}\n\n.markdown-body .com {\n    color: #93A1A1;\n}\n\n.markdown-body .typ {\n    color: teal;\n}\n\n.markdown-body .lit {\n    color: #195F91;\n}\n\n.markdown-body .pun {\n    color: #93A1A1;\n}\n\n.markdown-body .opn {\n    color: #93A1A1;\n}\n\n.markdown-body .clo {\n    color: #93A1A1;\n}\n\n.markdown-body .tag {\n    color: #008;\n}\n\n.markdown-body .atn {\n    color: teal;\n}\n\n.markdown-body .atv {\n    color: #DD1144;\n}\n\n.markdown-body .dec {\n    color: teal;\n}\n\n.markdown-body .var {\n    color: teal;\n}\n\n.markdown-body .fun {\n    color: #DC322F;\n}\n\n/* Put a border around prettyprinted code snippets. */\n/*.markdown-body pre.prettyprint {*/\n    /*background-color: #F7F7F9;*/\n    /*padding: 0;*/\n    /*border: 1px solid #E1E1E8;*/\n/*}*/\n\n/*.markdown-body pre.prettyprint.linenums {*/\n    /*overflow: auto;*/\n    /*-webkit-overflow-scrolling: touch;*/\n/*}*/\n\n/*!* Specify class=linenums on a pre to get line numbering *!*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums {*/\n    /*box-shadow: 40px 0 0 #FBFBFC inset, 41px 0 0 #ECECF0 inset;*/\n    /*padding: 10px 10px 10px 40px !important;*/\n    /*color: #1E347B;*/\n    /*margin-top: 0;*/\n    /*margin-bottom: 0;*/\n/*}*/\n\n/*.markdown-body pre.prettyprint.linenums ol.linenums li {*/\n    /*color: #BEBEC5;*/\n    /*line-height: 18px;*/\n    /*padding-left: 12px !important;*/\n/*}*/\n\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L0,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L1,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L2,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L3,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L4,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L5,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L6,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L7,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L8,*/\n/*.markdown-body pre.prettyprint.linenums ol.linenums li.L9 {*/\n    /*list-style-type: decimal !important;*/\n/*}*/\n\n\n@media screen and (max-width: 660px) {\n    .markdown-body {\n        padding: 20px 18px;\n    }\n}\n\n\n@media only screen and (-webkit-max-device-width: 1024px),\nonly screen and (-o-max-device-width: 1024px),\nonly screen and (max-device-width: 1024px),\nonly screen and (-webkit-min-device-pixel-ratio: 3),\nonly screen and (-o-min-device-pixel-ratio: 3),\nonly screen and (min-device-pixel-ratio: 3) {\n    .markdown-body {\n        padding: 12px 15px;\n        /*color: #353c47;*/\n    }\n\n    /*.markdown-body,*/\n    /*.markdown-body p,*/\n    /*.markdown-body div {*/\n        /*font-size: 17px;*/\n        /*line-height: 1.7;*/\n    /*}*/\n\n    /*.markdown-body h1 {*/\n        /*font-size: 34px;*/\n    /*}*/\n\n    /*.markdown-body h2 {*/\n        /*font-size: 30px;*/\n    /*}*/\n\n    /*.markdown-body h3 {*/\n        /*font-size: 26px;*/\n    /*}*/\n\n    /*.markdown-body h4 {*/\n        /*font-size: 22px;*/\n    /*}*/\n\n    /*.markdown-body h5 {*/\n        /*font-size: 18px;*/\n    /*}*/\n\n    /*.markdown-body h6 {*/\n        /*color: inherit;*/\n    /*}*/\n\n    .markdown-body ul, .markdown-body ol {\n        padding-left: 40px;\n    }\n\n    .markdown-body blockquote {\n        /*border-left: 4px solid #c8d4e8;*/\n        padding: 0 15px;\n        /*color: #b3c2dd;*/\n    }\n}\n\n/*评论页面修正*/\n.comment-list-item .markdown-body {\n    padding: 0;\n    margin: 1em .5em 1em 0;\n}\n/* 修正 CodeMirror & table */\n.markdown-body .wiz-code-container,\n.markdown-body .wiz-table-body {\n    padding: 0;\n}"
  },
  {
    "path": "server/static/images/wizToc.css",
    "content": "\n.wiz_toc_layer {\n    background: #F9F9F5;\n    padding: 20px 25px;\n    word-break: break-word;\n}\n\n.wiz_toc {\n    text-decoration: none;\n    display: inline-block;\n    line-height: 27px;\n}\n.wiz_toc:hover{\n    text-decoration: underline;\n}\n.wiz_toc.h1 {\n    margin-left: 0;\n}\n.wiz_toc.h2 {\n    margin-left: 20px;\n}\n.wiz_toc.h3 {\n    margin-left: 40px;\n}\n.wiz_toc.h4 {\n    margin-left: 60px;\n}\n.wiz_toc.h5 {\n    margin-left: 80px;\n}\n.wiz_toc.h6 {\n    margin-left: 100px;\n}\n"
  },
  {
    "path": "server/static/js/config.js",
    "content": "/**\n * Created by Administrator on 2017/12/6.\n */\n\n// 全局js\n$(document).ready(function (){\n    // 显示/隐藏 form表单\n    $('#mode').change(function (){\n        if ($('#mode').val() == 'post'){\n            $('#form').children('a').css('visibility', 'visible');\n        } else {\n            $('#form').children('a').css('visibility', 'hidden');\n        }\n    });\n});\n\n// 显示header表单\nfunction selectHeader(){\n    $('#form-table').css('display', 'none');\n    $('#cookie-table').css('display', 'none');\n    $('#header-table').css('display', 'inline');\n    $('#header').addClass('active').siblings(\"li\").removeClass('active');\n}\n\n// 显示cookie表单\nfunction selectCookie(){\n    $('#form-table').css('display', 'none');\n    $('#header-table').css('display', 'none');\n    $('#cookie-table').css('display', 'inline');\n    $('#cookie').addClass('active').siblings(\"li\").removeClass('active');\n}\n\n// 显示form表单\nfunction selectForm(){\n    $('#header-table').css('display', 'none');\n    $('#cookie-table').css('display', 'none');\n    $('#form-table').css('display', 'inline');\n    $('#form').addClass('active').siblings(\"li\").removeClass('active');\n}\n\n// header表格添加行\nfunction addHeaderRow(){\n    // 获取行数\n    var tr_len = $('#table_header tbody').find(\"tr\").length;\n    // 生成新行\n    var trhtml = '<tr id=\"header_' + (tr_len + 1) + '\"><td><input type=\"text\" class=\"form-control\" placeholder=\"New key\"></td><td><input type=\"text\" class=\"form-control\" placeholder=\"New Value\"></td><!-- 删除参数 --><td><button type=\"button\" class=\"btn btn-default\" onclick=\"delHeaderRow(' + (tr_len + 1) + ')\"><span class=\"glyphicon glyphicon-trash\"></span></button></td></tr>';\n    // 添加\n    $('#table_header').append(trhtml);\n}\n\n// Cookie表格添加行\nfunction addCookieRow(){\n    // 获取行数\n    var tr_len = $('#table_cookie tbody').find(\"tr\").length;\n    // 生成新行\n    var trhtml = '<tr id=\"cookie_' + (tr_len + 1) + '\"><td><input type=\"text\" class=\"form-control\" placeholder=\"New key\"></td><td><input type=\"text\" class=\"form-control\" placeholder=\"New Value\"></td><!-- 删除参数 --><td><button type=\"button\" class=\"btn btn-default\" onclick=\"delCookieRow(' + (tr_len + 1) + ')\"><span class=\"glyphicon glyphicon-trash\"></span></button></td></tr>';\n    // 添加\n    $('#table_cookie').append(trhtml);\n}\n\n// form表格添加行\nfunction addFormRow(){\n    // 获取行数\n    var tr_len = $('#table_form tbody').find(\"tr\").length;\n    // 生成新行\n    var trhtml = '<tr id=\"form_' + (tr_len + 1) + '\"><td><input type=\"text\" class=\"form-control\" placeholder=\"New key\"></td><td><input type=\"text\" class=\"form-control\" placeholder=\"New Value\"></td><!-- 删除参数 --><td><button type=\"button\" class=\"btn btn-default\" onclick=\"delFormRow(' + (tr_len + 1) + ')\"><span class=\"glyphicon glyphicon-trash\"></span></button></td></tr>';\n    // 添加\n    $('#table_form').append(trhtml);\n}\n\n// 删除header表格行\nfunction delHeaderRow(rowIndex){\n    $('#table_header tbody #header_' + rowIndex).remove();\n}\n\n// 删除cookie表格行\nfunction delCookieRow(rowIndex){\n    $('#table_cookie tbody #cookie_' + rowIndex).remove();\n}\n\n// 删除form表格行\nfunction delFormRow(rowIndex){\n    $('#table_form tbody #form_' + rowIndex).remove();\n}\n\n// 验证url\nfunction verifyURL() {\n    // url\n    var url = $('#url').val();\n    var re = /(https?|ftp|file):\\/\\/[-A-Za-z0-9+&@#\\/%?=~_|!:,.;]+[-A-Za-z0-9+&@#\\/%=~_|]/;\n    if (re.test(url)) {\n        return true;\n    } else {\n        $('#url').css('border-color', '#F66495');\n        $('#url_warn').css('display', 'block');\n        // 样式事件\n        $('#url').change(function () {\n            $(this).css('border-color', '#FFF');\n            $('#url_warn').css('display', 'none');\n        });\n        return false;\n    }\n}\n\n// 获取数据\nfunction get_data() {\n    var data = {};\n    // 配置名称\n    if (!$('#conf_name').val()){\n        $('#conf_name').css('border-color', '#F66495');\n        $('#name_warn').css('display', 'block');\n        $('#conf_name').change(function () {\n            $(this).css('border-color', '#FFF');\n            $('#name_warn').css('display', 'none');\n        });\n        return false;\n    }else{\n        if ($('#conf_name').val() === 'config'){\n            $('#conf_name').css('border-color', '#F66495');\n            $('#name_warn').html('配置名称不能为config').css('display', 'block');\n            $('#conf_name').change(function () {\n                $(this).css('border-color', '#FFF');\n                $('#name_warn').css('display', 'none');\n            });\n            return false;\n        }\n        data['name'] = $('#conf_name').val();\n    }\n    // url\n    if (!verifyURL()){\n        return false;\n    }else{\n        data['url'] = $('#url').val();\n    }\n    // 请求方式\n    data['method'] = $('#mode').val();\n    // 代理ip\n    if ($('#proxy').is(':checked')){\n        data['proxy'] = 1;\n    }else{\n        data['proxy'] = 0;\n    }\n    // 动态加载JS\n    if ($('#dynamic').is(':checked')){\n        data['dynamic'] = 1;\n    }else{\n        data['dynamic'] = 0;\n    }\n    // header\n    var header_arr = {};\n    var head_warn = 0;\n    var header_items = $('#table_header tbody tr');\n    for (var i = 0; i < header_items.length; i++) {\n        if (i == 0 && header_items.eq(i).find('input').eq(0).val() != '' && header_items.eq(i).find('input').eq(1).val() != ''){\n            header_arr[header_items.eq(i).find('input').eq(0).val()] = header_items.eq(i).find('input').eq(1).val();\n        }\n        if (i > 0){\n            if (header_items.eq(i).find('input').eq(0).val() == ''){\n                header_items.eq(i).find('input').eq(0).css('border-color', '#F66495');\n                head_warn = 1;\n            }\n            if (header_items.eq(i).find('input').eq(1).val() == ''){\n                header_items.eq(i).find('input').eq(1).css('border-color', '#F66495');\n                head_warn = 1;\n            }\n            if (head_warn == 1){\n                // 警告框\n                $('#head_warn').fadeIn(900);\n                setTimeout(function (){\n                    $('#head_warn').fadeOut(900);\n                }, 2500);\n                // 样式事件\n                $(\"#table_header tbody tr input\").change(function(){\n                    $(this).css('border-color', '#FFF');\n                });\n                return false;\n            // 不存在空值时\n            } else {\n                header_arr[header_items.eq(i).find('input').eq(0).val()] = header_items.eq(i).find('input').eq(1).val();\n            }\n        } else {\n            data['header'] = '';\n        }\n        data['header'] = header_arr;\n    }\n\n    // cookie\n    var cookie_arr = {};\n    var cookie_warn = 0;\n    var cookie_items = $('#table_cookie tbody tr');\n    for (var i = 0; i < cookie_items.length; i++) {\n        if (i == 0 && cookie_items.eq(i).find('input').eq(0).val() != '' && cookie_items.eq(i).find('input').eq(1).val() != ''){\n            cookie_arr[cookie_items.eq(i).find('input').eq(0).val()] = cookie_items.eq(i).find('input').eq(1).val();\n        }\n        if (i > 0){\n            if (cookie_items.eq(i).find('input').eq(0).val() == ''){\n                cookie_items.eq(i).find('input').eq(0).css('border-color', '#F66495');\n                cookie_warn = 1;\n            }\n            if (cookie_items.eq(i).find('input').eq(1).val() == ''){\n                cookie_items.eq(i).find('input').eq(1).css('border-color', '#F66495');\n                cookie_warn = 1;\n            }\n            if (cookie_warn == 1){\n                // 警告框\n                $('#cookie_warn').fadeIn(900);\n                setTimeout(function (){\n                    $('#cookie_warn').fadeOut(900);\n                }, 2500);\n                // 样式事件\n                $(\"#table_cookie tbody tr input\").change(function(){\n                    $(this).css('border-color', '#FFF');\n                });\n                return false;\n            // 不存在空值时\n            } else {\n                cookie_arr[cookie_items.eq(i).find('input').eq(0).val()] = cookie_items.eq(i).find('input').eq(1).val();\n            }\n        } else {\n            data['cookie'] = '';\n        }\n        data['cookie'] = cookie_arr;\n    }\n\n    // form\n    var form_arr = {};\n    var form_warn = 0;\n    var form_items = $('#table_form tbody tr');\n    for (var i = 0; i < form_items.length; i++) {\n        if (i == 0 && form_items.eq(i).find('input').eq(0).val() != '' && form_items.eq(i).find('input').eq(1).val() != ''){\n            form_arr[form_items.eq(i).find('input').eq(0).val()] = form_items.eq(i).find('input').eq(1).val();\n        }\n        if (i > 0){\n            if (form_items.eq(i).find('input').eq(0).val() == ''){\n                form_items.eq(i).find('input').eq(0).css('border-color', '#F66495');\n                form_warn = 1;\n            }\n            if (form_items.eq(i).find('input').eq(1).val() == ''){\n                form_items.eq(i).find('input').eq(1).css('border-color', '#F66495');\n                form_warn = 1;\n            }\n            if (form_warn == 1){\n                // 警告框\n                $('#form_warn').fadeIn(900);\n                setTimeout(function (){\n                    $('#form_warn').fadeOut(900);\n                }, 2500);\n                // 样式事件\n                $(\"#table_form tbody tr input\").change(function(){\n                    $(this).css('border-color', '#FFF');\n                });\n            // 不存在空值时\n            } else {\n                form_arr[form_items.eq(i).find('input').eq(0).val()] = form_items.eq(i).find('input').eq(1).val();\n            }\n        } else {\n            data['form'] = ''\n        }\n        data['form'] = form_arr\n    }\n    if (head_warn == 0 && form_warn == 0){\n        // json格式\n        // data = JSON.stringify(data);\n        return data\n    } else {\n        return false\n    }\n}\n\n// 保存配置表单\nfunction saveConfigForm(){\n    // 获取数据\n    var data = get_data();\n    if (data){\n        $('#modal_name').text(data.name);\n        $('#modal_method').text(data.method);\n        $('#modal_url').text(data.url);\n        $('#model_proxy').text(data.proxy);\n        $('#model_dynamic').text(data.dynamic);\n        $('#modal_header').text(JSON.stringify(data.header));\n        $('#modal_cookie').text(JSON.stringify(data.cookie));\n        $('#modal_form').text(JSON.stringify(data.form));\n        $('#myModal').modal('show');\n    }\n}\n\n// TODO 保存配置\nfunction saveConfig(){\n    var data = {};\n    data['name'] = $('#modal_name').text();\n    data['first_url'] = $('#modal_url').text();\n    data['method'] = $('#modal_method').text();\n    data['headers'] = $('#modal_header').text();\n    data['forms'] = $('#modal_form').text();\n    data['cookies'] = $('#modal_cookie').text();\n    data['ip_proxy'] = $(\"#model_proxy\").text();\n    data['dynamic'] = $(\"#model_dynamic\").text();\n    data['created_at'] = parseInt(new Date().getTime() / 1000);\n    data['updated_at'] = data['created_at'];\n    return data;\n    // ajax提交\n    // getDataset(data);\n}\n\n// TODO 提交配置\nfunction getDataset(data) {\n    $.ajax({\n        url: window.location.origin + '/config/detail/',\n        method: 'post',\n        dataType: 'json',\n        async: true,\n        data: data,\n        success: function(response){\n            // 隐藏模态框\n            $('#myModal').modal('hide');\n            if (response.status === 0){\n                $('#myModalLabel').html('重复');\n                $('#modal_model_body').html('该配置名称已存在, 请修改！');\n                $('#modal_model').modal('show');\n            }else{\n                $('#myModalLabel').html('成功');\n                $('#modal_model_body').html('该配置已保存');\n                $('#modal_model').modal('show');\n                public_conf = data;\n                public_conf.id = response.id;\n            }\n        },\n        error: function () {\n            $('#myModalLabel').html('保存失败');\n            $('#modal_model_body').html(\"原因未知.\");\n            $('#modal_model').modal('show');\n        }\n    })\n}\n\n// 发送请求\nfunction sendReqData(){\n    var data = get_data();\n    var send = function(url, data) {\n        //创建form表单\n        var temp_form = document.createElement(\"form\");\n        temp_form.action = url;\n        //如需打开新窗口，form的target属性要设置为'_blank'\n        temp_form.target = \"_self\";\n        temp_form.method = \"post\";\n        temp_form.style.display = \"none\";\n        //添加参数\n        for (var i in data) {\n            var opt = document.createElement(\"textarea\");\n            opt.name = i;\n            opt.value = JSON.stringify(data[i]);\n            temp_form.appendChild(opt);\n        }\n        document.body.appendChild(temp_form);\n        //提交数据\n        temp_form.submit();\n    };\n    if (data){\n        url = window.location.origin + '/add/work';\n        send(url, data);\n    }else{\n        return false;\n    }\n}\n"
  },
  {
    "path": "server/static/js/data.js",
    "content": "/**\n * Created by Administrator on 2018/1/8.\n */\n\nvar initColumns = function (collection_name) {\n    $.ajax({\n        url: '/data/columns',\n        type : \"get\",\n        async: true,\n        data: {\"collection_name\": collection_name}\n    }).done(function (data){\n        var oTable = TableInit(collection_name, data);\n        oTable.destroy();\n        oTable.Init();\n    }).fail(function (data){\n    });\n};\n\n\nvar TableInit = function (collection_name, columns) {\n    var oTableInit = {};\n    // 销毁\n    oTableInit.destroy = function (){\n        $(\"#collection_data\").bootstrapTable('destroy');\n    };\n    //初始化Table\n    oTableInit.Init = function () {\n        $('#collection_data').bootstrapTable({\n            url: '/data/collection',            //请求后台的URL（*）\n            method: 'get',                      //请求方式（*）\n            toolbar: '#toolbar',                //工具按钮用哪个容器\n            striped: true,                      //是否显示行间隔色\n            cache: false,                       //是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）\n            pagination: true,                   //是否显示分页（*）\n            sortable: false,                    //是否启用排序\n            sortOrder: \"asc\",                   //排序方式\n            queryParams: oTableInit.queryParams,//传递参数（*）\n            sidePagination: \"client\",           //分页方式：client客户端分页，server服务端分页（*）\n            pageNumber:1,                       //初始化加载第一页，默认第一页\n            pageSize: 20,                       //每页的记录行数（*）\n            pageList: [10, 20, 30, 50],      //可供选择的每页的行数（*）\n            search: true,                       //是否显示表格搜索，此搜索是客户端搜索，不会进服务端，所以，个人感觉意义不大\n            toolbarAlign: 'right',              //toolbar位置\n            showColumns: true,                  //是否显示所有的列\n            showRefresh: true,                  //是否显示刷新按钮\n            minimumCountColumns: 2,             //最少允许的列数\n            clickToSelect: true,                //是否启用点击选中行\n            // uniqueId: \"ID\",                  //每一行的唯一标识，一般为主键列\n            showToggle:true,                    //是否显示详细视图和列表视图的切换按钮\n            cardView: false,                    //是否显示详细视图\n            detailView: false,                  //是否显示父子表\n            showExport: true,                   //是否显示导出\n            exportDataType: 'all',              //basic', 'all', 'selected'.\n            columns: columns\n        });\n    };\n\n    //得到查询的参数\n    oTableInit.queryParams = function (params) {\n        var temp = {\n            collection_name: collection_name,\n            // limit: params.limit,   //页面大小\n            // offset: params.offset,  //页码\n        };\n        return temp;\n    };\n    return oTableInit;\n};"
  },
  {
    "path": "server/static/js/read.js",
    "content": "/**\n * Created by Administrator on 2018/1/8.\n */\n\nvar initColumns = function (name) {\n    $.ajax({\n        url: '/read/collection',\n        type : \"get\",\n        async: true,\n        data: {\"name\": name}\n    }).done(function (data){\n        // 表格填充\n        $('#start-task').data(\"name\", data.data);\n        $('#delete-task').data(\"name\", data.data);\n        var oFormInit = FormInit(data.data.config);\n        oFormInit.Init();\n        oFormInit.Fill();\n        var oTableInit = TableInit(data.data.selectedField.selectors);\n        oTableInit.destroy();\n        oTableInit.Init();\n        // 按钮注册\n        buttonInit();\n    }).fail(function (data){\n    });\n};\n// 表单函数\nvar FormInit = function (config){\n    var oFormInit = {};\n    // 表单初始化\n    oFormInit.Init = function (){\n        $('#config_form').html('');\n    };\n    // 赋值\n    oFormInit.Fill = function (){\n        $('#config_form').html(`<table class=\"table table-bordered\">\n            <thead>\n                <tr><th>参数名</th><th>参数值</th></tr>\n            </thead>\n            <tbody>\n                <tr><td>配置名称</td><td>${config.name}</td></tr>\n                <tr><td>请求方式</td><td>${config.method}</td></tr>\n                <tr><td>url</td><td>${config.url}</td></tr>\n                <tr><td>请求头</td><td>${JSON.stringify(config.header)}</td></tr>\n                <tr><td>cookie</td><td>${JSON.stringify(config.cookie)}</td></tr>\n                <tr><td>post表单</td><td>${JSON.stringify(config.form)}</td></tr>\n                <tr><td>动态解析</td><td>${config.dunamic}</td></tr>\n                <tr><td>ip代理</td><td>${config.proxy}</td></tr>\n            </tbody>\n        </table>`);\n    };\n    return oFormInit;\n};\n\n// 选择器函数\nvar TableInit = function (selectedField) {\n    var oTableInit = {};\n    // 销毁\n    oTableInit.destroy = function (){\n        $('#collection_data').bootstrapTable('destroy');\n    };\n    //初始化Table\n    oTableInit.Init = function () {\n        // id对应\n        var idList = {};\n        selectedField.map((i, j) => idList[i['id']] = j);\n        var result = selectedField.map((i, j) => {\n            var obj = {};\n            obj = i;\n            obj['name'] = i['id'];\n            obj['id'] = idList[i['id']];\n            if (obj['parentSelectors'][0] === '_root'){\n                obj['parentId'] = null;\n            } else {\n                obj['parentId'] = idList[i['parentSelectors'][0]];\n            }\n            delete obj['parentSelectors'];\n            return obj;\n        });\n\n        $('#collection_data').bootstrapTable({\n            class: 'table table-hover table-bordered',\n            data: result,\n            pagination: false,\n            treeView: true,\n            treeId: \"id\",\n            treeField: \"name\",\n            columns: [{\n                field: 'name',\n                title: '选择器名称'\n            },{\n                field: 'selector',\n                title: '选择器',\n            },{\n                field: 'type',\n                title: '选择器类型',\n            },{\n                field: 'multiple',\n                title: '多元素'\n            },{\n                field: 'regex',\n                title: '正则表达式'\n            }]\n        });\n        $(\"#expandAllTree\").on('click',function(){\n            $('#tree_table').bootstrapTable(\"expandAllTree\")\n        });\n        $(\"#collapseAllTree\").on('click',function(){\n            $('#tree_table').bootstrapTable(\"collapseAllTree\")\n        });\n    };\n    return oTableInit;\n};\n\n// 按钮初始化函数\nvar buttonInit = function (){\n    $('#start-task').bind('click', function (){\n        var data = $(this).data();\n        var config = data.name.config;\n        var selectedField = data.name.selectedField;\n        var request = {\n            scrapeSitemap: true,\n            requestInterval: data.name.requestInterval,\n            pageLoadDelay: data.name.pageLoadDelay,\n            config: config,\n            selectedField: selectedField\n        };\n        $.ajax({\n            url: \"/crawler/start\",\n            type : \"post\",\n            async: true,\n            data: JSON.stringify(request)\n        }).done(function (data){\n            if (data.state){\n                $('#button-group').hide();\n                $(\".scraping-in-progress\").removeClass(\"hide\");\n            } else {\n                $('#button-group').hide();\n                $(\".scraping-in-progress\").html(data.message).removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n            }\n        }).fail(function (){\n            $('#button-group').hide();\n            $(\".scraping-in-progress\").html('发送数据失败, 请检查参数.').removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n        });\n    });\n    $('#delete-task').bind('click', function (){\n        var data = $(this).data();\n        var config = data.name.config;\n        var request = {\n            name: config.name\n        };\n        $.ajax({\n            url: \"/data/delete\",\n            type : \"get\",\n            async: true,\n            data: request\n        }).done(function (data){\n            if (data.state){\n                $('#button-group').hide();\n                $(\".scraping-in-progress\").html('删除配置成功.').removeClass(\"hide\");\n                setTimeout(function (){\n                    location.reload();\n                }, 1500);\n            } else {\n                $('#button-group').hide();\n                $(\".scraping-in-progress\").html(data.message).removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n            }\n        }).fail(function (){\n            $('#button-group').hide();\n            $(\".scraping-in-progress\").html('发送数据失败, 请检查参数.').removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n        });\n    });\n};"
  },
  {
    "path": "server/static/js/test.js",
    "content": "/**\n * Created by Administrator on 2017/12/8.\n */\n$(document).ready(function(){\n    // 加载item样式\n    item_style();\n    // 初始化iframe宽度\n    $('iframe').css({\"width\": $('iframe').parent().width() - 30, \"height\": \"600px\"});\n    // 浮动显示框\n    float_frame()\n});\n// item栏样式\nfunction item_style () {\n    // 更改透明度\n    $(\".sidebar\").on(\"mouseover\",function(){\n        $(\".closeMenu > span\").css({\n            opacity:1\n        });\n    });\n    $(\".sidebar\").on(\"mouseleave\",function(){\n        $(\".closeMenu > span\").css({\n            opacity:0.5\n        });\n    });\n    // 获取item宽度\n    var moveLeft = $(\".span2\").width();\n    var moveRight = $(\"#list_left\").width();\n    // 设置内容块初始位置\n    $(\".main\").css({'margin-left': moveLeft, 'margin-right': moveRight});\n    // 显示/隐藏item项目\n    var isShow = true;\n    $(\".closeMenu span\").click(function(){\n        // 按钮显示/隐藏\n        $(this).hide().siblings().show();\n        if(isShow){\n            $(\"#list_left\").animate({\n                'margin-right': -(moveRight-30)//30 刚好显示icon图标\n            }, 200, \"linear\",function(){\n                isShow = false;\n                $(\".closeMenu > span\").css({\n                    opacity: 1\n                });\n            });\n            $(\".main\").animate({'margin-left': moveLeft, 'margin-right': 30}, \"linear\");\n            setTimeout(function(){\n                // iframe滑动\n                $('iframe').animate({\"width\": $('iframe').parent().width() - 30, \"height\": \"600px\"});\n                // 显示框滑动\n                $('.float-frame').animate({'width': $('.main').width() + $('.span2').width()});\n                $('.show-element').animate({'float': 'right'});\n            }, 500);\n        }else{\n            $(\"#list_left\").animate({\n                'margin-right': 0\n            }, 200, \"linear\",function(){\n                isShow = true;\n            });\n            $(\".main\").animate({'margin-left': moveLeft, 'margin-right': moveRight},\"linear\");\n            setTimeout(function(){\n                // iframe滑动\n                $('iframe').animate({\"width\": $('iframe').parent().width() - 30, \"height\": \"600px\"});\n                // 显示框滑动\n                $('.float-frame').animate({'width': $('.main').width() + $('.span2').width()});\n                $('.show-element').animate({'float': 'right'});\n            }, 500);\n        }\n    });\n}\n// 请求翻页\nfunction getItemList(index, successCB) {\n    $.ajax({\n        url: window.location.origin + '/items/list/',\n        type: 'get',\n        dataType: 'json',\n        data: {'index': index, 'count': 5},\n        success: function(res) {\n            successCB(res);\n        },\n        error: function (e) {\n            console.log('获取配置列表失败, 原因未知');\n        }\n    });\n}\n// 成功请求\nfunction getItemListSuccess(res) {\n    // 清空数据\n    $('.item-style').html('');\n    // 返回方法\n    $('.item-style').append('<div class=\"return-button\">' +\n        '<span class=\"glyphicon glyphicon-chevron-left\"> 返回</span></div>');\n    // 绑定事件\n    $('.return-button').on('click', function(){\n        $('.item-style').html('<button type=\"button\" class=\"btn btn-primary btn-lg btn-block\" onclick=\"load_items()\">加载配置</button>' +\n            '<button type=\"button\" class=\"btn btn-primary btn-lg btn-block\" onclick=\"insert_items()\">新建配置</button>');\n        $('.table_total').html('');\n        $('#page').html('');\n    });\n    var text = '';\n    for (var i in res.data){\n        var name = res.data[i].name;\n        var items = JSON.parse(res.data[i].items);\n        text = '<div class=\"panel panel-default\" id=\"item_' + i + '\">'\n                 + '<div class=\"panel-heading\">'\n                 + '<h4 class=\"panel-title\">'\n                 + '<a data-toggle=\"collapse\" data-parent=\"#accordion\" href=\"#collapse' + i + '\">'\n                 + '配置名称: ' + name + '</a></h4></div>'\n                 + '<div id=\"collapse' + i + '\" class=\"panel-collapse collapse\">'\n                 + '<div class=\"panel-body\">'\n                 + '<table class=\"table table-hover\">'\n                 + '<thead><tr><th>字段名</th><th>字段值</th></tr></thead><tbody>';\n        for (var key in items){\n            text += '<tr><td>' + key + '</td><td>' + items[key] + '</td></tr>';\n        }\n        text += '</tbody></table></div>';\n        // 按钮\n        text += '<div class=\"modal-footer\">'\n            + '<button type=\"button\" class=\"btn btn-default btn-sm\" onclick=\"$(\\'#getModal\\').modal(\\'hide\\');\">取消</button>'\n            + '<button type=\"button\" class=\"btn btn-danger btn-sm\" onclick=\"delConf($(\\'#item_' + i +'\\'))\">删除</button>'\n            + '<button type=\"button\" class=\"btn btn-primary btn-sm\" onclick=\"writeConfToWeb($(\\'#conf_list_' + i +'\\'))\">确定</button>'\n            + '</div></div></div>';\n        $('.item-style').append(text);\n    }\n    $('.item-style').append('</div>');\n}\n// 返回列表\n// 分页列表\nfunction get_count() {\n    $.ajax({\n        url: window.location.origin + '/items/count/',\n        type: 'get',\n        dataType: 'json',\n        success: function(res) {\n            $('#page').paging(res.count, 5);\n            // 写入条数\n            $('.table_total').html('共<span id=\"total-num\">' + res.count + '</span>条数据');\n        }\n    });\n    // 分页点击\n    $('#page').delegate('.page_request', 'click', function () {\n        setTimeout(function () {\n            // 获取分页数pageNum\n            index = Number($('#page > span.current').attr('pagenumer'));\n            // 请求\n            getItemList(index, getItemListSuccess);\n        }, 10);\n    });\n}\n// 加载配置\nfunction load_items() {\n    // 请求首页\n    getItemList(1, getItemListSuccess);\n    // 分页列表\n    get_count();\n}\n// 新增配置\nfunction insert_items() {\n    // 清空数据\n    $('.item-style').html('');\n    // 返回方法\n    $('.item-style').append('<div class=\"return-button\">' +\n        '<span class=\"glyphicon glyphicon-chevron-left\"> 返回</span>');\n    // 添加选择, 分页, 详情按钮\n    var btn_text = '<button class=\"btn-custom\" onclick=\"mouse_event()\" id=\"select_attr\">元素选择</button>'\n                 + '<button class=\"btn-custom\">分页选择</button>'\n                 + '<button class=\"btn-custom\">详情选择</button>';\n    $('.item-style').append(btn_text);\n    // 绑定事件\n    $('.return-button').on('click', function(){\n        $('.item-style').html('<button type=\"button\" class=\"btn btn-primary btn-lg btn-block\" onclick=\"load_items()\">加载配置</button>' +\n            '<button type=\"button\" class=\"btn btn-primary btn-lg btn-block\" onclick=\"insert_items()\">新建配置</button>');\n        $('.table_total').html('');\n        $('#page').html('');\n    });\n    // 采集字段表格\n    var sel_table_head = '<table class=\"table table-hover\">'\n        + '    <caption>采集字段表格</caption>'\n        + '    <thead>'\n        + '        <tr>'\n        + '            <th>字段名</th>'\n        + '            <th>css选择器</th>'\n        + '            <th>值</th>'\n        + '            <th>类型</th>'\n        + '        </tr>'\n        + '    </thead>'\n        + '    <tbody>';\n    var sel_table_body = '        <tr>'\n        + '            <td>标题</td>'\n        + '            <td>.item-table > span > attr</td>'\n        + '            <td>runoob.com</td>'\n        + '            <td>'\n        + '                <select class=\"select-form\">'\n        + '                <option>元素集</option>'\n        + '                <option>单元素</option>'\n        + '                <option>列表元素</option>'\n        + '                <option>滚动下拉</option>'\n        + '                <option>点击元素</option>'\n        + '            </select>'\n        + '            </td>'\n        + '            <td><button type=\"button\" class=\"btn-custom\" onclick=\"hehe()\"><span class=\"glyphicon glyphicon-trash\"></span></button></td>'\n        + '        </tr>';\n    var sel_table_tail = '    </tbody>'\n        + '</table>';\n    $('.item-style').append(sel_table_head + sel_table_body + sel_table_tail);\n}\n// 删除配置\nfunction delConf (obj) {\n    var name = $(obj).find('h4 a').text();\n    // 清空模态框\n    $('.fade').html('');\n    // var reg = /\\d+/;\n    // var num = reg.exec(name);\n    // 加载模态框\n    var text = + '<div class=\"modal fade\">'\n             + '<div class=\"modal-dialog\">'\n             + '<div class=\"modal-content\">'\n             + '<div class=\"modal-header\">'\n             + '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>'\n             + '<h4 class=\"modal-title\" id=\"myModalLabel\">删除该配置</h4>'\n             + '</div>'\n             + '<div class=\"modal-body\">' + name + '</div>'\n             + '<div class=\"modal-footer\">'\n             + '<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>'\n             + '<button type=\"button\" class=\"btn btn-primary\" id=\"delete_items\">确定</button>'\n             + '</div></div></div></div>';\n    $('.fade').html(text);\n    // 移除事件\n    $(\"#delete_items\").off('click');\n    // 绑定事件\n    $(\"#delete_items\").on('click', function(){\n        var item_name = ($(this).parent('div').prev().text()).replace(/配置名称: /, '');\n        if (item_name){\n            $.ajax({\n                url: window.location.origin + '/items/delete/',\n                method: 'delete',\n                dataType: 'json',\n                async: true,\n                data: {'name': item_name},\n                success: function(data){\n                    $('.fade').modal('hide');\n                    $('.fade').html('');\n                    if (data.status === 10000){\n                        var text = + '<div class=\"modal fade\">'\n                                     + '<div class=\"modal-dialog\">'\n                                     + '<div class=\"modal-content\">'\n                                     + '<div class=\"modal-header\">'\n                                     + '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>'\n                                     + '<h4 class=\"modal-title\" id=\"myModalLabel\">删除成功</h4>'\n                                     + '</div>'\n                                     + '<div class=\"modal-body\">' + name + ' 已删除</div>'\n                                     + '<div class=\"modal-footer\">'\n                                     + '<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>'\n                                     + '<button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">确定</button>'\n                                     + '</div></div></div></div>';\n                        $('.fade').html(text);\n                        setTimeout( function () {\n                                $('.fade').modal('show');\n                            }, 800\n                        );\n                        // 请求首页\n                        getItemList(1, getItemListSuccess);\n                        // 分页列表\n                        get_count();\n                    }else{\n                        $('.fade').modal('hide');\n                        $('.fade').html('');\n                        var text = + '<div class=\"modal fade\">'\n                                     + '<div class=\"modal-dialog\">'\n                                     + '<div class=\"modal-content\">'\n                                     + '<div class=\"modal-header\">'\n                                     + '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>'\n                                     + '<h4 class=\"modal-title\" id=\"myModalLabel\">删除失败</h4>'\n                                     + '</div>'\n                                     + '<div class=\"modal-body\">' + name + ' 删除失败</div>'\n                                     + '<div class=\"modal-footer\">'\n                                     + '<button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>'\n                                     + '<button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">确定</button>'\n                                     + '</div></div></div></div>';\n                        $('.fade').html(text);\n                        setTimeout( function () {\n                                $('.fade').modal('show');\n                            }, 800\n                        );\n                        // 请求首页\n                        getItemList(1, getItemListSuccess);\n                        // 分页列表\n                        get_count();\n                    }\n                },\n                error: function (e) {\n                }\n            })\n        } else{\n            alert('获取配置名称错误');\n        }\n    });\n    // 显示模态框\n    $('.fade').modal('show');\n}\n// 生成css选择器\nfunction cssSel(obj) {\n    var dom = $(obj).get(0);\n    var path = \"\";\n    for (; dom && dom.nodeType == 1; dom = dom.parentNode) {\n        var index = 1;\n        for (var sib = dom.previousSibling; sib; sib = sib.previousSibling) {\n            if (sib.nodeType == 1 && sib.tagName == dom.tagName){\n                index++;\n            }\n        }\n        var xname =  dom.tagName.toLowerCase();\n        if (dom.id) {\n            xname += \"[@id=\\\"\" + dom.id + \"\\\"]\";\n        } else {\n            if (index > 0)\n            xname += \"[\" + index + \"]\";\n        }\n        path = \"/\" + xname + path;\n    }\n    path = path.replace(\"html[1]/body[1]/\",\"html/body/\");\n    // 开始转换 xpath 为 css path\n    // 转换 // 为 \" \"\n    xpath = path.replace(/\\/\\//g, \" \");\n    // 转换 / 为 >\n    xpath = xpath.replace(/\\//g, \">\");\n    // 转换 [elem] 为 :eq(elem) ： 规则 -1\n    xpath = xpath.replace(/\\[([^@].*?)\\]/ig, function(matchStr,xPathIndex){\n    var cssPathIndex = parseInt(xPathIndex)-1;\n        return \":eq(\" + cssPathIndex + \")\";\n    });\n    // 1.2 版本后需要删除@\n    xpath = xpath.replace(/\\@/g, \"\");\n    // 去掉第一个 >\n    xpath = xpath.substr(1);\n    // 返回jQuery元素\n    return xpath;\n}\n// 移动、点击事件\nfunction mouse_event() {\n    // 左上角弹窗\n    $('.show-element').css('display', 'block');\n    // 鼠标移动事件\n    $('*:not(.select-view)').bind({\n        'mousemove': function (event) {\n            event.stopPropagation();\n            var cssName = cssSel($(this));\n            $(this).addClass('start-sel');\n            // console.log(cssName);\n            $(this).attr('title', cssName);\n        },\n        'mouseout': function (event) {\n            event.stopPropagation();\n            $(this).toggleClass('start-sel');\n        }\n    });\n    // 鼠标点击事件\n    $('*').bind({\n        'mousedown': function(event){\n            // 弹出框\n            event.preventDefault();\n            $('.select-view').css('display', 'block');\n            $('.select-view').unbind('mousemove').unbind('mouseout').removeClass('start-sel');\n            $(\".select-view\").find(\"*\").unbind('mousemove').unbind('mouseout').removeClass('start-sel');\n            // $('.select-view').preventDefault();\n            // 取消默认事件、冒泡\n            // $('.select-view').stopPropagation();\n            event.stopPropagation();\n            $(this).addClass('end-sel');\n        }\n    });\n}\nfunction test() {\n    // 单击打开\n    $('.light.io-cursor-add-CHFG').on('click', function (e) {\n        // console.log(getElementXpath(e.toElement));\n        var tabs = \"\";\n        var ids = \"\";\n        var classs = \"\";\n        var hrefs = \"\";\n        var tabs = $(this).prop(\"tagName\");\n        tabs = tabs.toLowerCase();\n        var ids = $(this).attr(\"id\");\n        var classs = $(this).attr(\"class\");\n        var hrefs = $(this).attr(\"href\");\n        console.log(tabs + ';' + ids + ';' + classs + ';' + hrefs);\n        var content = \"\";\n        // 鼠标点击＋－切换\n        if ($(this).hasClass('io-cursor-add-CHFG')) {\n            $(this).removeClass('io-cursor-add-CHFG').addClass('io-cursor-delete-CHFG');\n            var contents = $(this).prop('outerHTML');//点击获取数据\n        } else {\n            $(this).removeClass('io-cursor-delete-CHFG').addClass('io-cursor-add-CHFG');\n            content = \"\";\n        }\n        //滑动＋点击使选中框\n        if ($(this).hasClass('light')) {\n            $(this).removeClass('light').addClass('light-green');\n        } else {\n            $(this).removeClass('light-green').addClass('light');\n        }\n        return false\n    });\n    $(this).attr()\n}\n// 浮动显示框\nfunction float_frame() {\n    $('#button-position').on('click', function(){\n        // 左侧\n        if($(this).attr('class').indexOf('right') !== -1){\n            $(this).attr('class', 'glyphicon glyphicon-arrow-left button');\n            $('.float-frame').css({'width': $('.main').width() + $('.span2').width()});\n            $('.show-element').css({'float': 'right'});\n        // 右侧\n        }else{\n            $(this).attr('class', 'glyphicon glyphicon-arrow-right button');\n            $('.show-element').css({'float': 'left'});\n        }\n    })\n}"
  },
  {
    "path": "server/static/js/work.js",
    "content": "/**\n * Created by Administrator on 2017/9/14.\n */\n$(function(){\n    \"use strict\";\n    // 下方选择栏样式\n    // select_frame();\n    // frame样式\n    $('iframe').css({\"width\": '100%', \"height\": \"580px\"});\n    // 浮动显示框\n    // float_frame();\n    // 模态框方法\n    // new_modal(jQuery);\n});\n\n// 选择字段\nfunction iframe_mouse_event(){\n    // 禁用按钮\n    $('div.sidebar > button').attr('disabled', 'disabled');\n    window.collect.mouse_event();\n}\n\n// 下方选择栏\nfunction select_frame() {\n    var src_posi_Y = 0, dest_posi_Y = 0, move_Y = 0, is_mouse_down = false, destHeight = 200;\n    $(\".expander\").mousedown(function(e){\n        src_posi_Y = e.pageY;\n        is_mouse_down = true;\n    });\n    $(document).bind(\"click mouseup\",function(e){\n        if(is_mouse_down){\n          is_mouse_down = false;\n        }\n    })\n    .mousemove(function(e){\n        dest_posi_Y = e.pageY;\n        move_Y = src_posi_Y - dest_posi_Y;\n        src_posi_Y = dest_posi_Y;\n        destHeight = $(\".sidebar\").height() + move_Y;\n        if(is_mouse_down){\n            $(\".sidebar\").css(\"height\", destHeight > 30 ? destHeight : 30);\n        }\n    });\n}\n\n// 保存选择\nfunction save_select() {\n    if ($('#select-name').val() != ''){\n        // 列表多选\n        if ($('#multiple').attr('disabled')){\n            // 字段名查重\n            var now_field_name = [];\n            $('#save-sel').find('tr').each(function(){\n                now_field_name.push($(this).find('td:first').text());\n            });\n            if (now_field_name.indexOf($('#select-name').val()) === -1) {\n\n            } else {\n                $('#select-name').css({'border-color': '#F66495'});\n                $('#select-name').attr('data-content', '名称与已有字段重复');\n                $('#select-name').popover('show');\n                $('#select-name').focus(function(){\n                    $('#select-name').popover('hide');\n                });\n                $('#select-name').change(function(){\n                    $('#select-name').css({'border-color': '#FFFFFF'});\n                });\n            }\n        }\n        if ($('#multiple').is(':checked')){\n            return multiple_select();\n        }\n        // 字段名查重\n        var now_field_name = [];\n        $('#save-sel').find('tr').each(function(){\n            now_field_name.push($(this).find('td:first').text());\n        });\n        if (now_field_name.indexOf($('#select-name').val()) === -1) {\n            var sel_table_body = `<tr>\n                    <td>${$('#select-name').val()}</td>\n                    <td>${$('#select-input').val()}</td>\n                    <td>SelectorText</td>\n                    <td>${$('#multiple').is(':checked')}</td>\n                    <td>_root</td>\n                  <td>\n                      <button type=\"button\" class=\"btn btn-info btn-xs\">元素预览</button>\n                      <button type=\"button\" class=\"btn btn-info btn-xs\">数据预览</button>\n                      <button type=\"button\" class=\"btn btn-info btn-xs\">编辑</button>\n                      <button type=\"button\" class=\"btn btn-info btn-xs\">删除</button>\n                  </td>\n                </tr>`;\n            $('#save-sel').append(sel_table_body);\n            $('.select-view').hide();\n            $('.show-element').hide();\n        }else {\n            $('#select-name').css({'border-color': '#F66495'});\n            $('#select-name').attr('data-content', '名称与已有字段重复');\n            $('#select-name').popover('show');\n            $('#select-name').focus(function(){\n                $('#select-name').popover('hide');\n            });\n            $('#select-name').change(function(){\n                $('#select-name').css({'border-color': '#FFFFFF'});\n            });\n        }\n    } else {\n        $('#select-name').css({'border-color': '#F66495'});\n        $('#select-name').attr('data-content', '名称不为空');\n        $('#select-name').popover('show');\n        $('#select-name').focus(function(){\n            $('#select-name').popover('hide');\n        });\n        $('#select-name').change(function(){\n            $('#select-name').css({'border-color': '#FFFFFF'});\n        });\n    }\n}\n\n// 多列表保存\nfunction multiple_select() {\n    // 列表选择\n    $('#multiple').attr({'disabled': 'disabled', 'checked': 'checked'});\n    $('.show-element').prepend('<p>请选择同列表元素</p>').css('display', 'none');\n    $('.select-view').css('display','none');\n    iframe_mouse_event();\n}\n\n// 删除选择\nfunction save_del(obj) {\n    $('#modal-temp').new_modal({\n        backdrop: false,      // 点击模态框外部时不会关闭模态框\n        title: '删除',     // 模态框中标题\n        content: '确定删除 ' + $(obj).parent().siblings().eq(0).text() + ' 字段？',   // 模态框中内容\n        enter_function: false // 确认键绑定函数\n    });\n    $('#modal-temp').find('button').eq(-1).removeAttr(\"data-dismiss\").attr({\"id\": \"save_del_confirm\"});\n\n    $('#save_del_confirm').on('click', function () {\n        var iframe_css = $(obj).parent().prev().prev().prev().text();\n        var iframe_elem = $(window.frames[\"collect\"].document).find(iframe_css.split('::')[0]);\n        // 移除边框效果\n        iframe_elem.removeClass('end-sel');\n        $('#modal-temp').modal('hide');\n        // 删除表格\n        $(obj).parent().parent().remove();\n    });\n    $('#modal-temp').modal();\n}\n\n// 浮动显示框\nfunction float_frame() {\n    $('.float-frame').css('top', $('body > nav').height());\n    $('#button-position').on('click', function () {\n        // 左侧\n        if ($(this).attr('class').indexOf('right') !== -1) {\n            $(this).attr('class', 'glyphicon glyphicon-arrow-left button');\n            $('.float-frame').css({'right': '0px'});\n            // 右侧\n        } else {\n            $(this).attr('class', 'glyphicon glyphicon-arrow-right button');\n            $('.float-frame').css('right', '');\n        }\n    });\n}\n\n// 模态框\nfunction new_modal($) {\n    $.fn.new_modal = function (options) {\n        options = $.extend({}, $.fn.new_modal.defaults, options || {});\n        if (options.backdrop) {\n            $(this).attr(\"data-backdrop\", \"false\");\n        }\n        $(this).attr({\n            \"class\": \"modal fade\"\n        });\n        let enter_content;\n        if (!options.enter_function) {\n            enter_content = `<button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">确定</button>`;\n        } else {\n            enter_content = `<button type=\"button\" class=\"btn btn-primary\" onclick=${options.enter_function}()>确定</button>`;\n        }\n        $(this).html(`<div class=\"modal-dialog\">\n        <div class=\"modal-content\">\n        <div class=\"modal-header\">\n        <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>\n        <h4 class=\"modal-title\" id=\"myModalLabel\">${options.title}</h4>\n        </div>\n        <div class=\"modal-body\">${options.content}</div>\n        <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n        ${enter_content}\n        </div></div>`\n        );\n        return this;\n    };\n\n    $.fn.new_modal.defaults = {\n        backdrop: true, // 点击模态框外部时不会关闭模态框\n        title: '默认标题', // 模态框中标题\n        content: '默认内容', // 模态框中内容\n        enter_function: false // 确认键绑定函数\n    };\n}\n\n"
  },
  {
    "path": "server/static/js/work_iframe.js",
    "content": "/**\n * Created by Administrator on 2017/10/23.\n */\n$(function (){\n    location.reload();\n});\n\n// 生成css选择器\nfunction cssSel(obj) {\n    // 判断是否为同一对象\n    var sameJqueryObject = function (a, b){\n        if (a.is(b) && a.length === b.length){\n            return true;\n        }else{\n            return false;\n        }\n    };\n    // class id选择器\n    var domSel = function (dom){\n        // 获取属性\n        var domName = dom.localName.toLowerCase();\n        if (dom.id){\n            var domId = '#' + dom.id;\n            return domName + domId;\n        }\n        if (dom.className){\n            var domClass = dom.className.split(\" \").filter(val => val != 'end-sel' && val != 'start-sel' && val != 'hover').map(val => '.'+ val).join('');\n            return domName + domClass;\n        }\n        return domName;\n    };\n    // dom对象\n    var dom = $(obj).get(0);\n    var path = \"\";\n    // 父元素节点\n    for (; dom && dom.nodeType === 1; dom = dom.parentNode) {\n        var index = 1;\n        // 之前的同胞节点\n        for (var sib = dom.previousSibling; sib; sib = sib.previousSibling) {\n            // 同一标签下\n            if (sib.nodeType === 1) {\n                index++;\n            }\n        }\n        // 之后的同胞节点\n        var flag = 0;\n        for (var nex = $(dom).next().get(0); nex; nex = $(nex).next().get(0)) {\n            if (nex.nodeType === 1) {\n                flag = 1;\n                break;\n            }\n        }\n        // 存在兄弟节点\n        var thisobj = '';\n        if ((flag === 1) || (index > 1 && flag === 0)) {\n            thisobj = domSel(dom) + `:nth-child(${index})`;\n        // 不存在兄弟节点\n        } else {\n            thisobj = domSel(dom);\n        }\n        path = thisobj + path;\n        if (sameJqueryObject($(obj), $(path))) {\n            return path;\n        } else {\n            path = ' ' + path;\n        }\n    }\n    return undefined;\n}\n\n// 移动、点击事件\nfunction mouse_event() {\n    // 左上角弹窗\n    $('.show-element', parent.document).css('display', 'block');\n    $('*').bind({\n        // 鼠标移动事件\n        'mousemove': function (event) {\n            // 阻止父类冒泡和默认事件\n            event.stopPropagation();\n            event.preventDefault();\n            var cssName = cssSel($(event.target));\n            $(event.target).addClass('start-sel');\n            // 写入弹窗\n            $('#path', parent.document).html(cssName);\n            var content = `<div class=\"attribute\">\n                               <span>content: </span>\n                               <span>${$(event.target).contents().filter(function(){ return this.nodeType === 3; }).text()}</span>\n                           </div>`;\n            $('#attr', parent.document).html(content);\n            var attr_str = $(event.target).clone();\n            attr_str.children().remove();\n            attr_str = attr_str[0].outerHTML;\n            label_content = attr_str.match(/\\w+\\s*=\\s*[\"|'].*?[\"|']/g);\n            var attr_content = '';\n            if (label_content && label_content.length > 0){\n                for (var i in label_content){\n                    attr_content = `<div class=\"attribute\">\n                                        <span>${/(\\w+)\\s*=\\s*[\"|\\'].*?[\"|\\']/g.exec(label_content[i])[1]}:</span>\n                                        <span>${/\\w+\\s*=\\s*([\"|\\'].*?[\"|\\'])/g.exec(label_content[i])[1].replace(/\"/g, '')}</span>\n                                    </div>`;\n                    $('#attr', parent.document).append(attr_content);\n                }\n            }\n        },\n        // 鼠标移除事件\n        'mouseout': function (event) {\n            event.stopPropagation();\n            $(event.target).toggleClass('start-sel', parent.document);\n            $(event.target).removeAttr('title', parent.document);\n            $('#attr', parent.document).html('');\n        }\n    });\n    // 鼠标点击事件\n    $(this).bind({'click': function(event){\n        // 列表第二次选择\n        if ($('#multiple', parent.document).attr('disabled')){\n            $(event.target).removeClass('start-sel').addClass('end-sel');\n            $(this).unbind('click');\n            $('*').unbind('mousemove').unbind('mouseout');\n            var first = $('#select-input', parent.document).val();\n            $('.show-element p', parent.document).remove();\n            $('.select-view', parent.document).css('display', 'block');\n            // 共有父类\n            var result = common_element(first, $('#path', parent.document).text());\n            console.log('result:', result);\n            if (!result){\n                // 隐藏窗口\n                $('.select-view ', parent.document).css('display','none');\n                $('.show-element', parent.document).css('display', 'none');\n                // 取消边框样式\n                $($('#path', parent.document).text()).removeClass('end-sel');\n                // 取消显示\n                $('#select-name').popover('hide');\n                // 解除按钮禁用\n                $('div.sidebar > button', parent.document).removeAttr('disabled');\n                return false;\n            }\n            // 构造表单\n            content = {'name': $('#select-name', parent.document).val(), 'input': result};\n            selectViewForm();\n            // 解除按钮禁用\n            $('div.sidebar > button', parent.document).removeAttr('disabled');\n            return false;\n        // 非列表选择\n        } else {\n            // 阻止事件冒泡\n            // event.stopPropagation();\n            $(event.target).removeClass('start-sel').addClass('end-sel');\n            // 解除事件\n            $(this).unbind('click');\n            $('*').unbind('mousemove').unbind('mouseout');\n            // 清空数据\n            $('#select-name', parent.document).val('');\n            $('#select-input', parent.document).val('');\n            // 构造弹出表单\n            content = {'input':  $('#path', parent.document).text()};\n            selectViewForm(content);\n            // 启动中间弹窗\n            $('.select-view', parent.document).css('display', 'block');\n            // 绑定清除背景、隐藏窗口按钮\n            $('body > div.select-view > div:nth-child(1) > button', parent.document).on('click', function(){\n                // 隐藏窗口\n                $('.select-view ', parent.document).css('display','none');\n                $('.show-element', parent.document).css('display', 'none');\n                // 取消边框样式\n                $($('#path', parent.document).text()).removeClass('end-sel');\n                // 取消显示\n                $('#select-name').popover('hide');\n            });\n            // 解除按钮禁用\n            $('div.sidebar > button', parent.document).removeAttr('disabled');\n\n            // 阻止点击事件\n            return false;\n        }\n    }\n    });\n}\n\n// 构造弹出框表单\nfunction selectViewForm(content) {\n    content.name ? $('#select-name').val(content.name) : $('#select-name').val('');\n    var sel_content = {};\n    for (var i=0;i<$('#attr .attribute', parent.document).length;i++){\n        sel_content[$('#attr .attribute', parent.document).eq(i).find('span').eq(0).text().replace(/: /g, '')] =\n        $('#attr .attribute', parent.document).eq(i).find('span').eq(1).text();\n    }\n    $('#select-form', parent.document).html('<option>content</option>');\n    $('#select-value', parent.document).html(sel_content['content']);\n    content.input ? $('#select-input', parent.document).val(content.input) : $('#select-input', parent.document).val($('#path', parent.document).text());\n    for (var i in sel_content){\n        if (i !== 'content'){\n            $('#select-form', parent.document).append('<option>' + i + '</option>');\n        }\n    }\n    $('#select-form', parent.document).change(function(){\n        $('#select-value', parent.document).html(sel_content[$(this).children('option:selected').val()]);\n        $('#select-input', parent.document).val($('#path', parent.document).text());\n    });\n}\n\nfunction common_element(first, second){\n    /*\n    1.同列表元素的dom层级一致\n    2.同列表元素至少一层父元素不一致\n    */\n    var arr_1 = first.split(' ').map(val => val.split(':'))\n    var arr_2 = second.split(' ').map(val => val.split(':'))\n    // 同列表元素判断\n    if (arr_1.length == arr_2.length){\n        var global_element = [];\n        $.each(arr_1, function(index, value){\n            if (arr_1[index].toString() == arr_2[index].toString()){\n                global_element.push(arr_1[index].join(':'));\n            }\n            else{\n                if (arr_1[index][0] == arr_2[index][0]){\n                    global_element.push(arr_1[index][0]);\n                }\n            }\n        })\n        var global_father = global_element.join(' ');\n        if ($(first).is($(global_father)) && $(second).is($(global_father))){\n            return global_father;\n        } else{\n            return false;\n        }\n    } else {\n        return false;\n    }\n}"
  },
  {
    "path": "server/static/lib/ICanHaz.js",
    "content": "/*!\n ICanHaz.js version 0.10.2 -- by @HenrikJoreteg\n More info at: http://icanhazjs.com\n */\n(function () {\n    /*\n     mustache.js — Logic-less templates in JavaScript\n\n     See http://mustache.github.com/ for more info.\n     */\n\n    var Mustache = function () {\n        var _toString = Object.prototype.toString;\n\n        Array.isArray = Array.isArray || function (obj) {\n            return _toString.call(obj) == \"[object Array]\";\n        }\n\n        var _trim = String.prototype.trim, trim;\n\n        if (_trim) {\n            trim = function (text) {\n                return text == null ? \"\" : _trim.call(text);\n            }\n        } else {\n            var trimLeft, trimRight;\n\n            // IE doesn't match non-breaking spaces with \\s.\n            if ((/\\S/).test(\"\\xA0\")) {\n                trimLeft = /^[\\s\\xA0]+/;\n                trimRight = /[\\s\\xA0]+$/;\n            } else {\n                trimLeft = /^\\s+/;\n                trimRight = /\\s+$/;\n            }\n\n            trim = function (text) {\n                return text == null ? \"\" :\n                    text.toString().replace(trimLeft, \"\").replace(trimRight, \"\");\n            }\n        }\n\n        var escapeMap = {\n            \"&\": \"&amp;\",\n            \"<\": \"&lt;\",\n            \">\": \"&gt;\",\n            '\"': '&quot;',\n            \"'\": '&#39;'\n        };\n\n        function escapeHTML(string) {\n            return String(string).replace(/&(?!\\w+;)|[<>\"']/g, function (s) {\n                return escapeMap[s] || s;\n            });\n        }\n\n        var regexCache = {};\n        var Renderer = function () {};\n\n        Renderer.prototype = {\n            otag: \"{{\",\n            ctag: \"}}\",\n            pragmas: {},\n            buffer: [],\n            pragmas_implemented: {\n                \"IMPLICIT-ITERATOR\": true\n            },\n            context: {},\n\n            render: function (template, context, partials, in_recursion) {\n                // reset buffer & set context\n                if (!in_recursion) {\n                    this.context = context;\n                    this.buffer = []; // TODO: make this non-lazy\n                }\n\n                // fail fast\n                if (!this.includes(\"\", template)) {\n                    if (in_recursion) {\n                        return template;\n                    } else {\n                        this.send(template);\n                        return;\n                    }\n                }\n\n                // get the pragmas together\n                template = this.render_pragmas(template);\n\n                // render the template\n                var html = this.render_section(template, context, partials);\n\n                // render_section did not find any sections, we still need to render the tags\n                if (html === false) {\n                    html = this.render_tags(template, context, partials, in_recursion);\n                }\n\n                if (in_recursion) {\n                    return html;\n                } else {\n                    this.sendLines(html);\n                }\n            },\n\n            /*\n             Sends parsed lines\n             */\n            send: function (line) {\n                if (line !== \"\") {\n                    this.buffer.push(line);\n                }\n            },\n\n            sendLines: function (text) {\n                if (text) {\n                    var lines = text.split(\"\\n\");\n                    for (var i = 0; i < lines.length; i++) {\n                        this.send(lines[i]);\n                    }\n                }\n            },\n\n            /*\n             Looks for %PRAGMAS\n             */\n            render_pragmas: function (template) {\n                // no pragmas\n                if (!this.includes(\"%\", template)) {\n                    return template;\n                }\n\n                var that = this;\n                var regex = this.getCachedRegex(\"render_pragmas\", function (otag, ctag) {\n                    return new RegExp(otag + \"%([\\\\w-]+) ?([\\\\w]+=[\\\\w]+)?\" + ctag, \"g\");\n                });\n\n                return template.replace(regex, function (match, pragma, options) {\n                    if (!that.pragmas_implemented[pragma]) {\n                        throw({message:\n                            \"This implementation of mustache doesn't understand the '\" +\n                                pragma + \"' pragma\"});\n                    }\n                    that.pragmas[pragma] = {};\n                    if (options) {\n                        var opts = options.split(\"=\");\n                        that.pragmas[pragma][opts[0]] = opts[1];\n                    }\n                    return \"\";\n                    // ignore unknown pragmas silently\n                });\n            },\n\n            /*\n             Tries to find a partial in the curent scope and render it\n             */\n            render_partial: function (name, context, partials) {\n                name = trim(name);\n                if (!partials || partials[name] === undefined) {\n                    throw({message: \"unknown_partial '\" + name + \"'\"});\n                }\n                if (!context || typeof context[name] != \"object\") {\n                    return this.render(partials[name], context, partials, true);\n                }\n                return this.render(partials[name], context[name], partials, true);\n            },\n\n            /*\n             Renders inverted (^) and normal (#) sections\n             */\n            render_section: function (template, context, partials) {\n                if (!this.includes(\"#\", template) && !this.includes(\"^\", template)) {\n                    // did not render anything, there were no sections\n                    return false;\n                }\n\n                var that = this;\n\n                var regex = this.getCachedRegex(\"render_section\", function (otag, ctag) {\n                    // This regex matches _the first_ section ({{#foo}}{{/foo}}), and captures the remainder\n                    return new RegExp(\n                        \"^([\\\\s\\\\S]*?)\" +         // all the crap at the beginning that is not {{*}} ($1)\n\n                            otag +                    // {{\n                            \"(\\\\^|\\\\#)\\\\s*(.+)\\\\s*\" + //  #foo (# == $2, foo == $3)\n                            ctag +                    // }}\n\n                            \"\\n*([\\\\s\\\\S]*?)\" +       // between the tag ($2). leading newlines are dropped\n\n                            otag +                    // {{\n                            \"\\\\/\\\\s*\\\\3\\\\s*\" +        //  /foo (backreference to the opening tag).\n                            ctag +                    // }}\n\n                            \"\\\\s*([\\\\s\\\\S]*)$\",       // everything else in the string ($4). leading whitespace is dropped.\n\n                        \"g\");\n                });\n\n\n                // for each {{#foo}}{{/foo}} section do...\n                return template.replace(regex, function (match, before, type, name, content, after) {\n                    // before contains only tags, no sections\n                    var renderedBefore = before ? that.render_tags(before, context, partials, true) : \"\",\n\n                    // after may contain both sections and tags, so use full rendering function\n                        renderedAfter = after ? that.render(after, context, partials, true) : \"\",\n\n                    // will be computed below\n                        renderedContent,\n\n                        value = that.find(name, context);\n\n                    if (type === \"^\") { // inverted section\n                        if (!value || Array.isArray(value) && value.length === 0) {\n                            // false or empty list, render it\n                            renderedContent = that.render(content, context, partials, true);\n                        } else {\n                            renderedContent = \"\";\n                        }\n                    } else if (type === \"#\") { // normal section\n                        if (Array.isArray(value)) { // Enumerable, Let's loop!\n                            renderedContent = that.map(value, function (row) {\n                                return that.render(content, that.create_context(row), partials, true);\n                            }).join(\"\");\n                        } else if (that.is_object(value)) { // Object, Use it as subcontext!\n                            renderedContent = that.render(content, that.create_context(value),\n                                partials, true);\n                        } else if (typeof value == \"function\") {\n                            // higher order section\n                            renderedContent = value.call(context, content, function (text) {\n                                return that.render(text, context, partials, true);\n                            });\n                        } else if (value) { // boolean section\n                            renderedContent = that.render(content, context, partials, true);\n                        } else {\n                            renderedContent = \"\";\n                        }\n                    }\n\n                    return renderedBefore + renderedContent + renderedAfter;\n                });\n            },\n\n            /*\n             Replace {{foo}} and friends with values from our view\n             */\n            render_tags: function (template, context, partials, in_recursion) {\n                // tit for tat\n                var that = this;\n\n                var new_regex = function () {\n                    return that.getCachedRegex(\"render_tags\", function (otag, ctag) {\n                        return new RegExp(otag + \"(=|!|>|&|\\\\{|%)?([^#\\\\^]+?)\\\\1?\" + ctag + \"+\", \"g\");\n                    });\n                };\n\n                var regex = new_regex();\n                var tag_replace_callback = function (match, operator, name) {\n                    switch(operator) {\n                        case \"!\": // ignore comments\n                            return \"\";\n                        case \"=\": // set new delimiters, rebuild the replace regexp\n                            that.set_delimiters(name);\n                            regex = new_regex();\n                            return \"\";\n                        case \">\": // render partial\n                            return that.render_partial(name, context, partials);\n                        case \"{\": // the triple mustache is unescaped\n                        case \"&\": // & operator is an alternative unescape method\n                            return that.find(name, context);\n                        default: // escape the value\n                            return escapeHTML(that.find(name, context));\n                    }\n                };\n                var lines = template.split(\"\\n\");\n                for(var i = 0; i < lines.length; i++) {\n                    lines[i] = lines[i].replace(regex, tag_replace_callback, this);\n                    if (!in_recursion) {\n                        this.send(lines[i]);\n                    }\n                }\n\n                if (in_recursion) {\n                    return lines.join(\"\\n\");\n                }\n            },\n\n            set_delimiters: function (delimiters) {\n                var dels = delimiters.split(\" \");\n                this.otag = this.escape_regex(dels[0]);\n                this.ctag = this.escape_regex(dels[1]);\n            },\n\n            escape_regex: function (text) {\n                // thank you Simon Willison\n                if (!arguments.callee.sRE) {\n                    var specials = [\n                        '/', '.', '*', '+', '?', '|',\n                        '(', ')', '[', ']', '{', '}', '\\\\'\n                    ];\n                    arguments.callee.sRE = new RegExp(\n                        '(\\\\' + specials.join('|\\\\') + ')', 'g'\n                    );\n                }\n                return text.replace(arguments.callee.sRE, '\\\\$1');\n            },\n\n            /*\n             find `name` in current `context`. That is find me a value\n             from the view object\n             */\n            find: function (name, context) {\n                name = trim(name);\n\n                // Checks whether a value is thruthy or false or 0\n                function is_kinda_truthy(bool) {\n                    return bool === false || bool === 0 || bool;\n                }\n\n                var value;\n\n                // check for dot notation eg. foo.bar\n                if (name.match(/([a-z_]+)\\./ig)) {\n                    var childValue = this.walk_context(name, context);\n                    if (is_kinda_truthy(childValue)) {\n                        value = childValue;\n                    }\n                } else {\n                    if (is_kinda_truthy(context[name])) {\n                        value = context[name];\n                    } else if (is_kinda_truthy(this.context[name])) {\n                        value = this.context[name];\n                    }\n                }\n\n                if (typeof value == \"function\") {\n                    return value.apply(context);\n                }\n                if (value !== undefined) {\n                    return value;\n                }\n                // silently ignore unkown variables\n                return \"\";\n            },\n\n            walk_context: function (name, context) {\n                var path = name.split('.');\n                // if the var doesn't exist in current context, check the top level context\n                var value_context = (context[path[0]] != undefined) ? context : this.context;\n                var value = value_context[path.shift()];\n                while (value != undefined && path.length > 0) {\n                    value_context = value;\n                    value = value[path.shift()];\n                }\n                // if the value is a function, call it, binding the correct context\n                if (typeof value == \"function\") {\n                    return value.apply(value_context);\n                }\n                return value;\n            },\n\n            // Utility methods\n\n            /* includes tag */\n            includes: function (needle, haystack) {\n                return haystack.indexOf(this.otag + needle) != -1;\n            },\n\n            // by @langalex, support for arrays of strings\n            create_context: function (_context) {\n                if (this.is_object(_context)) {\n                    return _context;\n                } else {\n                    var iterator = \".\";\n                    if (this.pragmas[\"IMPLICIT-ITERATOR\"]) {\n                        iterator = this.pragmas[\"IMPLICIT-ITERATOR\"].iterator;\n                    }\n                    var ctx = {};\n                    ctx[iterator] = _context;\n                    return ctx;\n                }\n            },\n\n            is_object: function (a) {\n                return a && typeof a == \"object\";\n            },\n\n            /*\n             Why, why, why? Because IE. Cry, cry cry.\n             */\n            map: function (array, fn) {\n                if (typeof array.map == \"function\") {\n                    return array.map(fn);\n                } else {\n                    var r = [];\n                    var l = array.length;\n                    for(var i = 0; i < l; i++) {\n                        r.push(fn(array[i]));\n                    }\n                    return r;\n                }\n            },\n\n            getCachedRegex: function (name, generator) {\n                var byOtag = regexCache[this.otag];\n                if (!byOtag) {\n                    byOtag = regexCache[this.otag] = {};\n                }\n\n                var byCtag = byOtag[this.ctag];\n                if (!byCtag) {\n                    byCtag = byOtag[this.ctag] = {};\n                }\n\n                var regex = byCtag[name];\n                if (!regex) {\n                    regex = byCtag[name] = generator(this.otag, this.ctag);\n                }\n\n                return regex;\n            }\n        };\n\n        return({\n            name: \"mustache.js\",\n            version: \"0.4.0\",\n\n            /*\n             Turns a template and view into HTML\n             */\n            to_html: function (template, view, partials, send_fun) {\n                var renderer = new Renderer();\n                if (send_fun) {\n                    renderer.send = send_fun;\n                }\n                renderer.render(template, view || {}, partials);\n                if (!send_fun) {\n                    return renderer.buffer.join(\"\\n\");\n                }\n            }\n        });\n    }();\n    /*!\n     ICanHaz.js -- by @HenrikJoreteg\n     */\n    /*global  */\n    (function () {\n        function trim(stuff) {\n            if (''.trim) return stuff.trim();\n            else return stuff.replace(/^\\s+/, '').replace(/\\s+$/, '');\n        }\n\n        // Establish the root object, `window` in the browser, or `global` on the server.\n        var root = this;\n\n        var ich = {\n            VERSION: \"0.10.2\",\n            templates: {},\n\n            // grab jquery or zepto if it's there\n            $: (typeof window !== 'undefined') ? window.jQuery || window.Zepto || null : null,\n\n            // public function for adding templates\n            // can take a name and template string arguments\n            // or can take an object with name/template pairs\n            // We're enforcing uniqueness to avoid accidental template overwrites.\n            // If you want a different template, it should have a different name.\n            addTemplate: function (name, templateString) {\n                if (typeof name === 'object') {\n                    for (var template in name) {\n                        this.addTemplate(template, name[template]);\n                    }\n                    return;\n                }\n                if (ich[name]) {\n                    console.error(\"Invalid name: \" + name + \".\");\n                } else if (ich.templates[name]) {\n                    console.error(\"Template \\\"\" + name + \"  \\\" exists\");\n                } else {\n                    ich.templates[name] = templateString;\n                    ich[name] = function (data, raw) {\n                        data = data || {};\n                        var result = Mustache.to_html(ich.templates[name], data, ich.templates);\n                        return (ich.$ && !raw) ? ich.$(trim(result)) : result;\n                    };\n                }\n            },\n\n            // clears all retrieval functions and empties cache\n            clearAll: function () {\n                for (var key in ich.templates) {\n                    delete ich[key];\n                }\n                ich.templates = {};\n            },\n\n            // clears/grabs\n            refresh: function () {\n                ich.clearAll();\n                ich.grabTemplates();\n            },\n\n            // grabs templates from the DOM and caches them.\n            // Loop through and add templates.\n            // Whitespace at beginning and end of all templates inside <script> tags will\n            // be trimmed. If you want whitespace around a partial, add it in the parent,\n            // not the partial. Or do it explicitly using <br/> or &nbsp;\n            grabTemplates: function () {\n                var i,\n                    l,\n                    scripts = document.getElementsByTagName('script'),\n                    script,\n                    trash = [];\n                for (i = 0, l = scripts.length; i < l; i++) {\n                    script = scripts[i];\n                    if (script && script.innerHTML && script.id && (script.type === \"text/html\" || script.type === \"text/x-icanhaz\")) {\n                        ich.addTemplate(script.id, trim(script.innerHTML));\n                        trash.unshift(script);\n                    }\n                }\n                for (i = 0, l = trash.length; i < l; i++) {\n                    trash[i].parentNode.removeChild(trash[i]);\n                }\n            }\n        };\n\n        // Export the ICanHaz object for **Node.js**, with\n        // backwards-compatibility for the old `require()` API. If we're in\n        // the browser, add `ich` as a global object via a string identifier,\n        // for Closure Compiler \"advanced\" mode.\n        if (typeof exports !== 'undefined') {\n            if (typeof module !== 'undefined' && module.exports) {\n                exports = module.exports = ich;\n            }\n            exports.ich = ich;\n        } else {\n            root['ich'] = ich;\n        }\n\n        if (typeof document !== 'undefined') {\n            if (ich.$) {\n                ich.$(function () {\n                    ich.grabTemplates();\n                });\n            } else {\n                document.addEventListener('DOMContentLoaded', function () {\n                    ich.grabTemplates();\n                }, true);\n            }\n        }\n\n    })();\n})();"
  },
  {
    "path": "server/static/lib/LICENSE-d3-js",
    "content": "Copyright (c) 2013, Michael Bostock\nAll rights reserved.\n\n\tRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n\t* Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\n\t* Redistributions in binary form must reproduce the above copyright notice,\n\tthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n\n\t* The name Michael Bostock may not be used to endorse or promote products\nderived from this software without specific prior written permission.\n\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,\n\tINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n\tBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\tDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\nOF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n\tEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "server/static/lib/LICENSE-icanhaz-js",
    "content": "ICanHaz.js is Copyright (c) 2010 Henrik Joreteg and is MIT licensed.\n\nIn my best attempt to comply with instructions I'm including the following license notice from Mustache and Mustache.js:\n---------------------------------------------------------------------\nCopyright (c) 2009 Chris Wanstrath (Ruby)\nCopyright (c) 2010 Jan Lehnardt (JavaScript)\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n---------------------------------------------------------------------"
  },
  {
    "path": "server/static/lib/LICENSE-jquery-js",
    "content": "Copyright 2013 jQuery Foundation and other contributors\nhttp://jquery.com/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "server/static/lib/LICENSE-pouchdb-js",
    "content": "\n                                Apache License\n                          Version 2.0, January 2004\n                       http://www.apache.org/licenses/\n\n  TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n  1. Definitions.\n\n     \"License\" shall mean the terms and conditions for use, reproduction,\n     and distribution as defined by Sections 1 through 9 of this document.\n\n     \"Licensor\" shall mean the copyright owner or entity authorized by\n     the copyright owner that is granting the License.\n\n     \"Legal Entity\" shall mean the union of the acting entity and all\n     other entities that control, are controlled by, or are under common\n     control with that entity. For the purposes of this definition,\n     \"control\" means (i) the power, direct or indirect, to cause the\n     direction or management of such entity, whether by contract or\n     otherwise, or (ii) ownership of fifty percent (50%) or more of the\n     outstanding shares, or (iii) beneficial ownership of such entity.\n\n     \"You\" (or \"Your\") shall mean an individual or Legal Entity\n     exercising permissions granted by this License.\n\n     \"Source\" form shall mean the preferred form for making modifications,\n     including but not limited to software source code, documentation\n     source, and configuration files.\n\n     \"Object\" form shall mean any form resulting from mechanical\n     transformation or translation of a Source form, including but\n     not limited to compiled object code, generated documentation,\n     and conversions to other media types.\n\n     \"Work\" shall mean the work of authorship, whether in Source or\n     Object form, made available under the License, as indicated by a\n     copyright notice that is included in or attached to the work\n     (an example is provided in the Appendix below).\n\n     \"Derivative Works\" shall mean any work, whether in Source or Object\n     form, that is based on (or derived from) the Work and for which the\n     editorial revisions, annotations, elaborations, or other modifications\n     represent, as a whole, an original work of authorship. For the purposes\n     of this License, Derivative Works shall not include works that remain\n     separable from, or merely link (or bind by name) to the interfaces of,\n     the Work and Derivative Works thereof.\n\n     \"Contribution\" shall mean any work of authorship, including\n     the original version of the Work and any modifications or additions\n     to that Work or Derivative Works thereof, that is intentionally\n     submitted to Licensor for inclusion in the Work by the copyright owner\n     or by an individual or Legal Entity authorized to submit on behalf of\n     the copyright owner. For the purposes of this definition, \"submitted\"\n     means any form of electronic, verbal, or written communication sent\n     to the Licensor or its representatives, including but not limited to\n     communication on electronic mailing lists, source code control systems,\n     and issue tracking systems that are managed by, or on behalf of, the\n     Licensor for the purpose of discussing and improving the Work, but\n     excluding communication that is conspicuously marked or otherwise\n     designated in writing by the copyright owner as \"Not a Contribution.\"\n\n     \"Contributor\" shall mean Licensor and any individual or Legal Entity\n     on behalf of whom a Contribution has been received by Licensor and\n     subsequently incorporated within the Work.\n\n  2. Grant of Copyright License. Subject to the terms and conditions of\n     this License, each Contributor hereby grants to You a perpetual,\n     worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n     copyright license to reproduce, prepare Derivative Works of,\n     publicly display, publicly perform, sublicense, and distribute the\n     Work and such Derivative Works in Source or Object form.\n\n  3. Grant of Patent License. Subject to the terms and conditions of\n     this License, each Contributor hereby grants to You a perpetual,\n     worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n     (except as stated in this section) patent license to make, have made,\n     use, offer to sell, sell, import, and otherwise transfer the Work,\n     where such license applies only to those patent claims licensable\n     by such Contributor that are necessarily infringed by their\n     Contribution(s) alone or by combination of their Contribution(s)\n     with the Work to which such Contribution(s) was submitted. If You\n     institute patent litigation against any entity (including a\n     cross-claim or counterclaim in a lawsuit) alleging that the Work\n     or a Contribution incorporated within the Work constitutes direct\n     or contributory patent infringement, then any patent licenses\n     granted to You under this License for that Work shall terminate\n     as of the date such litigation is filed.\n\n  4. Redistribution. You may reproduce and distribute copies of the\n     Work or Derivative Works thereof in any medium, with or without\n     modifications, and in Source or Object form, provided that You\n     meet the following conditions:\n\n     (a) You must give any other recipients of the Work or\n         Derivative Works a copy of this License; and\n\n     (b) You must cause any modified files to carry prominent notices\n         stating that You changed the files; and\n\n     (c) You must retain, in the Source form of any Derivative Works\n         that You distribute, all copyright, patent, trademark, and\n         attribution notices from the Source form of the Work,\n         excluding those notices that do not pertain to any part of\n         the Derivative Works; and\n\n     (d) If the Work includes a \"NOTICE\" text file as part of its\n         distribution, then any Derivative Works that You distribute must\n         include a readable copy of the attribution notices contained\n         within such NOTICE file, excluding those notices that do not\n         pertain to any part of the Derivative Works, in at least one\n         of the following places: within a NOTICE text file distributed\n         as part of the Derivative Works; within the Source form or\n         documentation, if provided along with the Derivative Works; or,\n         within a display generated by the Derivative Works, if and\n         wherever such third-party notices normally appear. The contents\n         of the NOTICE file are for informational purposes only and\n         do not modify the License. You may add Your own attribution\n         notices within Derivative Works that You distribute, alongside\n         or as an addendum to the NOTICE text from the Work, provided\n         that such additional attribution notices cannot be construed\n         as modifying the License.\n\n     You may add Your own copyright statement to Your modifications and\n     may provide additional or different license terms and conditions\n     for use, reproduction, or distribution of Your modifications, or\n     for any such Derivative Works as a whole, provided Your use,\n     reproduction, and distribution of the Work otherwise complies with\n     the conditions stated in this License.\n\n  5. Submission of Contributions. Unless You explicitly state otherwise,\n     any Contribution intentionally submitted for inclusion in the Work\n     by You to the Licensor shall be under the terms and conditions of\n     this License, without any additional terms or conditions.\n     Notwithstanding the above, nothing herein shall supersede or modify\n     the terms of any separate license agreement you may have executed\n     with Licensor regarding such Contributions.\n\n  6. Trademarks. This License does not grant permission to use the trade\n     names, trademarks, service marks, or product names of the Licensor,\n     except as required for reasonable and customary use in describing the\n     origin of the Work and reproducing the content of the NOTICE file.\n\n  7. Disclaimer of Warranty. Unless required by applicable law or\n     agreed to in writing, Licensor provides the Work (and each\n     Contributor provides its Contributions) on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n     implied, including, without limitation, any warranties or conditions\n     of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n     PARTICULAR PURPOSE. You are solely responsible for determining the\n     appropriateness of using or redistributing the Work and assume any\n     risks associated with Your exercise of permissions under this License.\n\n  8. Limitation of Liability. In no event and under no legal theory,\n     whether in tort (including negligence), contract, or otherwise,\n     unless required by applicable law (such as deliberate and grossly\n     negligent acts) or agreed to in writing, shall any Contributor be\n     liable to You for damages, including any direct, indirect, special,\n     incidental, or consequential damages of any character arising as a\n     result of this License or out of the use or inability to use the\n     Work (including but not limited to damages for loss of goodwill,\n     work stoppage, computer failure or malfunction, or any and all\n     other commercial damages or losses), even if such Contributor\n     has been advised of the possibility of such damages.\n\n  9. Accepting Warranty or Additional Liability. While redistributing\n     the Work or Derivative Works thereof, You may choose to offer,\n     and charge a fee for, acceptance of support, warranty, indemnity,\n     or other liability obligations and/or rights consistent with this\n     License. However, in accepting such obligations, You may act only\n     on Your own behalf and on Your sole responsibility, not on behalf\n     of any other Contributor, and only if You agree to indemnify,\n     defend, and hold each Contributor harmless for any liability\n     incurred by, or claims asserted against, such Contributor by reason\n     of your accepting any such warranty or additional liability.\n\n  END OF TERMS AND CONDITIONS\n\n  APPENDIX: How to apply the Apache License to your work.\n\n     To apply the Apache License to your work, attach the following\n     boilerplate notice, with the fields enclosed by brackets \"[]\"\n     replaced with your own identifying information. (Don't include\n     the brackets!)  The text should be enclosed in the appropriate\n     comment syntax for the file format. We also recommend that a\n     file or class name and description of purpose be included on the\n     same \"printed page\" as the copyright notice for easier\n     identification within third-party archives.\n\n  Copyright [yyyy] [name of copyright owner]\n\n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n\n\nPouchDB Subcomponents\n\nFor the src/jquery.js component:\n\n  Copyright (c) 2009 John Resig, http://jquery.com/\n\n  Permission is hereby granted, free of charge, to any person obtaining\n  a copy of this software and associated documentation files (the\n  \"Software\"), to deal in the Software without restriction, including\n  without limitation the rights to use, copy, modify, merge, publish,\n  distribute, sublicense, and/or sell copies of the Software, and to\n  permit persons to whom the Software is furnished to do so, subject to\n  the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "server/static/lib/LICENSE-sugar-js",
    "content": "Copyright © 2011 Andrew Plummer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sub-license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\nThe above copyright notice, and every other copyright notice found in this software, and all the attributions in every file, and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "server/static/lib/ajaxhook.js",
    "content": "/*\n * author: wendu\n * email: 824783146@qq.com\n * source code: https://github.com/wendux/Ajax-hook\n **/\n!function (ob) {\n    ob.hookAjax = function (funs) {\n        window._ahrealxhr = window._ahrealxhr || XMLHttpRequest;\n        XMLHttpRequest = function () {\n            this.xhr = new window._ahrealxhr;\n            for (var attr in this.xhr) {\n                var type = \"\";\n                try {\n                    type = typeof this.xhr[attr]\n                } catch (e) {}\n                if (type === \"function\") {\n                    this[attr] = hookfun(attr);\n                } else {\n                    Object.defineProperty(this, attr, {\n                        get: getFactory(attr),\n                        set: setFactory(attr)\n                    });\n                }\n            }\n        };\n\n        function getFactory(attr) {\n            return function () {\n                return this.hasOwnProperty(attr + \"_\")?this[attr + \"_\"]:this.xhr[attr];\n            };\n        }\n\n        function setFactory(attr) {\n            return function (f) {\n                var xhr = this.xhr;\n                var that = this;\n                if (attr.indexOf(\"on\") != 0) {\n                    this[attr + \"_\"] = f;\n                    return;\n                }\n                if (funs[attr]) {\n                    xhr[attr] = function () {\n                        funs[attr](that) || f.apply(xhr, arguments);\n                    };\n                } else {\n                    xhr[attr] = f;\n                }\n            };\n        }\n\n        function hookfun(fun) {\n            return function () {\n                var args = [].slice.call(arguments);\n                if (funs[fun] && funs[fun].call(this, args, this.xhr)) {\n                    return;\n                }\n                return this.xhr[fun].apply(this.xhr, args);\n            };\n        }\n        return window._ahrealxhr;\n    };\n    ob.unHookAjax = function () {\n        if (window._ahrealxhr)  XMLHttpRequest = window._ahrealxhr;\n        window._ahrealxhr = undefined;\n    }\n}(window);\n//}(module.exports)"
  },
  {
    "path": "server/static/lib/base64.js",
    "content": "/**\n * @url http://jsperf.com/blob-base64-conversion\n * @type {{blobToBase64: blobToBase64, base64ToBlob: base64ToBlob}}\n */\nvar Base64 = {\n\n\tblobToBase64: function(blob) {\n\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar reader = new FileReader();\n\t\treader.onload = function() {\n\t\t\tvar dataUrl = reader.result;\n\t\t\tvar base64 = dataUrl.split(',')[1];\n\t\t\tdeferredResponse.resolve(base64);\n\t\t};\n\t\treader.readAsDataURL(blob);\n\n\t\treturn deferredResponse.promise();\n\t},\n\n\tbase64ToBlob: function(base64, mimeType) {\n\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar binary = atob(base64);\n\t\tvar len = binary.length;\n\t\tvar buffer = new ArrayBuffer(len);\n\t\tvar view = new Uint8Array(buffer);\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tview[i] = binary.charCodeAt(i);\n\t\t}\n\t\tvar blob = new Blob([view], {type: mimeType});\n\t\tdeferredResponse.resolve(blob);\n\n\t\treturn deferredResponse.promise();\n\t}\n};\n"
  },
  {
    "path": "server/static/lib/bootstrap-3.3.7/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "server/static/lib/bootstrap-3.3.7/css/bootstrap.css",
    "content": "/*@import url(\"https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,400,300,700\");*/\n/*!\n * bootswatch v3.3.7\n * Homepage: http://bootswatch.com\n * Copyright 2012-2016 Thomas Park\n * Licensed under MIT\n * Based on Bootstrap\n*//*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:\" (\" attr(href) \")\"}abbr[title]:after{content:\" (\" attr(title) \")\"}a[href^=\"#\"]:after,a[href^=\"javascript:\"]:after{content:\"\"}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:\"\\002a\"}.glyphicon-plus:before{content:\"\\002b\"}.glyphicon-euro:before,.glyphicon-eur:before{content:\"\\20ac\"}.glyphicon-minus:before{content:\"\\2212\"}.glyphicon-cloud:before{content:\"\\2601\"}.glyphicon-envelope:before{content:\"\\2709\"}.glyphicon-pencil:before{content:\"\\270f\"}.glyphicon-glass:before{content:\"\\e001\"}.glyphicon-music:before{content:\"\\e002\"}.glyphicon-search:before{content:\"\\e003\"}.glyphicon-heart:before{content:\"\\e005\"}.glyphicon-star:before{content:\"\\e006\"}.glyphicon-star-empty:before{content:\"\\e007\"}.glyphicon-user:before{content:\"\\e008\"}.glyphicon-film:before{content:\"\\e009\"}.glyphicon-th-large:before{content:\"\\e010\"}.glyphicon-th:before{content:\"\\e011\"}.glyphicon-th-list:before{content:\"\\e012\"}.glyphicon-ok:before{content:\"\\e013\"}.glyphicon-remove:before{content:\"\\e014\"}.glyphicon-zoom-in:before{content:\"\\e015\"}.glyphicon-zoom-out:before{content:\"\\e016\"}.glyphicon-off:before{content:\"\\e017\"}.glyphicon-signal:before{content:\"\\e018\"}.glyphicon-cog:before{content:\"\\e019\"}.glyphicon-trash:before{content:\"\\e020\"}.glyphicon-home:before{content:\"\\e021\"}.glyphicon-file:before{content:\"\\e022\"}.glyphicon-time:before{content:\"\\e023\"}.glyphicon-road:before{content:\"\\e024\"}.glyphicon-download-alt:before{content:\"\\e025\"}.glyphicon-download:before{content:\"\\e026\"}.glyphicon-upload:before{content:\"\\e027\"}.glyphicon-inbox:before{content:\"\\e028\"}.glyphicon-play-circle:before{content:\"\\e029\"}.glyphicon-repeat:before{content:\"\\e030\"}.glyphicon-refresh:before{content:\"\\e031\"}.glyphicon-list-alt:before{content:\"\\e032\"}.glyphicon-lock:before{content:\"\\e033\"}.glyphicon-flag:before{content:\"\\e034\"}.glyphicon-headphones:before{content:\"\\e035\"}.glyphicon-volume-off:before{content:\"\\e036\"}.glyphicon-volume-down:before{content:\"\\e037\"}.glyphicon-volume-up:before{content:\"\\e038\"}.glyphicon-qrcode:before{content:\"\\e039\"}.glyphicon-barcode:before{content:\"\\e040\"}.glyphicon-tag:before{content:\"\\e041\"}.glyphicon-tags:before{content:\"\\e042\"}.glyphicon-book:before{content:\"\\e043\"}.glyphicon-bookmark:before{content:\"\\e044\"}.glyphicon-print:before{content:\"\\e045\"}.glyphicon-camera:before{content:\"\\e046\"}.glyphicon-font:before{content:\"\\e047\"}.glyphicon-bold:before{content:\"\\e048\"}.glyphicon-italic:before{content:\"\\e049\"}.glyphicon-text-height:before{content:\"\\e050\"}.glyphicon-text-width:before{content:\"\\e051\"}.glyphicon-align-left:before{content:\"\\e052\"}.glyphicon-align-center:before{content:\"\\e053\"}.glyphicon-align-right:before{content:\"\\e054\"}.glyphicon-align-justify:before{content:\"\\e055\"}.glyphicon-list:before{content:\"\\e056\"}.glyphicon-indent-left:before{content:\"\\e057\"}.glyphicon-indent-right:before{content:\"\\e058\"}.glyphicon-facetime-video:before{content:\"\\e059\"}.glyphicon-picture:before{content:\"\\e060\"}.glyphicon-map-marker:before{content:\"\\e062\"}.glyphicon-adjust:before{content:\"\\e063\"}.glyphicon-tint:before{content:\"\\e064\"}.glyphicon-edit:before{content:\"\\e065\"}.glyphicon-share:before{content:\"\\e066\"}.glyphicon-check:before{content:\"\\e067\"}.glyphicon-move:before{content:\"\\e068\"}.glyphicon-step-backward:before{content:\"\\e069\"}.glyphicon-fast-backward:before{content:\"\\e070\"}.glyphicon-backward:before{content:\"\\e071\"}.glyphicon-play:before{content:\"\\e072\"}.glyphicon-pause:before{content:\"\\e073\"}.glyphicon-stop:before{content:\"\\e074\"}.glyphicon-forward:before{content:\"\\e075\"}.glyphicon-fast-forward:before{content:\"\\e076\"}.glyphicon-step-forward:before{content:\"\\e077\"}.glyphicon-eject:before{content:\"\\e078\"}.glyphicon-chevron-left:before{content:\"\\e079\"}.glyphicon-chevron-right:before{content:\"\\e080\"}.glyphicon-plus-sign:before{content:\"\\e081\"}.glyphicon-minus-sign:before{content:\"\\e082\"}.glyphicon-remove-sign:before{content:\"\\e083\"}.glyphicon-ok-sign:before{content:\"\\e084\"}.glyphicon-question-sign:before{content:\"\\e085\"}.glyphicon-info-sign:before{content:\"\\e086\"}.glyphicon-screenshot:before{content:\"\\e087\"}.glyphicon-remove-circle:before{content:\"\\e088\"}.glyphicon-ok-circle:before{content:\"\\e089\"}.glyphicon-ban-circle:before{content:\"\\e090\"}.glyphicon-arrow-left:before{content:\"\\e091\"}.glyphicon-arrow-right:before{content:\"\\e092\"}.glyphicon-arrow-up:before{content:\"\\e093\"}.glyphicon-arrow-down:before{content:\"\\e094\"}.glyphicon-share-alt:before{content:\"\\e095\"}.glyphicon-resize-full:before{content:\"\\e096\"}.glyphicon-resize-small:before{content:\"\\e097\"}.glyphicon-exclamation-sign:before{content:\"\\e101\"}.glyphicon-gift:before{content:\"\\e102\"}.glyphicon-leaf:before{content:\"\\e103\"}.glyphicon-fire:before{content:\"\\e104\"}.glyphicon-eye-open:before{content:\"\\e105\"}.glyphicon-eye-close:before{content:\"\\e106\"}.glyphicon-warning-sign:before{content:\"\\e107\"}.glyphicon-plane:before{content:\"\\e108\"}.glyphicon-calendar:before{content:\"\\e109\"}.glyphicon-random:before{content:\"\\e110\"}.glyphicon-comment:before{content:\"\\e111\"}.glyphicon-magnet:before{content:\"\\e112\"}.glyphicon-chevron-up:before{content:\"\\e113\"}.glyphicon-chevron-down:before{content:\"\\e114\"}.glyphicon-retweet:before{content:\"\\e115\"}.glyphicon-shopping-cart:before{content:\"\\e116\"}.glyphicon-folder-close:before{content:\"\\e117\"}.glyphicon-folder-open:before{content:\"\\e118\"}.glyphicon-resize-vertical:before{content:\"\\e119\"}.glyphicon-resize-horizontal:before{content:\"\\e120\"}.glyphicon-hdd:before{content:\"\\e121\"}.glyphicon-bullhorn:before{content:\"\\e122\"}.glyphicon-bell:before{content:\"\\e123\"}.glyphicon-certificate:before{content:\"\\e124\"}.glyphicon-thumbs-up:before{content:\"\\e125\"}.glyphicon-thumbs-down:before{content:\"\\e126\"}.glyphicon-hand-right:before{content:\"\\e127\"}.glyphicon-hand-left:before{content:\"\\e128\"}.glyphicon-hand-up:before{content:\"\\e129\"}.glyphicon-hand-down:before{content:\"\\e130\"}.glyphicon-circle-arrow-right:before{content:\"\\e131\"}.glyphicon-circle-arrow-left:before{content:\"\\e132\"}.glyphicon-circle-arrow-up:before{content:\"\\e133\"}.glyphicon-circle-arrow-down:before{content:\"\\e134\"}.glyphicon-globe:before{content:\"\\e135\"}.glyphicon-wrench:before{content:\"\\e136\"}.glyphicon-tasks:before{content:\"\\e137\"}.glyphicon-filter:before{content:\"\\e138\"}.glyphicon-briefcase:before{content:\"\\e139\"}.glyphicon-fullscreen:before{content:\"\\e140\"}.glyphicon-dashboard:before{content:\"\\e141\"}.glyphicon-paperclip:before{content:\"\\e142\"}.glyphicon-heart-empty:before{content:\"\\e143\"}.glyphicon-link:before{content:\"\\e144\"}.glyphicon-phone:before{content:\"\\e145\"}.glyphicon-pushpin:before{content:\"\\e146\"}.glyphicon-usd:before{content:\"\\e148\"}.glyphicon-gbp:before{content:\"\\e149\"}.glyphicon-sort:before{content:\"\\e150\"}.glyphicon-sort-by-alphabet:before{content:\"\\e151\"}.glyphicon-sort-by-alphabet-alt:before{content:\"\\e152\"}.glyphicon-sort-by-order:before{content:\"\\e153\"}.glyphicon-sort-by-order-alt:before{content:\"\\e154\"}.glyphicon-sort-by-attributes:before{content:\"\\e155\"}.glyphicon-sort-by-attributes-alt:before{content:\"\\e156\"}.glyphicon-unchecked:before{content:\"\\e157\"}.glyphicon-expand:before{content:\"\\e158\"}.glyphicon-collapse-down:before{content:\"\\e159\"}.glyphicon-collapse-up:before{content:\"\\e160\"}.glyphicon-log-in:before{content:\"\\e161\"}.glyphicon-flash:before{content:\"\\e162\"}.glyphicon-log-out:before{content:\"\\e163\"}.glyphicon-new-window:before{content:\"\\e164\"}.glyphicon-record:before{content:\"\\e165\"}.glyphicon-save:before{content:\"\\e166\"}.glyphicon-open:before{content:\"\\e167\"}.glyphicon-saved:before{content:\"\\e168\"}.glyphicon-import:before{content:\"\\e169\"}.glyphicon-export:before{content:\"\\e170\"}.glyphicon-send:before{content:\"\\e171\"}.glyphicon-floppy-disk:before{content:\"\\e172\"}.glyphicon-floppy-saved:before{content:\"\\e173\"}.glyphicon-floppy-remove:before{content:\"\\e174\"}.glyphicon-floppy-save:before{content:\"\\e175\"}.glyphicon-floppy-open:before{content:\"\\e176\"}.glyphicon-credit-card:before{content:\"\\e177\"}.glyphicon-transfer:before{content:\"\\e178\"}.glyphicon-cutlery:before{content:\"\\e179\"}.glyphicon-header:before{content:\"\\e180\"}.glyphicon-compressed:before{content:\"\\e181\"}.glyphicon-earphone:before{content:\"\\e182\"}.glyphicon-phone-alt:before{content:\"\\e183\"}.glyphicon-tower:before{content:\"\\e184\"}.glyphicon-stats:before{content:\"\\e185\"}.glyphicon-sd-video:before{content:\"\\e186\"}.glyphicon-hd-video:before{content:\"\\e187\"}.glyphicon-subtitles:before{content:\"\\e188\"}.glyphicon-sound-stereo:before{content:\"\\e189\"}.glyphicon-sound-dolby:before{content:\"\\e190\"}.glyphicon-sound-5-1:before{content:\"\\e191\"}.glyphicon-sound-6-1:before{content:\"\\e192\"}.glyphicon-sound-7-1:before{content:\"\\e193\"}.glyphicon-copyright-mark:before{content:\"\\e194\"}.glyphicon-registration-mark:before{content:\"\\e195\"}.glyphicon-cloud-download:before{content:\"\\e197\"}.glyphicon-cloud-upload:before{content:\"\\e198\"}.glyphicon-tree-conifer:before{content:\"\\e199\"}.glyphicon-tree-deciduous:before{content:\"\\e200\"}.glyphicon-cd:before{content:\"\\e201\"}.glyphicon-save-file:before{content:\"\\e202\"}.glyphicon-open-file:before{content:\"\\e203\"}.glyphicon-level-up:before{content:\"\\e204\"}.glyphicon-copy:before{content:\"\\e205\"}.glyphicon-paste:before{content:\"\\e206\"}.glyphicon-alert:before{content:\"\\e209\"}.glyphicon-equalizer:before{content:\"\\e210\"}.glyphicon-king:before{content:\"\\e211\"}.glyphicon-queen:before{content:\"\\e212\"}.glyphicon-pawn:before{content:\"\\e213\"}.glyphicon-bishop:before{content:\"\\e214\"}.glyphicon-knight:before{content:\"\\e215\"}.glyphicon-baby-formula:before{content:\"\\e216\"}.glyphicon-tent:before{content:\"\\26fa\"}.glyphicon-blackboard:before{content:\"\\e218\"}.glyphicon-bed:before{content:\"\\e219\"}.glyphicon-apple:before{content:\"\\f8ff\"}.glyphicon-erase:before{content:\"\\e221\"}.glyphicon-hourglass:before{content:\"\\231b\"}.glyphicon-lamp:before{content:\"\\e223\"}.glyphicon-duplicate:before{content:\"\\e224\"}.glyphicon-piggy-bank:before{content:\"\\e225\"}.glyphicon-scissors:before{content:\"\\e226\"}.glyphicon-bitcoin:before{content:\"\\e227\"}.glyphicon-btc:before{content:\"\\e227\"}.glyphicon-xbt:before{content:\"\\e227\"}.glyphicon-yen:before{content:\"\\00a5\"}.glyphicon-jpy:before{content:\"\\00a5\"}.glyphicon-ruble:before{content:\"\\20bd\"}.glyphicon-rub:before{content:\"\\20bd\"}.glyphicon-scale:before{content:\"\\e230\"}.glyphicon-ice-lolly:before{content:\"\\e231\"}.glyphicon-ice-lolly-tasted:before{content:\"\\e232\"}.glyphicon-education:before{content:\"\\e233\"}.glyphicon-option-horizontal:before{content:\"\\e234\"}.glyphicon-option-vertical:before{content:\"\\e235\"}.glyphicon-menu-hamburger:before{content:\"\\e236\"}.glyphicon-modal-window:before{content:\"\\e237\"}.glyphicon-oil:before{content:\"\\e238\"}.glyphicon-grain:before{content:\"\\e239\"}.glyphicon-sunglasses:before{content:\"\\e240\"}.glyphicon-text-size:before{content:\"\\e241\"}.glyphicon-text-color:before{content:\"\\e242\"}.glyphicon-text-background:before{content:\"\\e243\"}.glyphicon-object-align-top:before{content:\"\\e244\"}.glyphicon-object-align-bottom:before{content:\"\\e245\"}.glyphicon-object-align-horizontal:before{content:\"\\e246\"}.glyphicon-object-align-left:before{content:\"\\e247\"}.glyphicon-object-align-vertical:before{content:\"\\e248\"}.glyphicon-object-align-right:before{content:\"\\e249\"}.glyphicon-triangle-right:before{content:\"\\e250\"}.glyphicon-triangle-left:before{content:\"\\e251\"}.glyphicon-triangle-bottom:before{content:\"\\e252\"}.glyphicon-triangle-top:before{content:\"\\e253\"}.glyphicon-console:before{content:\"\\e254\"}.glyphicon-superscript:before{content:\"\\e255\"}.glyphicon-subscript:before{content:\"\\e256\"}.glyphicon-menu-left:before{content:\"\\e257\"}.glyphicon-menu-right:before{content:\"\\e258\"}.glyphicon-menu-down:before{content:\"\\e259\"}.glyphicon-menu-up:before{content:\"\\e260\"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:\"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#222222;background-color:#ffffff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#008cba;text-decoration:none}a:hover,a:focus{color:#008cba;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.4;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #dddddd}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=\"button\"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:\"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:80%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#008cba}a.text-primary:hover,a.text-primary:focus{color:#006687}.text-success{color:#43ac6a}a.text-success:hover,a.text-success:focus{color:#358753}.text-info{color:#5bc0de}a.text-info:hover,a.text-info:focus{color:#31b0d5}.text-warning{color:#e99002}a.text-warning:hover,a.text-warning:focus{color:#b67102}.text-danger{color:#f04124}a.text-danger:hover,a.text-danger:focus{color:#d32a0e}.bg-primary{color:#fff;background-color:#008cba}a.bg-primary:hover,a.bg-primary:focus{background-color:#006687}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #dddddd}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.4}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #dddddd}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.4;color:#6f6f6f}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\\2014 \\00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #dddddd;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\\00A0 \\2014'}address{margin-bottom:21px;font-style:normal;line-height:1.4}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,\"Courier New\",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:0}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.4;word-break:break-all;word-wrap:break-word;color:#333333;background-color:#f5f5f5;border:1px solid #cccccc;border-radius:0}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.4;vertical-align:top;border-top:1px solid #dddddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #dddddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #dddddd}.table .table{background-color:#ffffff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #dddddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=\"col-\"]{position:static;float:none;display:table-column}table td[class*=\"col-\"],table th[class*=\"col-\"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #dddddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type=\"search\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=\"radio\"],input[type=\"checkbox\"]{margin:4px 0 0;margin-top:1px \\9;line-height:normal}input[type=\"file\"]{display:block}input[type=\"range\"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=\"file\"]:focus,input[type=\"radio\"]:focus,input[type=\"checkbox\"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:9px;font-size:15px;line-height:1.4;color:#6f6f6f}.form-control{display:block;width:100%;height:39px;padding:8px 12px;font-size:15px;line-height:1.4;color:#6f6f6f;background-color:#ffffff;background-image:none;border:1px solid #cccccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eeeeee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=\"search\"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=\"date\"].form-control,input[type=\"time\"].form-control,input[type=\"datetime-local\"].form-control,input[type=\"month\"].form-control{line-height:39px}input[type=\"date\"].input-sm,input[type=\"time\"].input-sm,input[type=\"datetime-local\"].input-sm,input[type=\"month\"].input-sm,.input-group-sm input[type=\"date\"],.input-group-sm input[type=\"time\"],.input-group-sm input[type=\"datetime-local\"],.input-group-sm input[type=\"month\"]{line-height:36px}input[type=\"date\"].input-lg,input[type=\"time\"].input-lg,input[type=\"datetime-local\"].input-lg,input[type=\"month\"].input-lg,.input-group-lg input[type=\"date\"],.input-group-lg input[type=\"time\"],.input-group-lg input[type=\"datetime-local\"],.input-group-lg input[type=\"month\"]{line-height:60px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type=\"radio\"],.radio-inline input[type=\"radio\"],.checkbox input[type=\"checkbox\"],.checkbox-inline input[type=\"checkbox\"]{position:absolute;margin-left:-20px;margin-top:4px \\9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=\"radio\"][disabled],input[type=\"checkbox\"][disabled],input[type=\"radio\"].disabled,input[type=\"checkbox\"].disabled,fieldset[disabled] input[type=\"radio\"],fieldset[disabled] input[type=\"checkbox\"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:36px;line-height:36px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.form-group-sm select.form-control{height:36px;line-height:36px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:36px;min-height:33px;padding:9px 12px;font-size:12px;line-height:1.5}.input-lg{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:60px;line-height:60px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.form-group-lg select.form-control{height:60px;line-height:60px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:60px;min-height:40px;padding:17px 20px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:39px;height:39px;line-height:39px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:60px;height:60px;line-height:60px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:36px;height:36px;line-height:36px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#43ac6a}.has-success .form-control{border-color:#43ac6a;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#358753;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #85d0a1}.has-success .input-group-addon{color:#43ac6a;border-color:#43ac6a;background-color:#dff0d8}.has-success .form-control-feedback{color:#43ac6a}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#e99002}.has-warning .form-control{border-color:#e99002;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#b67102;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #febc53}.has-warning .input-group-addon{color:#e99002;border-color:#e99002;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#e99002}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#f04124}.has-error .form-control{border-color:#f04124;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#d32a0e;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f79483}.has-error .input-group-addon{color:#f04124;border-color:#f04124;background-color:#f2dede}.has-error .form-control-feedback{color:#f04124}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#626262}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=\"radio\"],.form-inline .checkbox input[type=\"checkbox\"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:17px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:9px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:8px 12px;font-size:15px;line-height:1.4;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333333;background-color:#e7e7e7;border-color:#cccccc}.btn-default:focus,.btn-default.focus{color:#333333;background-color:#cecece;border-color:#8c8c8c}.btn-default:hover{color:#333333;background-color:#cecece;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333333;background-color:#cecece;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333333;background-color:#bcbcbc;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#e7e7e7;border-color:#cccccc}.btn-default .badge{color:#e7e7e7;background-color:#333333}.btn-primary{color:#ffffff;background-color:#008cba;border-color:#0079a1}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#006687;border-color:#001921}.btn-primary:hover{color:#ffffff;background-color:#006687;border-color:#004b63}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#006687;border-color:#004b63}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#004b63;border-color:#001921}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#008cba;border-color:#0079a1}.btn-primary .badge{color:#008cba;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#43ac6a;border-color:#3c9a5f}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#358753;border-color:#183e26}.btn-success:hover{color:#ffffff;background-color:#358753;border-color:#2b6e44}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#358753;border-color:#2b6e44}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#2b6e44;border-color:#183e26}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#43ac6a;border-color:#3c9a5f}.btn-success .badge{color:#43ac6a;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#ffffff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#e99002;border-color:#d08002}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#b67102;border-color:#513201}.btn-warning:hover{color:#ffffff;background-color:#b67102;border-color:#935b01}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#b67102;border-color:#935b01}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#935b01;border-color:#513201}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#e99002;border-color:#d08002}.btn-warning .badge{color:#e99002;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#f04124;border-color:#ea2f10}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d32a0e;border-color:#731708}.btn-danger:hover{color:#ffffff;background-color:#d32a0e;border-color:#b1240c}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d32a0e;border-color:#b1240c}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b1240c;border-color:#731708}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#f04124;border-color:#ea2f10}.btn-danger .badge{color:#f04124;background-color:#ffffff}.btn-link{color:#008cba;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#008cba;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm,.btn-group-sm>.btn{padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs,.btn-group-xs>.btn{padding:4px 6px;font-size:12px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=\"submit\"].btn-block,input[type=\"reset\"].btn-block,input[type=\"button\"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#ffffff;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:rgba(0,0,0,0.2)}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.4;color:#555555;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#eeeeee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#008cba}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.4;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \\9;content:\"\"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=\"buttons\"]>.btn input[type=\"radio\"],[data-toggle=\"buttons\"]>.btn-group>.btn input[type=\"radio\"],[data-toggle=\"buttons\"]>.btn input[type=\"checkbox\"],[data-toggle=\"buttons\"]>.btn-group>.btn input[type=\"checkbox\"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=\"col-\"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:60px;line-height:60px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:36px;line-height:36px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:8px 12px;font-size:15px;font-weight:normal;line-height:1;color:#6f6f6f;text-align:center;background-color:#eeeeee;border:1px solid #cccccc;border-radius:0}.input-group-addon.input-sm{padding:8px 12px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:16px 20px;font-size:19px;border-radius:0}.input-group-addon input[type=\"radio\"],.input-group-addon input[type=\"checkbox\"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee}.nav>li.disabled>a{color:#999999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eeeeee;border-color:#008cba}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #dddddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.4;border:1px solid transparent;border-radius:0 0 0 0}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#6f6f6f;background-color:#ffffff;border:1px solid #dddddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#ffffff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#008cba}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #dddddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #dddddd;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#ffffff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:45px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:0}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:12px 15px;font-size:19px;line-height:21px;height:45px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:5.5px;margin-bottom:5.5px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:6px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:12px;padding-bottom:12px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:3px;margin-bottom:3px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=\"radio\"],.navbar-form .checkbox input[type=\"checkbox\"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:3px;margin-bottom:3px}.navbar-btn.btn-sm{margin-top:4.5px;margin-bottom:4.5px}.navbar-btn.btn-xs{margin-top:11.5px;margin-bottom:11.5px}.navbar-text{margin-top:12px;margin-bottom:12px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#333333;border-color:#222222}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:transparent}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#222222}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#272727;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#272727}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#ffffff}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#ffffff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#008cba;border-color:#006687}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#ffffff;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#007196}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#006687;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#006687}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444444;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#ffffff}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#ffffff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444444}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:\"/\\00a0\";padding:0 5px;color:#999999}.breadcrumb>.active{color:#333333}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:8px 12px;line-height:1.4;text-decoration:none;color:#008cba;background-color:transparent;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#008cba;background-color:#eeeeee;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#ffffff;background-color:#008cba;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999999;background-color:#ffffff;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:16px 20px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:8px 12px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:transparent;border:1px solid transparent;border-radius:3px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eeeeee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:transparent;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#008cba}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#006687}.label-success{background-color:#43ac6a}.label-success[href]:hover,.label-success[href]:focus{background-color:#358753}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#e99002}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b67102}.label-danger{background-color:#f04124}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d32a0e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#008cba;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#008cba;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#fafafa}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#e1e1e1}.container .jumbotron,.container-fluid .jumbotron{border-radius:0;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.4;background-color:#ffffff;border:1px solid #dddddd;border-radius:0;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#008cba}.thumbnail .caption{padding:9px;color:#222222}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#43ac6a;border-color:#3c9a5f;color:#ffffff}.alert-success hr{border-top-color:#358753}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#5bc0de;border-color:#3db5d8;color:#ffffff}.alert-info hr{border-top-color:#2aabd2}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#e99002;border-color:#d08002;color:#ffffff}.alert-warning hr{border-top-color:#b67102}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#f04124;border-color:#ea2f10;color:#ffffff}.alert-danger hr{border-top-color:#d32a0e}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#f5f5f5;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:21px;color:#ffffff;text-align:center;background-color:#008cba;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#43ac6a}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#e99002}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#f04124}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#ffffff;border:1px solid #dddddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item,button.list-group-item{color:#555555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eeeeee;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#008cba;border-color:#008cba}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#87e1ff}.list-group-item-success{color:#43ac6a;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#43ac6a}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#43ac6a;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#43ac6a;border-color:#43ac6a}.list-group-item-info{color:#5bc0de;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#5bc0de}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#5bc0de;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.list-group-item-warning{color:#e99002;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#e99002}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#e99002;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#e99002;border-color:#e99002}.list-group-item-danger{color:#f04124;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#f04124}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#f04124;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#f04124;border-color:#f04124}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#ffffff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #dddddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #dddddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #dddddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #dddddd}.panel-default{border-color:#dddddd}.panel-default>.panel-heading{color:#333333;background-color:#f5f5f5;border-color:#dddddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#dddddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#dddddd}.panel-primary{border-color:#008cba}.panel-primary>.panel-heading{color:#ffffff;background-color:#008cba;border-color:#008cba}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#008cba}.panel-primary>.panel-heading .badge{color:#008cba;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#008cba}.panel-success{border-color:#3c9a5f}.panel-success>.panel-heading{color:#ffffff;background-color:#43ac6a;border-color:#3c9a5f}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3c9a5f}.panel-success>.panel-heading .badge{color:#43ac6a;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3c9a5f}.panel-info{border-color:#3db5d8}.panel-info>.panel-heading{color:#ffffff;background-color:#5bc0de;border-color:#3db5d8}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3db5d8}.panel-info>.panel-heading .badge{color:#5bc0de;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3db5d8}.panel-warning{border-color:#d08002}.panel-warning>.panel-heading{color:#ffffff;background-color:#e99002;border-color:#d08002}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d08002}.panel-warning>.panel-heading .badge{color:#e99002;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d08002}.panel-danger{border-color:#ea2f10}.panel-danger>.panel-heading{color:#ffffff;background-color:#f04124;border-color:#ea2f10}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ea2f10}.panel-danger>.panel-heading .badge{color:#f04124;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ea2f10}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #e8e8e8;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#ffffff;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.4}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:\"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.4;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#333333;border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#333333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#333333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#333333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#333333}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:\"Open Sans\",\"Helvetica Neue\",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.4;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#333333;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #333333;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#333333;border-bottom:1px solid #262626;border-radius:-1 -1 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:\"\"}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#000000;border-top-color:rgba(0,0,0,0.05);bottom:-11px}.popover.top>.arrow:after{content:\" \";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#333333}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#000000;border-right-color:rgba(0,0,0,0.05)}.popover.right>.arrow:after{content:\" \";left:1px;bottom:-10px;border-left-width:0;border-right-color:#333333}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#000000;border-bottom-color:rgba(0,0,0,0.05);top:-11px}.popover.bottom>.arrow:after{content:\" \";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#333333}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#000000;border-left-color:rgba(0,0,0,0.05)}.popover.left>.arrow:after{content:\" \";right:1px;border-right-width:0;border-left-color:#333333;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\\2039'}.carousel-control .icon-next:before{content:'\\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \\9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:\" \";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border:none;font-size:13px;font-weight:300}.navbar .navbar-toggle:hover .icon-bar{background-color:#b3b3b3}.navbar-collapse{border-top-color:rgba(0,0,0,0.2);-webkit-box-shadow:none;box-shadow:none}.navbar .btn{padding-top:6px;padding-bottom:6px}.navbar-form{margin-top:7px;margin-bottom:5px}.navbar-form .form-control{height:auto;padding:4px 6px}.navbar-text{margin:12px 15px;line-height:21px}.navbar .dropdown-menu{border:none}.navbar .dropdown-menu>li>a,.navbar .dropdown-menu>li>a:focus{background-color:transparent;font-size:13px;font-weight:300}.navbar .dropdown-header{color:rgba(255,255,255,0.5)}.navbar-default .dropdown-menu{background-color:#333333}.navbar-default .dropdown-menu>li>a,.navbar-default .dropdown-menu>li>a:focus{color:#ffffff}.navbar-default .dropdown-menu>li>a:hover,.navbar-default .dropdown-menu>.active>a,.navbar-default .dropdown-menu>.active>a:hover{background-color:#272727}.navbar-inverse .dropdown-menu{background-color:#008cba}.navbar-inverse .dropdown-menu>li>a,.navbar-inverse .dropdown-menu>li>a:focus{color:#ffffff}.navbar-inverse .dropdown-menu>li>a:hover,.navbar-inverse .dropdown-menu>.active>a,.navbar-inverse .dropdown-menu>.active>a:hover{background-color:#006687}.btn{padding:8px 12px}.btn-lg{padding:16px 20px}.btn-sm{padding:8px 12px}.btn-xs{padding:4px 6px}.btn-group .btn~.dropdown-toggle{padding-left:16px;padding-right:16px}.btn-group .dropdown-menu{border-top-width:0}.btn-group.dropup .dropdown-menu{border-top-width:1px;border-bottom-width:0;margin-bottom:0}.btn-group .dropdown-toggle.btn-default~.dropdown-menu{background-color:#e7e7e7;border-color:#cccccc}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a{color:#333333}.btn-group .dropdown-toggle.btn-default~.dropdown-menu>li>a:hover{background-color:#d3d3d3}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu{background-color:#008cba;border-color:#0079a1}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-primary~.dropdown-menu>li>a:hover{background-color:#006d91}.btn-group .dropdown-toggle.btn-success~.dropdown-menu{background-color:#43ac6a;border-color:#3c9a5f}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-success~.dropdown-menu>li>a:hover{background-color:#388f58}.btn-group .dropdown-toggle.btn-info~.dropdown-menu{background-color:#5bc0de;border-color:#46b8da}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-info~.dropdown-menu>li>a:hover{background-color:#39b3d7}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu{background-color:#e99002;border-color:#d08002}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-warning~.dropdown-menu>li>a:hover{background-color:#c17702}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu{background-color:#f04124;border-color:#ea2f10}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a{color:#ffffff}.btn-group .dropdown-toggle.btn-danger~.dropdown-menu>li>a:hover{background-color:#dc2c0f}.lead{color:#6f6f6f}cite{font-style:italic}blockquote{border-left-width:1px;color:#6f6f6f}blockquote.pull-right{border-right-width:1px}blockquote small{font-size:12px;font-weight:300}table{font-size:12px}label,.control-label,.help-block,.checkbox,.radio{font-size:12px;font-weight:normal}input[type=\"radio\"],input[type=\"checkbox\"]{margin-top:1px}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:transparent}.nav-tabs>li>a{background-color:#e7e7e7;color:#222222}.nav-tabs .caret{border-top-color:#222222;border-bottom-color:#222222}.nav-pills{font-weight:300}.breadcrumb{border:1px solid #dddddd;border-radius:3px;font-size:10px;font-weight:300;text-transform:uppercase}.pagination{font-size:12px;font-weight:300;color:#999999}.pagination>li>a,.pagination>li>span{margin-left:4px;color:#999999}.pagination>.active>a,.pagination>.active>span{color:#fff}.pagination>li>a,.pagination>li:first-child>a,.pagination>li:last-child>a,.pagination>li>span,.pagination>li:first-child>span,.pagination>li:last-child>span{border-radius:3px}.pagination-lg>li>a,.pagination-lg>li>span{padding-left:22px;padding-right:22px}.pagination-sm>li>a,.pagination-sm>li>span{padding:0 5px}.pager{font-size:12px;font-weight:300;color:#999999}.list-group{font-size:12px;font-weight:300}.close{opacity:0.4;text-decoration:none;text-shadow:none}.close:hover,.close:focus{opacity:1}.alert{font-size:12px;font-weight:300}.alert .alert-link{font-weight:normal;color:#fff;text-decoration:underline}.label{padding-left:1em;padding-right:1em;border-radius:0;font-weight:300}.label-default{background-color:#e7e7e7;color:#333333}.badge{font-weight:300}.progress{height:22px;padding:2px;background-color:#f6f6f6;border:1px solid #ccc;-webkit-box-shadow:none;box-shadow:none}.dropdown-menu{padding:0;margin-top:0;font-size:12px}.dropdown-menu>li>a{padding:12px 15px}.dropdown-header{padding-left:15px;padding-right:15px;font-size:9px;text-transform:uppercase}.popover{color:#fff;font-size:12px;font-weight:300}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.panel-default .close{color:#222222}.modal .close{color:#222222}"
  },
  {
    "path": "server/static/lib/bootstrap-3.3.7/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under the MIT license\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  'use strict';\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.7\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.7\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.7'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector === '#' ? [] : selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.7\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.7'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state += 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d).prop(d, true)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d).prop(d, false)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked')) changed = false\n        $parent.find('.active').removeClass('active')\n        this.$element.addClass('active')\n      } else if ($input.prop('type') == 'checkbox') {\n        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false\n        this.$element.toggleClass('active')\n      }\n      $input.prop('checked', this.$element.hasClass('active'))\n      if (changed) $input.trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n      this.$element.toggleClass('active')\n    }\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target).closest('.btn')\n      Plugin.call($btn, 'toggle')\n      if (!($(e.target).is('input[type=\"radio\"], input[type=\"checkbox\"]'))) {\n        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes\n        e.preventDefault()\n        // The target component still receive the focus\n        if ($btn.is('input,button')) $btn.trigger('focus')\n        else $btn.find('input:visible,button:visible').first().trigger('focus')\n      }\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.7\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      = null\n    this.sliding     = null\n    this.interval    = null\n    this.$active     = null\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.7'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var activeIndex = this.getItemIndex(active)\n    var willWrap = (direction == 'prev' && activeIndex === 0)\n                || (direction == 'next' && activeIndex == (this.$items.length - 1))\n    if (willWrap && !this.options.wrap) return active\n    var delta = direction == 'prev' ? -1 : 1\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var that      = this\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.7\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n/* jshint latedef: false */\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $('[data-toggle=\"collapse\"][href=\"#' + element.id + '\"],' +\n                           '[data-toggle=\"collapse\"][data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.7'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.7\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.7'\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))\n    })\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $(document.createElement('div'))\n          .addClass('dropdown-backdrop')\n          .insertAfter($(this))\n          .on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger($.Event('shown.bs.dropdown', relatedTarget))\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive && e.which != 27 || isActive && e.which == 27) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.disabled):visible a'\n    var $items = $parent.find('.dropdown-menu' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--         // up\n    if (e.which == 40 && index < $items.length - 1) index++         // down\n    if (!~index)                                    index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.7\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options             = options\n    this.$body               = $(document.body)\n    this.$element            = $(element)\n    this.$dialog             = this.$element.find('.modal-dialog')\n    this.$backdrop           = null\n    this.isShown             = null\n    this.originalBodyPad     = null\n    this.scrollbarWidth      = 0\n    this.ignoreBackdropClick = false\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.7'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.$dialog.on('mousedown.dismiss.bs.modal', function () {\n      that.$element.one('mouseup.dismiss.bs.modal', function (e) {\n        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true\n      })\n    })\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element.addClass('in')\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$dialog // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .off('click.dismiss.bs.modal')\n      .off('mouseup.dismiss.bs.modal')\n\n    this.$dialog.off('mousedown.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (document !== e.target &&\n            this.$element[0] !== e.target &&\n            !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $(document.createElement('div'))\n        .addClass('modal-backdrop ' + animate)\n        .appendTo(this.$body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (this.ignoreBackdropClick) {\n          this.ignoreBackdropClick = false\n          return\n        }\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus()\n          : this.hide()\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    var fullWindowWidth = window.innerWidth\n    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8\n      var documentElementRect = document.documentElement.getBoundingClientRect()\n      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)\n    }\n    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    this.originalBodyPad = document.body.style.paddingRight || ''\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', this.originalBodyPad)\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.7\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       = null\n    this.options    = null\n    this.enabled    = null\n    this.timeout    = null\n    this.hoverState = null\n    this.$element   = null\n    this.inState    = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.7'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))\n    this.inState   = { click: false, hover: false, focus: false }\n\n    if (this.$element[0] instanceof document.constructor && !this.options.selector) {\n      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')\n    }\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true\n    }\n\n    if (self.tip().hasClass('in') || self.hoverState == 'in') {\n      self.hoverState = 'in'\n      return\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.isInStateTrue = function () {\n    for (var key in this.inState) {\n      if (this.inState[key]) return true\n    }\n\n    return false\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    if (obj instanceof $.Event) {\n      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false\n    }\n\n    if (self.isInStateTrue()) return\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n      this.$element.trigger('inserted.bs.' + this.type)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var viewportDim = this.getPosition(this.$viewport)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  += marginTop\n    offset.left += marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {\n    this.arrow()\n      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isVertical ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = $(this.$tip)\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.\n        that.$element\n          .removeAttr('aria-describedby')\n          .trigger('hidden.bs.' + that.type)\n      }\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && $tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var isSvg = window.SVGElement && el instanceof window.SVGElement\n    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.\n    // See https://github.com/twbs/bootstrap/issues/20280\n    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    if (!this.$tip) {\n      this.$tip = $(this.options.template)\n      if (this.$tip.length != 1) {\n        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')\n      }\n    }\n    return this.$tip\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    if (e) {\n      self.inState.click = !self.inState.click\n      if (self.isInStateTrue()) self.enter(self)\n      else self.leave(self)\n    } else {\n      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n    }\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n      if (that.$tip) {\n        that.$tip.detach()\n      }\n      that.$tip = null\n      that.$arrow = null\n      that.$viewport = null\n      that.$element = null\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.7\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.7'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && /destroy|hide/.test(option)) return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.7\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    this.$body          = $(document.body)\n    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.7'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var that          = this\n    var offsetMethod  = 'offset'\n    var offsetBase    = 0\n\n    this.offsets      = []\n    this.targets      = []\n    this.scrollHeight = this.getScrollHeight()\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        that.offsets.push(this[0])\n        that.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n      '[data-target=\"' + target + '\"],' +\n      this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.7\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    // jscs:disable requireDollarBeforejQueryAssignment\n    this.element = $(element)\n    // jscs:enable requireDollarBeforejQueryAssignment\n  }\n\n  Tab.VERSION = '3.3.7'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu').length) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.7\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      = null\n    this.unpin        = null\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.7'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && scrollTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = Math.max($(document).height(), $(document.body).height())\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "server/static/lib/bootstrap-3.3.7/js/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "server/static/lib/bootstrap-table-treegrid.js",
    "content": "(function ($) {\n    'use strict';\n\n    var sprintf = function (str) {\n        var args = arguments,\n            flag = true,\n            i = 1;\n\n        str = str.replace(/%s/g, function () {\n            var arg = args[i++];\n\n            if (typeof arg === 'undefined') {\n                flag = false;\n                return '';\n            }\n            return arg;\n        });\n        return flag ? str : '';\n    };\n\n    var getFieldIndex = function (columns, field) {\n        var index = -1;\n\n        $.each(columns, function (i, column) {\n            if (column.field === field) {\n                index = i;\n                return false;\n            }\n            return true;\n        });\n        return index;\n    };\n\n    var calculateObjectValue = function (self, name, args, defaultValue) {\n        var func = name;\n\n        if (typeof name === 'string') {\n            var names = name.split('.');\n\n            if (names.length > 1) {\n                func = window;\n                $.each(names, function (i, f) {\n                    func = func[f];\n                });\n            } else {\n                func = window[name];\n            }\n        }\n        if (typeof func === 'object') {\n            return func;\n        }\n        if (typeof func === 'function') {\n            return func.apply(self, args);\n        }\n        if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {\n            return sprintf.apply(this, [name].concat(args));\n        }\n        return defaultValue;\n    };\n\n    var getItemField = function (item, field) {\n        var value = item;\n\n        if (typeof field !== 'string' || item.hasOwnProperty(field)) {\n            return item[field];\n        }\n        var props = field.split('.');\n        for (var p in props) {\n            value = value[props[p]];\n        }\n        return value;\n    };\n\n    var getParent = function (node, source, field) {\n        var data = [];\n        var items = $.grep(source, function (item, index) {\n            return node.parentId == item[field];\n        });\n        $.each(items, function (index, item) {\n            data.splice(0, 0, item);\n            var child = getParent(item, source, field);\n            $.each(child, function (i, n) {\n                data.splice(0, 0, n);\n            });\n        });\n        return data;\n    };\n\n    var getChild = function (node, source, field) {\n        var items = $.grep(source, function (item, index) {\n            return item.parentId == node[field];\n        });\n        return items;\n    };\n\n    var getAllChild = function (node, source, field) {\n        var data = [];\n        var g=function(child){\n            $.each(child, function (i, n) {\n                data.push(n);\n                var subChild = getChild(n, source, field);\n                if(subChild!=null && subChild.length>0){\n                    g(subChild);\n                }\n            });\n        }\n        var child = getChild(node, source, field);\n        g(child);\n        return data;\n    };\n\n    //调用bootstrapTable组件的构造器得到对象\n    var BootstrapTable = $.fn.bootstrapTable.Constructor,\n        _initData = BootstrapTable.prototype.initData,\n        _initPagination = BootstrapTable.prototype.initPagination;\n\n    //重写bootstrapTable的initData方法\n    BootstrapTable.prototype.initData = function () {\n        _initData.apply(this, Array.prototype.slice.apply(arguments));\n        var that = this;\n        //初始化数据，添加level,isLeaf 属性\n        if (that.options.treeView && this.data.length > 0) {\n            var rows = [],levelStep=1;\n\n            var roots = $.grep(this.data, function (row, index) {\n                return row.parentId == null;\n            });\n            var g=function(child){\n                var childLevel=that.options.treeRootLevel+levelStep;\n                $.each(child, function (i, n) {\n                    n.level=childLevel;\n                    if (that.options.treeCollapseAll) {\n                        n.hidden = true;\n                    }\n                    var subChild = getChild(n, that.data, that.options.treeId);\n                    if(subChild==null || subChild.length==0){\n                        n.isLeaf=true;\n                    }\n                    rows.push(n);\n                    if(subChild!=null && subChild.length>0){\n                        levelStep++;\n                        g(subChild);\n                    }else{\n                        levelStep=1;\n                    }\n                });\n            }\n            $.each(roots, function (index, item) {\n                item.level=that.options.treeRootLevel;\n                var child = getChild(item, that.data, that.options.treeId);\n                if(child==null || child.length==0){\n                    item.isLeaf=true;\n                }\n                rows.push(item);\n                g(child);\n            });\n            that.options.data = that.data = rows;\n        }\n    };\n\n    //重写bootstrapTable的initPagination方法\n    BootstrapTable.prototype.initPagination = function () {\n        //理论情况下，treegrid是不支持分页的，所以默认分页参数为false\n        this.options.pagination = false;\n         //调用“父类”的“虚方法”\n        _initPagination.apply(this, Array.prototype.slice.apply(arguments));\n    };\n\n    //重写bootstrapTable的initRow方法\n\n    BootstrapTable.prototype.initRow = function(item, i, data, parentDom) {\n        var that=this,\n            key,\n            html = [],\n            style = {},\n            csses = [],\n            data_ = '',\n            attributes = {},\n            htmlAttributes = [];\n\n        if ($.inArray(item, this.hiddenRows) > -1) {\n            return;\n        }\n\n        style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);\n\n        if (style && style.css) {\n            for (key in style.css) {\n                csses.push(key + ': ' + style.css[key]);\n            }\n        }\n\n        attributes = calculateObjectValue(this.options,\n            this.options.rowAttributes, [item, i], attributes);\n\n        if (attributes) {\n            for (key in attributes) {\n                htmlAttributes.push(sprintf('%s=\"%s\"', key, escapeHTML(attributes[key])));\n            }\n        }\n\n        if (item._data && !$.isEmptyObject(item._data)) {\n            $.each(item._data, function(k, v) {\n                // ignore data-index\n                if (k === 'index') {\n                    return;\n                }\n                data_ += sprintf(' data-%s=\"%s\"', k, v);\n            });\n        }\n\n        html.push('<tr',\n            sprintf(' %s', htmlAttributes.join(' ')),\n            sprintf(' id=\"%s\"', $.isArray(item) ? undefined : item._id),\n            sprintf(' class=\"%s\"', style.classes || ($.isArray(item) ? undefined : item._class)),\n            sprintf(' data-index=\"%s\"', i),\n            sprintf(' data-uniqueid=\"%s\"', item[this.options.uniqueId]),\n            sprintf('%s', data_),\n            '>'\n        );\n\n        if (this.options.cardView) {\n            html.push(sprintf('<td colspan=\"%s\"><div class=\"card-views\">', this.header.fields.length));\n        }\n\n        if (!this.options.cardView && this.options.detailView) {\n            html.push('<td>',\n                '<a class=\"detail-icon\" href=\"#\">',\n                sprintf('<i class=\"%s %s\"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),\n                '</a>',\n                '</td>');\n        }\n\n        $.each(this.header.fields, function(j, field) {\n            var text = '',\n                value_ = getItemField(item, field, that.options.escape),\n                value = '',\n                type = '',\n                cellStyle = {},\n                id_ = '',\n                class_ = that.header.classes[j],\n                data_ = '',\n                rowspan_ = '',\n                colspan_ = '',\n                title_ = '',\n                column = that.columns[j];\n\n            if (that.fromHtml && typeof value_ === 'undefined') {\n                return;\n            }\n\n            if (!column.visible) {\n                return;\n            }\n\n            if (that.options.cardView && (!column.cardVisible)) {\n                return;\n            }\n\n            if (column.escape) {\n                value_ = escapeHTML(value_);\n            }\n\n            style = sprintf('style=\"%s\"', csses.concat(that.header.styles[j]).join('; '));\n\n            // handle td's id and class\n            if (item['_' + field + '_id']) {\n                id_ = sprintf(' id=\"%s\"', item['_' + field + '_id']);\n            }\n            if (item['_' + field + '_class']) {\n                class_ = sprintf(' class=\"%s\"', item['_' + field + '_class']);\n            }\n            if (item['_' + field + '_rowspan']) {\n                rowspan_ = sprintf(' rowspan=\"%s\"', item['_' + field + '_rowspan']);\n            }\n            if (item['_' + field + '_colspan']) {\n                colspan_ = sprintf(' colspan=\"%s\"', item['_' + field + '_colspan']);\n            }\n            if (item['_' + field + '_title']) {\n                title_ = sprintf(' title=\"%s\"', item['_' + field + '_title']);\n            }\n            cellStyle = calculateObjectValue(that.header,\n                that.header.cellStyles[j], [value_, item, i, field], cellStyle);\n            if (cellStyle.classes) {\n                class_ = sprintf(' class=\"%s\"', cellStyle.classes);\n            }\n            if (cellStyle.css) {\n                var csses_ = [];\n                for (var key in cellStyle.css) {\n                    csses_.push(key + ': ' + cellStyle.css[key]);\n                }\n                style = sprintf('style=\"%s\"', csses_.concat(that.header.styles[j]).join('; '));\n            }\n\n            value = calculateObjectValue(column,\n                that.header.formatters[j], [value_, item, i], value_);\n\n            if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {\n                $.each(item['_' + field + '_data'], function(k, v) {\n                    // ignore data-index\n                    if (k === 'index') {\n                        return;\n                    }\n                    data_ += sprintf(' data-%s=\"%s\"', k, v);\n                });\n            }\n\n            if (column.checkbox || column.radio) {\n                type = column.checkbox ? 'checkbox' : type;\n                type = column.radio ? 'radio' : type;\n\n                text = [sprintf(that.options.cardView ?\n                        '<div class=\"card-view %s\">' : '<td class=\"bs-checkbox %s\">', column['class'] || ''),\n                    '<input' +\n                    sprintf(' data-index=\"%s\"', i) +\n                    sprintf(' name=\"%s\"', that.options.selectItemName) +\n                    sprintf(' type=\"%s\"', type) +\n                    sprintf(' value=\"%s\"', item[that.options.idField]) +\n                    sprintf(' checked=\"%s\"', value === true ||\n                        (value_ || value && value.checked) ? 'checked' : undefined) +\n                    sprintf(' disabled=\"%s\"', !column.checkboxEnabled ||\n                        (value && value.disabled) ? 'disabled' : undefined) +\n                    ' />',\n                    that.header.formatters[j] && typeof value === 'string' ? value : '',\n                    that.options.cardView ? '</div>' : '</td>'\n                ].join('');\n\n                item[that.header.stateField] = value === true || (value && value.checked);\n            } else {\n                value = typeof value === 'undefined' || value === null ?\n                    that.options.undefinedText : value;\n                    //渲染tree展开图标，下面text中添加了indent和icon。\n                    var indent, icon;\n                    if (that.options.treeView && column.field == that.options.treeField) {\n                        var indent = item.level == that.options.treeRootLevel ? '' : sprintf('<span style=\"margin-left: %spx;\"></span>', (item.level - that.options.treeRootLevel) * 15);\n                        var child = $.grep(data, function (d, i) {\n                            return d.parentId == item[that.options.treeId] && !d.hidden;\n                        });\n                        icon = sprintf('<span class=\"tree-icon %s\" style=\"cursor: pointer; margin: 0px 5px;\"></span>', child.length > 0 ? that.options.expandIcon : that.options.collapseIcon);\n                        if(item.isLeaf){\n                            icon = sprintf('<span class=\"tree-icon %s\" style=\"cursor: pointer; margin: 0px 5px;\"></span>', that.options.leafIcon);\n                        }\n                    }\n                    //end\n                text = that.options.cardView ? ['<div class=\"card-view\">',\n                    that.options.showHeader ? sprintf('<span class=\"title\" %s>%s</span>', style,\n                        getPropertyFromOther(that.columns, 'field', 'title', field)) : '',\n                    sprintf('<span class=\"value\">%s</span>', value),\n                    '</div>'\n                ].join('') : [sprintf('<td%s %s %s %s %s %s %s>',\n                        id_, class_, style, data_, rowspan_, colspan_, title_),\n                        indent,icon,\n                    value,\n                    '</td>'\n                ].join('');\n\n                // Hide empty data on Card view when smartDisplay is set to true.\n                if (that.options.cardView && that.options.smartDisplay && value === '') {\n                    // Should set a placeholder for event binding correct fieldIndex\n                    text = '<div class=\"card-view\"></div>';\n                }\n            }\n\n            html.push(text);\n        });\n\n        if (this.options.cardView) {\n            html.push('</div></td>');\n        }\n        html.push('</tr>');\n\n        return html.join(' ');\n    };\n    //重写bootstrapTable的initBody方法\n    BootstrapTable.prototype.initBody = function (fixedScroll) {\n        var that = this,\n            html = [],\n            data = this.getData();\n\n        this.trigger('pre-body', data);\n\n        this.$body = this.$el.find('>tbody');\n        if (!this.$body.length) {\n            this.$body = $('<tbody></tbody>').appendTo(this.$el);\n        }\n\n        //Fix #389 Bootstrap-table-flatJSON is not working\n\n        if (!this.options.pagination || this.options.sidePagination === 'server') {\n            this.pageFrom = 1;\n            this.pageTo = data.length;\n        }\n\n        var trFragments = $(document.createDocumentFragment());\n        var hasTr;\n\n        for (var i = this.pageFrom - 1; i < this.pageTo; i++) {\n            var item = data[i];\n            if (item.hidden) continue;//hidden属性,当前行不渲染\n            var tr = this.initRow(item, i, data, trFragments);\n            hasTr = hasTr || !!tr;\n            if (tr&&tr!==true) {\n                trFragments.append(tr);\n            }\n        }\n\n        // show no records\n        if (!hasTr) {\n            trFragments.append('<tr class=\"no-records-found\">' +\n                sprintf('<td colspan=\"%s\">%s</td>',\n                this.$header.find('th').length,\n                this.options.formatNoMatches()) +\n                '</tr>');\n        }\n\n        this.$body.html(trFragments);\n\n        if (!fixedScroll) {\n            this.scrollTo(0);\n        }\n\n        // click to select by column\n        this.$body.find('> tr[data-index] > td').off('click dblclick').on('click dblclick', function (e) {\n            var $td = $(this),\n                $tr = $td.parent(),\n                item = that.data[$tr.data('index')],\n                index = $td[0].cellIndex,\n                fields = that.getVisibleFields(),\n                field = fields[that.options.detailView && !that.options.cardView ? index - 1 : index],\n                column = that.columns[getFieldIndex(that.columns, field)],\n                value = getItemField(item, field, that.options.escape);\n\n            if ($td.find('.detail-icon').length) {\n                return;\n            }\n\n            that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);\n            that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr, field);\n\n            // if click to select - then trigger the checkbox/radio click\n            if (e.type === 'click' && that.options.clickToSelect && column.clickToSelect) {\n                var $selectItem = $tr.find(sprintf('[name=\"%s\"]', that.options.selectItemName));\n                if ($selectItem.length) {\n                    $selectItem[0].click(); // #144: .trigger('click') bug\n                }\n            }\n        });\n\n        this.$body.find('> tr[data-index] > td > .detail-icon').off('click').on('click', function () {\n            var $this = $(this),\n                $tr = $this.parent().parent(),\n                index = $tr.data('index'),\n                row = data[index]; // Fix #980 Detail view, when searching, returns wrong row\n\n            // remove and update\n            if ($tr.next().is('tr.detail-view')) {\n                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));\n                that.trigger('collapse-row', index, row);\n                $tr.next().remove();\n            } else {\n                $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));\n                $tr.after(sprintf('<tr class=\"detail-view\"><td colspan=\"%s\"></td></tr>', $tr.find('td').length));\n                var $element = $tr.next().find('td');\n                var content = calculateObjectValue(that.options, that.options.detailFormatter, [index, row, $element], '');\n                if($element.length === 1) {\n                    $element.append(content);\n                }\n                that.trigger('expand-row', index, row, $element);\n            }\n            that.resetView();\n            return false;\n        });\n        //treeicon点击事件\n        this.$body.find('> tr[data-index] > td > .tree-icon').off('click').on('click', function (e) {\n            e.stopPropagation();\n            var $this = $(this),\n                $tr = $this.parent().parent(),\n                index = $tr.data('index'),\n                row = data[index];\n            var icon = $(this);\n            if(icon.hasClass(that.options.expandIcon)){\n                //展开状态\n                icon.removeClass(that.options.expandIcon).addClass(that.options.collapseIcon);\n                var child = getAllChild(data[index], data, that.options.treeId);\n                $.each(child, function (i, c) {\n                    $.each(that.data, function (index, item) {\n                        if (item[that.options.treeId] == c[that.options.treeId]) {\n                            item.hidden = true;\n                            return;\n                        }\n                    });\n                });\n            }else{\n                icon.removeClass(that.options.collapseIcon).addClass(that.options.expandIcon);\n                var child = getChild(data[index], data, that.options.treeId);\n                $.each(child, function (i, c) {\n                    $.each(that.data, function (index, item) {\n                        if (item[that.options.treeId] == c[that.options.treeId]) {\n                            item.hidden = false;\n                            return;\n                        }\n                    });\n                });\n            }\n            that.options.data = that.data;\n            that.initBody(true);\n        });\n        //end\n\n        this.$selectItem = this.$body.find(sprintf('[name=\"%s\"]', this.options.selectItemName));\n        this.$selectItem.off('click').on('click', function (event) {\n            event.stopImmediatePropagation();\n\n            var $this = $(this),\n                checked = $this.prop('checked'),\n                row = that.data[$this.data('index')];\n\n            if (that.options.maintainSelected && $(this).is(':radio')) {\n                $.each(that.options.data, function (i, row) {\n                    row[that.header.stateField] = false;\n                });\n            }\n\n            row[that.header.stateField] = checked;\n\n            if (that.options.singleSelect) {\n                that.$selectItem.not(this).each(function () {\n                    that.data[$(this).data('index')][that.header.stateField] = false;\n                });\n                that.$selectItem.filter(':checked').not(this).prop('checked', false);\n            }\n\n            that.updateSelected();\n            that.trigger(checked ? 'check' : 'uncheck', row, $this);\n        });\n\n        $.each(this.header.events, function (i, events) {\n            if (!events) {\n                return;\n            }\n            // fix bug, if events is defined with namespace\n            if (typeof events === 'string') {\n                events = calculateObjectValue(null, events);\n            }\n\n            var field = that.header.fields[i],\n                fieldIndex = $.inArray(field, that.getVisibleFields());\n\n            if (that.options.detailView && !that.options.cardView) {\n                fieldIndex += 1;\n            }\n\n            for (var key in events) {\n                that.$body.find('>tr:not(.no-records-found)').each(function () {\n                    var $tr = $(this),\n                        $td = $tr.find(that.options.cardView ? '.card-view' : 'td').eq(fieldIndex),\n                        index = key.indexOf(' '),\n                        name = key.substring(0, index),\n                        el = key.substring(index + 1),\n                        func = events[key];\n\n                    $td.find(el).off(name).on(name, function (e) {\n                        var index = $tr.data('index'),\n                            row = that.data[index],\n                            value = row[field];\n\n                        func.apply(this, [e, value, row, index]);\n                    });\n                });\n            }\n        });\n\n        this.updateSelected();\n        this.resetView();\n\n        this.trigger('post-body', data);\n    };\n\n\n    /**\n     * 展开所有树节点\n     */\n    BootstrapTable.prototype.expandAllTree = function ()\n    {\n        var that=this;\n        var roots = $.grep(this.data, function (row, index) {\n            return row.parentId == null;\n        });\n        $.each(roots, function (index, item) {\n            var child = getAllChild(item, that.options.data, that.options.treeId);\n            $.each(child, function (i, n) {\n                n.hidden=false;\n            });\n        });\n        that.initBody(true);\n\n    }\n    /**\n     * 闭合所有树节点\n     */\n    BootstrapTable.prototype.collapseAllTree = function ()\n    {\n        var that=this;\n        var roots = $.grep(this.data, function (row, index) {\n            return row.parentId == null;\n        });\n        $.each(roots, function (index, item) {\n            var child = getAllChild(item, that.options.data, that.options.treeId);\n            $.each(child, function (i, n) {\n                n.hidden=true;\n            });\n        });\n        that.initBody(true);\n\n    }\n\n    //给组件增加默认参数列表\n    $.extend($.fn.bootstrapTable.defaults, {\n        treeView: false,//treeView视图\n        treeField: \"id\",//treeView视图字段\n        treeId: \"id\",\n        treeRootLevel: 1,//根节点序号\n        treeCollapseAll: true,//是否全部展开，默认不展开\n        collapseIcon: \"glyphicon glyphicon-chevron-right\",//折叠样式\n        expandIcon: \"glyphicon glyphicon-chevron-down\",//展开样式\n        // leafIcon:\"glyphicon glyphicon-leaf\"//叶子节点样式\n    });\n    $.fn.bootstrapTable.methods.push('expandAllTree', 'collapseAllTree');\n})(jQuery);"
  },
  {
    "path": "server/static/lib/css-selector/LICENSE",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "server/static/lib/css-selector/README.md",
    "content": "# CSS Selector\n[![Build Status](https://api.travis-ci.org/martinsbalodis/css-selector.svg)](https://travis-ci.org/martinsbalodis/css-selector)\n\nCSS selector can be used to retrieve CSS selector for a given element in DOM. The resulting selector will be optimized to be as short as possible.\nCSS selector can be retrieved also for multiple elements. In such case the resulting selector might be a much wider CSS selector which will point to similar elements.\n\n## Usage\n```javascript\nvar selector = new CssSelector({\n\t\tparent: document,\n\t\tenableResultStripping: true,\n\t\tignoredTags: ['font'],\n\t\tenableSmartTableSelector: true,\n\t\tallowMultipleSelectors: false,\n\t\tquery: jQuery,\n\t\tignoredClasses: [\n\t\t\t'my-class'\n\t\t]\n\t});\nvar elements = document.getElementsByClassName('my-class');\nvar result_selector = selector.getCssSelector(elements);\n// #id div:nth-of-type(1) .another-class\n```\n\n## Features\n\n - Tag name selector\n - Id selector\n - Class name selector\n - nth-of-child selector\n - Direct Child selector (a > b)\n - Smart table selector\n\n### Smart table selector\nFor example you have a table like you can see below and you need to get the CSS selector for `<td>banana</td>`. The selector could be retrieved with `nth-of-child` selector. But in this case the resulting selector wouldn't be a very strong one. Using smart table you would get CSS selector like this `tr:contains('title:') td:nth-of-type(2)`.\n```html\n<table>\n    <tr><td>title:</td><td>banana</td></tr>\n    <tr><td>color:</td><td>yellow</td></tr>\n</table>\n```\n\n## Contributions\nPlease include tests for added features.\n\n## License\nLGPLv3\n"
  },
  {
    "path": "server/static/lib/css-selector/karma.conf.js",
    "content": "// Karma configuration\n// Generated on Thu Jun 19 2014 20:42:33 GMT+0300 (EEST)\n\nmodule.exports = function(config) {\n  config.set({\n\n    // base path that will be used to resolve all patterns (eg. files, exclude)\n    basePath: '',\n\n\n    // frameworks to use\n    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter\n    frameworks: ['jasmine', 'requirejs'],\n\n\n    // list of files / patterns to load in the browser\n    files: [\n      'test-main.js',\n      {pattern: 'node_modules/jquery/dist/jquery.js', included:true},\n      {pattern: 'lib/CssSelector.js', included:true},\n      {pattern: 'test/*spec.js', included: false}\n    ],\n\n\n    // list of files to exclude\n    exclude: [\n      \n    ],\n\n\n    // preprocess matching files before serving them to the browser\n    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor\n    preprocessors: {\n    \n    },\n\n\n    // test results reporter to use\n    // possible values: 'dots', 'progress'\n    // available reporters: https://npmjs.org/browse/keyword/karma-reporter\n    reporters: ['dots'],\n\n\n    // web server port\n    port: 9876,\n\n\n    // enable / disable colors in the output (reporters and logs)\n    colors: true,\n\n\n    // level of logging\n    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG\n    logLevel: config.LOG_WARN,\n\n\n    // enable / disable watching file and executing test whenever any file changes\n    autoWatch: false,\n\n\n    // start these browsers\n    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher\n    browsers: ['Chrome'],\n\n\n    // Continuous Integration mode\n    // if true, Karma captures browsers, runs the test and exits\n    singleRun: false\n  });\n};\n"
  },
  {
    "path": "server/static/lib/css-selector/lib/CssSelector.js",
    "content": "\"use strict\";\nvar CssSelector = function (options) {\n\tvar me = this;\n\t// defaults\n\tthis.ignoredTags = ['font', 'b', 'i', 's'];\n\tthis.parent = document;\n\tthis.ignoredClassBase = false;\n\tthis.enableResultStripping = true;\n\tthis.enableSmartTableSelector = false;\n\tthis.ignoredClasses = [];\n    this.allowMultipleSelectors = false;\n\tthis.query = function (selector) {\n\t\treturn me.parent.querySelectorAll(selector);\n\t};\n\t// overrides defaults with options\n\tfor (var i in options) {\n\t\tthis[i] = options[i];\n\t}\n\t// jquery parent selector fix\n\tif (this.query === window.jQuery) {\n\t\tthis.query = function (selector) {\n\t\t\treturn jQuery(me.parent).find(selector);\n\t\t};\n\t}\n};\n\n// TODO refactor element selector list into a ~ class\nvar ElementSelector = function (element, ignoredClasses) {\n\tthis.element = element;\n\tthis.isDirectChild = true;\n\tthis.tag = element.localName;\n\tthis.tag = this.tag.replace(/:/g, '\\\\:');\n\t// nth-of-child(n+1)\n\tthis.indexn = null;\n\tthis.index = 1;\n\tthis.id = null;\n\tthis.classes = new Array();\n\t// do not add additinal info to html, body tags.\n\t// html:nth-of-type(1) cannot be selected\n\tif(this.tag === 'html' || this.tag === 'HTML'\n\t\t|| this.tag === 'body' || this.tag === 'BODY') {\n\t\tthis.index = null;\n\t\treturn;\n\t}\n\tif (element.parentNode !== undefined) {\n\t\t// nth-child\n\t\t//this.index = [].indexOf.call(element.parentNode.children, element)+1;\n\n\t\t// nth-of-type\n\t\tfor (var i = 0; i < element.parentNode.children.length; i++) {\n\t\t\tvar child = element.parentNode.children[i];\n\t\t\tif (child === element) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (child.tagName === element.tagName) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t}\n\t}\n\tif (element.id !== '') {\n\t\tif (typeof element.id === 'string') {\n\t\t\tthis.id = element.id;\n\t\t\tthis.id = this.id.replace(/:/g, '\\\\:');\n\t\t}\n\t}\n\tfor (var i = 0; i < element.classList.length; i++) {\n\t\tvar cclass = element.classList[i];\n\t\tif (ignoredClasses.indexOf(cclass) === -1) {\n\t\t\tcclass = cclass.replace(/:/g, '\\\\:');\n\t\t\tthis.classes.push(cclass);\n\t\t}\n\t}\n};\n\nvar ElementSelectorList = function (CssSelector) {\n\tthis.CssSelector = CssSelector;\n};\n\nElementSelectorList.prototype = new Array();\n\nElementSelectorList.prototype.getCssSelector = function () {\n\tvar resultSelectors = [];\n\t// TDD\n\tfor (var i = 0; i < this.length; i++) {\n\t\tvar selector = this[i];\n\t\tvar isFirstSelector = i === this.length-1;\n\t\tvar resultSelector = selector.getCssSelector(isFirstSelector);\n\t\tif (this.CssSelector.enableSmartTableSelector) {\n\t\t\tif (selector.tag === 'tr') {\n\t\t\t\tif (selector.element.children.length === 2) {\n\t\t\t\t\tif (selector.element.children[0].tagName === 'TD'\n\t\t\t\t\t\t|| selector.element.children[0].tagName === 'TH'\n\t\t\t\t\t\t|| selector.element.children[0].tagName === 'TR') {\n\t\t\t\t\t\tvar text = selector.element.children[0].textContent;\n\t\t\t\t\t\ttext = text.trim();\n\t\t\t\t\t\t// escape quotes\n\t\t\t\t\t\ttext.replace(/(\\\\*)(')/g, function (x) {\n\t\t\t\t\t\t\tvar l = x.length;\n\t\t\t\t\t\t\treturn (l % 2) ? x : x.substring(0, l - 1) + \"\\\\'\";\n\t\t\t\t\t\t});\n\t\t\t\t\t\tresultSelector += \":contains('\" + text + \"')\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tresultSelectors.push(resultSelector);\n\t}\n\n\tvar resultCSSSelector = resultSelectors.reverse().join(' ');\n\treturn resultCSSSelector;\n};\n\nElementSelector.prototype = {\n\tgetCssSelector: function (isFirstSelector) {\n\t\tif(isFirstSelector === undefined) {\n\t\t\tisFirstSelector = false;\n\t\t}\n\t\tvar selector = this.tag;\n\t\tif (this.id !== null) {\n\t\t\tselector += '#' + this.id;\n\t\t}\n\t\tif (this.classes.length) {\n\t\t\tfor (var i = 0; i < this.classes.length; i++) {\n\t\t\t\tselector += \".\" + this.classes[i];\n\t\t\t}\n\t\t}\n\t\tif (this.index !== null) {\n\t\t\tselector += ':nth-of-type(' + this.index + ')';\n\t\t}\n\t\tif (this.indexn !== null && this.indexn !== -1) {\n\t\t\tselector += ':nth-of-type(n+' + this.indexn + ')';\n\t\t}\n\t\tif(this.isDirectChild && isFirstSelector === false) {\n\t\t\tselector = \"> \"+selector;\n\t\t}\n\t\treturn selector;\n\t},\n\t// merges this selector with another one.\n\tmerge: function (mergeSelector) {\n\t\tif (this.tag !== mergeSelector.tag) {\n\t\t\tthrow \"different element selected (tag)\";\n\t\t}\n\t\tif (this.index !== null) {\n\t\t\tif (this.index !== mergeSelector.index) {\n\t\t\t\t// use indexn only for two elements\n\t\t\t\tif (this.indexn === null) {\n\t\t\t\t\tvar indexn = Math.min(mergeSelector.index, this.index);\n\t\t\t\t\tif (indexn > 1) {\n\t\t\t\t\t\tthis.indexn = Math.min(mergeSelector.index, this.index);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.indexn = -1;\n\t\t\t\t}\n\t\t\t\tthis.index = null;\n\t\t\t}\n\t\t}\n\t\tif(this.isDirectChild === true) {\n\t\t\tthis.isDirectChild = mergeSelector.isDirectChild;\n\t\t}\n\t\tif (this.id !== null) {\n\t\t\tif (this.id !== mergeSelector.id) {\n\t\t\t\tthis.id = null;\n\t\t\t}\n\t\t}\n\t\tif (this.classes.length !== 0) {\n\t\t\tvar classes = new Array();\n\t\t\tfor (var i in this.classes) {\n\t\t\t\tvar cclass = this.classes[i];\n\t\t\t\tif (mergeSelector.classes.indexOf(cclass) !== -1) {\n\t\t\t\t\tclasses.push(cclass);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.classes = classes;\n\t\t}\n\t}\n};\n\nCssSelector.prototype = {\n\tmergeElementSelectors: function (newSelecors) {\n\t\tif (newSelecors.length < 1) {\n\t\t\tthrow \"No selectors specified\";\n\t\t}\n\t\telse if (newSelecors.length === 1) {\n\t\t\treturn newSelecors[0];\n\t\t}\n\t\t// check selector total count\n\t\tvar elementCountInSelector = newSelecors[0].length;\n\t\tfor (var i = 0; i < newSelecors.length; i++) {\n\t\t\tvar selector = newSelecors[i];\n\t\t\tif (selector.length !== elementCountInSelector) {\n\t\t\t\tthrow \"Invalid element count in selector\";\n\t\t\t}\n\t\t}\n\t\t// merge selectors\n\t\tvar resultingElements = newSelecors[0];\n\t\tfor (var i = 1; i < newSelecors.length; i++) {\n\t\t\tvar mergeElements = newSelecors[i];\n\t\t\tfor (var j = 0; j < elementCountInSelector; j++) {\n\t\t\t\tresultingElements[j].merge(mergeElements[j]);\n\t\t\t}\n\t\t}\n\t\treturn resultingElements;\n\t},\n\tstripSelector: function (selectors) {\n\t\tvar cssSeletor = selectors.getCssSelector();\n\t\tvar baseSelectedElements = this.query(cssSeletor);\n\t\tvar compareElements = function (elements) {\n\t\t\tif (baseSelectedElements.length !== elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tfor (var j = 0; j < baseSelectedElements.length; j++) {\n\t\t\t\tif ([].indexOf.call(elements, baseSelectedElements[j]) === -1) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\t\t// strip indexes\n\t\tfor (var i = 0; i < selectors.length; i++) {\n\t\t\tvar selector = selectors[i];\n\t\t\tif (selector.index !== null) {\n\t\t\t\tvar index = selector.index;\n\t\t\t\tselector.index = null;\n\t\t\t\tvar cssSeletor = selectors.getCssSelector();\n\t\t\t\tvar newSelectedElements = this.query(cssSeletor);\n\t\t\t\t// if results doesn't match then undo changes\n\t\t\t\tif (!compareElements(newSelectedElements)) {\n\t\t\t\t\tselector.index = index;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// strip isDirectChild\n\t\tfor (var i = 0; i < selectors.length; i++) {\n\t\t\tvar selector = selectors[i];\n\t\t\tif (selector.isDirectChild === true) {\n\t\t\t\tselector.isDirectChild = false;\n\t\t\t\tvar cssSeletor = selectors.getCssSelector();\n\t\t\t\tvar newSelectedElements = this.query(cssSeletor);\n\t\t\t\t// if results doesn't match then undo changes\n\t\t\t\tif (!compareElements(newSelectedElements)) {\n\t\t\t\t\tselector.isDirectChild = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// strip ids\n\t\tfor (var i = 0; i < selectors.length; i++) {\n\t\t\tvar selector = selectors[i];\n\t\t\tif (selector.id !== null) {\n\t\t\t\tvar id = selector.id;\n\t\t\t\tselector.id = null;\n\t\t\t\tvar cssSeletor = selectors.getCssSelector();\n\t\t\t\tvar newSelectedElements = this.query(cssSeletor);\n\t\t\t\t// if results doesn't match then undo changes\n\t\t\t\tif (!compareElements(newSelectedElements)) {\n\t\t\t\t\tselector.id = id;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// strip classes\n\t\tfor (var i = 0; i < selectors.length; i++) {\n\t\t\tvar selector = selectors[i];\n\t\t\tif (selector.classes.length !== 0) {\n\t\t\t\tfor (var j = selector.classes.length - 1; j > 0; j--) {\n\t\t\t\t\tvar cclass = selector.classes[j];\n\t\t\t\t\tselector.classes.splice(j, 1);\n\t\t\t\t\tvar cssSeletor = selectors.getCssSelector();\n\t\t\t\t\tvar newSelectedElements = this.query(cssSeletor);\n\t\t\t\t\t// if results doesn't match then undo changes\n\t\t\t\t\tif (!compareElements(newSelectedElements)) {\n\t\t\t\t\t\tselector.classes.splice(j, 0, cclass);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// strip tags\n\t\tfor (var i = selectors.length - 1; i > 0; i--) {\n\t\t\tvar selector = selectors[i];\n\t\t\tselectors.splice(i, 1);\n\t\t\tvar cssSeletor = selectors.getCssSelector();\n\t\t\tvar newSelectedElements = this.query(cssSeletor);\n\t\t\t// if results doesn't match then undo changes\n\t\t\tif (!compareElements(newSelectedElements)) {\n\t\t\t\tselectors.splice(i, 0, selector);\n\t\t\t}\n\t\t}\n\t\treturn selectors;\n\t},\n\tgetElementSelectors: function (elements, top) {\n\t\tvar elementSelectors = [];\n\t\tfor (var i = 0; i < elements.length; i++) {\n\t\t\tvar element = elements[i];\n\t\t\tvar elementSelector = this.getElementSelector(element, top);\n\t\t\telementSelectors.push(elementSelector);\n\t\t}\n\t\treturn elementSelectors;\n\t},\n\tgetElementSelector: function (element, top) {\n\t\tvar elementSelectorList = new ElementSelectorList(this);\n\t\twhile (true) {\n\t\t\tif (element === this.parent) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (element === undefined || element === document) {\n\t\t\t\tthrow 'element is not a child of the given parent';\n\t\t\t}\n\t\t\tif (this.isIgnoredTag(element.tagName)) {\n\n\t\t\t\telement = element.parentNode;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (top > 0) {\n\t\t\t\ttop--;\n\t\t\t\telement = element.parentNode;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar selector = new ElementSelector(element, this.ignoredClasses);\n\t\t\t// document does not have a tagName\n\t\t\tif(element.parentNode === document || this.isIgnoredTag(element.parentNode.tagName)) {\n\t\t\t\tselector.isDirectChild = false;\n\t\t\t}\n\t\t\telementSelectorList.push(selector);\n\t\t\telement = element.parentNode;\n\t\t}\n\t\treturn elementSelectorList;\n\t},\n\n    /**\n     * Compares whether two elements are similar. Similar elements should\n     * have a common parrent and all parent elements should be the same type.\n     * @param element1\n     * @param element2\n     */\n    checkSimilarElements: function(element1, element2) {\n        while (true) {\n            if(element1.tagName !== element2.tagName) {\n                return false;\n            }\n            if(element1 === element2) {\n                return true;\n            }\n            // stop at body tag\n            if (element1 === undefined || element1.tagName === 'body'\n                || element1.tagName === 'BODY') {\n                return false;\n            }\n            if (element2 === undefined || element2.tagName === 'body'\n                || element2.tagName === 'BODY') {\n                return false;\n            }\n            element1 = element1.parentNode;\n            element2 = element2.parentNode;\n        }\n    },\n    /**\n     * Groups elements into groups if the emelents are not similar\n     * @param elements\n     */\n    getElementGroups: function(elements) {\n        // first elment is in the first group\n        // @TODO maybe i dont need this?\n        var groups = [[elements[0]]];\n        for(var i = 1; i < elements.length; i++) {\n            var elementNew = elements[i];\n            var addedToGroup = false;\n            for(var j = 0; j < groups.length; j++) {\n                var group = groups[j];\n                var elementGroup = group[0];\n                if(this.checkSimilarElements(elementNew, elementGroup)) {\n                    group.push(elementNew);\n                    addedToGroup = true;\n                    break;\n                }\n            }\n            // add new group\n            if(!addedToGroup) {\n                groups.push([elementNew]);\n            }\n        }\n        return groups;\n    },\n\tgetCssSelector: function (elements, top) {\n\t\ttop = top || 0;\n\t\tvar enableSmartTableSelector = this.enableSmartTableSelector;\n\t\tif (elements.length > 1) {\n\t\t\tthis.enableSmartTableSelector = false;\n\t\t}\n        // group elements into similarity groups\n        var elementGroups = this.getElementGroups(elements);\n        var resultCSSSelector;\n        if(this.allowMultipleSelectors) {\n            var groupSelectors = [];\n            for(var i = 0; i < elementGroups.length; i++) {\n                var groupElements = elementGroups[i];\n\n                var elementSelectors = this.getElementSelectors(groupElements, top);\n                var resultSelector = this.mergeElementSelectors(elementSelectors);\n                if (this.enableResultStripping) {\n                    resultSelector = this.stripSelector(resultSelector);\n                }\n                groupSelectors.push(resultSelector.getCssSelector());\n            }\n            resultCSSSelector = groupSelectors.join(', ');\n        } else {\n            if(elementGroups.length !== 1) {\n                throw \"found multiple element groups, but allowMultipleSelectors disabled\";\n            }\n            var elementSelectors = this.getElementSelectors(elements, top);\n            var resultSelector = this.mergeElementSelectors(elementSelectors);\n            if (this.enableResultStripping) {\n                resultSelector = this.stripSelector(resultSelector);\n            }\n            resultCSSSelector = resultSelector.getCssSelector();\n        }\n\t\tthis.enableSmartTableSelector = enableSmartTableSelector;\n\t\t// strip down selector\n\t\treturn resultCSSSelector;\n\t},\n\tisIgnoredTag: function (tag) {\n\t\treturn this.ignoredTags.indexOf(tag.toLowerCase()) !== -1;\n\t}\n};\n"
  },
  {
    "path": "server/static/lib/css-selector/package.json",
    "content": "{\n  \"name\": \"css-selector\",\n  \"version\": \"v0.1.0\",\n  \"description\": \"Retrieves CSS selector for a given element in DOM.\",\n  \"homepage\": \"https://github.com/martinsbalodis/css-selector\",\n  \"license\": \"LGPL-3.0+\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/martinsbalodis/css-selector\"\n  },\n  \"author\": {\n    \"name\": \"Martins Balodis\",\n    \"email\": \"martins256@gmail.com\"\n  },\n  \"scripts\": {\n    \"test\": \"./node_modules/karma/bin/karma start --browsers Firefox --single-run\"\n  },\n  \"dependencies\": {\n     \"jquery\": \"~2.1.1\"\n  },\n  \"devDependencies\": {\n    \"karma-chrome-launcher\": \"^0.1.4\",\n    \"karma-firefox-launcher\": \"~0.1\",    \n    \"karma-jasmine\": \"^0.1.5\",\n    \"karma-requirejs\": \"^0.2.2\",\n    \"requirejs\": \"^2.1.14\"\n  }\n}\n"
  },
  {
    "path": "server/static/lib/css-selector/test/CSSselectorSimple.spec.js",
    "content": "var selector, $el;\njQuery(\"body\").append(\"<div id='tests'></div>\");\n\ndescribe(\"CSS Selector Simple\", function () {\n\n\tbeforeEach(function () {\n\n        $el = jQuery(\"#tests\").html(\"\");\n\t\tselector = new CssSelector({\n\t\t\tparent: jQuery('#tests')[0],\n\t\t\tenableResultStripping: false,\n\t\t\tignoredClasses: [\n\t\t\t\t'test-ignore-tags',\n\t\t\t\t'test-multi-element-n',\n\t\t\t\t'test-skip-top-n'\n\t\t\t]\n\t\t});\n\t});\n\n\tit(\"should be able to select one element\", function () {\n\n        $el.append('<div><a name=\"test-simple-element\"></a><b></b></div><a></a>');\n\n\t\tvar element = document.getElementsByName('test-simple-element')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"div:nth-of-type(1) > a:nth-of-type(1)\");\n\t});\n\n\tit(\"should be able to select multiple elements\", function () {\n\n        $el.append('<div><span><a name=\"test-milti-element\"></a></span><span><a name=\"test-milti-element\"></a></span></div>');\n\n\t\tvar elements = document.getElementsByName('test-milti-element');\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\t\texpect(css_selector).toBe(\"div:nth-of-type(1) > span > a:nth-of-type(1)\");\n\t});\n\n\tit(\"should be able to select multiple elements n+\", function () {\n\n        $el.append('<div><span><a></a></span><span><a class=\"test-multi-element-n\"></a></span><span><a class=\"test-multi-element-n\"></a></span></div>');\n\n\t\tvar elements = jQuery('.test-multi-element-n');\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\n\t\texpect(css_selector).toBe(\"div:nth-of-type(1) > span:nth-of-type(n+2) > a:nth-of-type(1)\");\n\t});\n\n\tit(\"should be able to ignore tags\", function () {\n\n        $el.append('<table><tr><td><font class=\"test-ignore-tags\"></font></td></tr></table>');\n\t\tvar elements = jQuery('.test-ignore-tags');\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\t\texpect(css_selector).toBe(\"table:nth-of-type(1) > tbody:nth-of-type(1) > tr:nth-of-type(1) > td:nth-of-type(1)\");\n\t});\n\n\tit(\"should escape colon in tag name, id and class\", function () {\n\n\t\t$el.append('<div:test id=\"colon:testid\" class=\"colon-test colon:class\"></div:test>');\n\t\tvar elements = jQuery('.colon-test');\n\t\tvar cssSelector = selector.getCssSelector(elements);\n\n\t\texpect(cssSelector).toBe(\"div\\\\:test#colon\\\\:testid.colon-test.colon\\\\:class:nth-of-type(1)\");\n\t\texpect($(cssSelector).length).toBe(1);\n\t});\n\n\tit(\"should be able to skip elements from top\", function () {\n\n        $el.append('<table><tr><td><span class=\"test-skip-top\"></span></td></tr></table>');\n\n\t\tvar elements = jQuery('.test-skip-top');\n\t\tvar css_selector = selector.getCssSelector(elements, 2);\n\n\t\texpect(css_selector).toBe(\"table:nth-of-type(1) > tbody:nth-of-type(1) > tr:nth-of-type(1)\");\n\t});\n\n\tit(\"should be able to skip elements from top and use n+1 selectors\", function () {\n\n        $el.append('<table><tr><td><span></span></td></tr><tr><td><span class=\"test-skip-top-n\"></span></td></tr><tr><td><span class=\"test-skip-top-n\"></span></td></tr></table>');\n\n\t\tvar elements = jQuery('.test-skip-top-n');\n\t\tvar css_selector = selector.getCssSelector(elements, 2);\n\n\t\texpect(css_selector).toBe(\"table:nth-of-type(1) > tbody:nth-of-type(1) > tr:nth-of-type(n+2)\");\n\t});\n\n\tit(\"should be able to select body\", function () {\n\n\t\tvar elements = jQuery('body');\n\t\tselector.parent = jQuery('html')[0];\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\t\texpect(css_selector).toBe(\"body\");\n\t});\n\n\tit(\"should be able to select html\", function () {\n\n\t\tvar elements = jQuery('html');\n\t\tselector.parent = document;\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\t\texpect(css_selector).toBe(\"html\");\n\t});\n});\n\ndescribe(\"CSS Selector Strip\", function () {\n\n\tbeforeEach(function () {\n\n        $el = jQuery(\"#tests\").html(\"\");\n\t\tselector = new CssSelector({\n\t\t\tparent: jQuery('#tests')[0],\n\t\t\tignoredClasses:['do-not-strip-direct-child-test']\n\t\t});\n\t});\n\n\tit(\"should be able to strip indexes\", function () {\n\n        $el.append('<input name=\"strip-index-test\"/>');\n\t\tvar element = document.getElementsByName('strip-index-test')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"input\");\n\t});\n\n\tit(\"should be able to strip ids\", function () {\n\n        $el.append('<textarea name=\"strip-id-test\" id=\"strip-id-test\"></textarea>');\n\t\tvar element = document.getElementsByName('strip-id-test')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"textarea\");\n\t});\n\n\tit(\"should be able to strip classes\", function () {\n\n        $el.append('<div><span><b><select name=\"strip-tags-test\"></select></b></span></div>');\n\t\tvar element = document.getElementsByName('strip-tags-test')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"select\");\n\t});\n\n\tit(\"should be able to strip whole tags\", function () {\n\n        $el.append('<div><span class=\"needed strip\"><a name=\"strip-classes-test\"></a></span><span class=\"strip\"><a></a></span></div>');\n\t\tvar element = document.getElementsByName('strip-classes-test')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"span.needed a\");\n\t});\n\n\tit(\"should not strip direct child when a subchild exists\", function () {\n\n        $el.append('<div><span><div class=\"do-not-strip-direct-child-test\"><div><div></div></div></div><div class=\"do-not-strip-direct-child-test\"></div></span></div>');\n\t\tvar elements = $('.do-not-strip-direct-child-test');\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\t\texpect(css_selector).toBe(\"span > div\");\n\t});\n\n});\n\ndescribe(\"Combine css selectors\", function() {\n\n    beforeEach(function () {\n\n        $el = jQuery(\"#tests\").html(\"\");\n        selector = new CssSelector({\n            parent: jQuery('#tests')[0],\n            allowMultipleSelectors: true\n        });\n    });\n\n    it(\"should find elements similar\", function() {\n\n        $el.append('<span class=\"span1\"></span><span class=\"span2\"></span>');\n        var span1 = $('.span1', $el)[0];\n        var span2 = $('.span2', $el)[0];\n        var result = selector.checkSimilarElements(span1, span2);\n\n        expect(result).toBe(true);\n    });\n\n    it(\"should not find elements similar at different deepnesses\", function() {\n\n        $el.append('<span class=\"span1\"></span><div><span class=\"span2\"></span></div>');\n        var span1 = $('.span1', $el)[0];\n        var span2 = $('.span2', $el)[0];\n        var result = selector.checkSimilarElements(span1, span2);\n\n        expect(result).toBe(false);\n    });\n\n    it(\"should group similar elements\", function(){\n\n        $el.append('<span class=\"span1\"></span><span class=\"span2\"></span>');\n        var elements = $('span', $el).get();\n        var result = selector.getElementGroups(elements);\n\n        expect(result.length).toBe(1);\n        expect(result[0]).toEqual(elements);\n    });\n\n    it(\"should not group not similar elements\", function(){\n\n        $el.append('<span class=\"span1\"></span><div><span class=\"span2\"></span></div>');\n        var elements = $('span', $el).get();\n        var result = selector.getElementGroups(elements);\n\n        expect(result.length).toBe(2);\n        expect(result[0]).toEqual([elements[0]]);\n        expect(result[1]).toEqual([elements[1]]);\n    });\n\n    it(\"should combine two selectors\", function() {\n\n        $el.append('<div></div><span></span>');\n        var elements = $('div, span', $el);\n        var cssSelector = selector.getCssSelector(elements);\n\n        expect(cssSelector).toBe(\"div, span\");\n    });\n\n    it(\"should combine two selectors at different deepnesses\", function() {\n\n        $el.append('<div class=\"div1\"></div><div><span></span></div>');\n        var elements = $('.div1, span', $el);\n        var cssSelector = selector.getCssSelector(elements);\n\n        expect(cssSelector).toBe(\"div.div1, span\");\n    });\n});\n\ndescribe(\"Smart table selectors\", function () {\n\n\tbeforeEach(function () {\n\n        $el = jQuery(\"#tests\").html(\"\");\n\t\tselector = new CssSelector({\n\t\t\tparent: jQuery('#tests')[0],\n\t\t\tenableSmartTableSelector: true,\n\t\t\tquery: jQuery\n\t\t});\n\t});\n\n\tit(\"should be select cells based on text in desciption cell\", function () {\n\n        $el.append('<table><tr><td> Item:</td><td class=\"table-cell-test1\">needed data</td></tr><tr><td>Not needed item</td><td class=\"table-cell-test1\">Not needed item</td></tr></table>');\n\t\tvar element = document.getElementsByClassName('table-cell-test1')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"tr:contains('Item:') td.table-cell-test1\");\n\t});\n\n\tit(\"should be select cells based on text in desciption cell(th)\", function () {\n\n        $el.append('<table><tr><th>Item2:</th><td class=\"table-cell-test3\">needed data</td></tr><tr><th>Not needed item</th><td class=\"table-cell-test3\">Not needed item</td></tr></table>');\n\t\tvar element = document.getElementsByClassName('table-cell-test3')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"tr:contains('Item2:') td.table-cell-test3\");\n\t});\n\n\tit(\"should drop its smartness when selecting multiple items\", function () {\n\n        $el.append('<table><tr><td>1</td><td class=\"table-cell-test2\"></td></tr><tr><td>2</td><td class=\"table-cell-test2\"></td></tr></table>');\n\t\tvar elements = jQuery('.table-cell-test2');\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n        expect(css_selector).toBe(\"td.table-cell-test2\");\n\t});\n\n});\n\ndescribe(\"Ignored classes\", function () {\n\n\tbeforeEach(function () {\n\n        $el = jQuery(\"#tests\").html(\"\");\n\t\tselector = new CssSelector({\n\t\t\tparent: jQuery('#tests')[0],\n\t\t\tignoredClasses: ['ignored']\n\t\t});\n\t});\n\n\tit(\"should ignore classes\", function () {\n\n        $el.append('<div><a class=\"ignored ignored-class-test1\"></a><a></a></div>');\n\t\tvar element = document.getElementsByClassName('ignored-class-test1')[0];\n\t\tvar css_selector = selector.getCssSelector([element]);\n\n\t\texpect(css_selector).toBe(\"a.ignored-class-test1\");\n\t});\n\n});\n\ndescribe(\"Bugs\", function () {\n\n\tbeforeEach(function () {\n\n        $el = jQuery(\"#tests\").html(\"\");\n\t});\n\n\tit(\"should select children of parent while using jquery\", function () {\n\n        $el.append('<div id=\"jquery-children-test-parent\"><a></a></div><a></a>');\n        selector = new CssSelector({\n             parent: jQuery('#jquery-children-test-parent')[0],\n             query: jQuery\n        });\n\t\tvar elements = jQuery('#jquery-children-test-parent a');\n\t\tvar css_selector = selector.getCssSelector(elements);\n\n\t\texpect(css_selector).toBe(\"a\");\n\t});\n\n});\n"
  },
  {
    "path": "server/static/lib/css-selector/test-main.js",
    "content": "var allTestFiles = [];\nvar TEST_REGEXP = /(spec|test)\\.js$/i;\n\nvar pathToModule = function(path) {\n  return path.replace(/^\\/base\\//, '').replace(/\\.js$/, '');\n};\n\nObject.keys(window.__karma__.files).forEach(function(file) {\n  if (TEST_REGEXP.test(file)) {\n    // Normalize paths to RequireJS module names.\n    allTestFiles.push(pathToModule(file));\n  }\n});\n\nrequire.config({\n  // Karma serves files under /base, which is the basePath from your config file\n  baseUrl: '/base',\n\n  // dynamically load all test files\n  deps: allTestFiles,\n\n  // we have to kickoff jasmine, as it is asynchronous\n  callback: window.__karma__.start\n});\n"
  },
  {
    "path": "server/static/lib/d3.v3.js",
    "content": "d3 = function() {\n  var d3 = {\n    version: \"3.3.8\"\n  };\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;\n  try {\n    d3_array(d3_documentElement.childNodes)[0].nodeType;\n  } catch (e) {\n    d3_array = function(list) {\n      var i = list.length, array = new Array(i);\n      while (i--) array[i] = list[i];\n      return array;\n    };\n  }\n  try {\n    d3_document.createElement(\"div\").style.setProperty(\"opacity\", 0, \"\");\n  } catch (error) {\n    var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n    d3_element_prototype.setAttribute = function(name, value) {\n      d3_element_setAttribute.call(this, name, value + \"\");\n    };\n    d3_element_prototype.setAttributeNS = function(space, local, value) {\n      d3_element_setAttributeNS.call(this, space, local, value + \"\");\n    };\n    d3_style_prototype.setProperty = function(name, value, priority) {\n      d3_style_setProperty.call(this, name, value + \"\", priority);\n    };\n  }\n  d3.ascending = function(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  };\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined;\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (!isNaN(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  function d3_number(x) {\n    return x != null && !isNaN(x);\n  }\n  d3.mean = function(array, f) {\n    var n = array.length, a, m = 0, i = -1, j = 0;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j;\n    } else {\n      while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j;\n    }\n    return j ? m : undefined;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    if (arguments.length > 1) array = array.map(f);\n    array = array.filter(d3_number);\n    return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined;\n  };\n  d3.bisector = function(f) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (f.call(a, a[mid], mid) < x) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (x < f.call(a, a[mid], mid)) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  };\n  var d3_bisector = d3.bisector(function(d) {\n    return d;\n  });\n  d3.bisectLeft = d3_bisector.left;\n  d3.bisect = d3.bisectRight = d3_bisector.right;\n  d3.shuffle = function(array) {\n    var m = array.length, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m], array[m] = array[i], array[i] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.zip = function() {\n    if (!(n = arguments.length)) return [];\n    for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {\n      for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {\n        zip[j] = arguments[j][i];\n      }\n    }\n    return zips;\n  };\n  function d3_zipLength(d) {\n    return d.length;\n  }\n  d3.transpose = function(matrix) {\n    return d3.zip.apply(d3, matrix);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    try {\n      for (var key in properties) {\n        Object.defineProperty(ctor.prototype, key, {\n          value: properties[key],\n          enumerable: false\n        });\n      }\n    } catch (e) {\n      ctor.prototype = properties;\n    }\n  }\n  d3.map = function(object) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) object.forEach(function(key, value) {\n      map.set(key, value);\n    }); else for (var key in object) map.set(key, object[key]);\n    return map;\n  };\n  function d3_Map() {}\n  d3_class(d3_Map, {\n    has: function(key) {\n      return d3_map_prefix + key in this;\n    },\n    get: function(key) {\n      return this[d3_map_prefix + key];\n    },\n    set: function(key, value) {\n      return this[d3_map_prefix + key] = value;\n    },\n    remove: function(key) {\n      key = d3_map_prefix + key;\n      return key in this && delete this[key];\n    },\n    keys: function() {\n      var keys = [];\n      this.forEach(function(key) {\n        keys.push(key);\n      });\n      return keys;\n    },\n    values: function() {\n      var values = [];\n      this.forEach(function(key, value) {\n        values.push(value);\n      });\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      this.forEach(function(key, value) {\n        entries.push({\n          key: key,\n          value: value\n        });\n      });\n      return entries;\n    },\n    forEach: function(f) {\n      for (var key in this) {\n        if (key.charCodeAt(0) === d3_map_prefixCode) {\n          f.call(this, key.substring(1), this[key]);\n        }\n      }\n    }\n  });\n  var d3_map_prefix = \"\\x00\", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {}\n  d3_class(d3_Set, {\n    has: function(value) {\n      return d3_map_prefix + value in this;\n    },\n    add: function(value) {\n      this[d3_map_prefix + value] = true;\n      return value;\n    },\n    remove: function(value) {\n      value = d3_map_prefix + value;\n      return value in this && delete this[value];\n    },\n    values: function() {\n      var values = [];\n      this.forEach(function(value) {\n        values.push(value);\n      });\n      return values;\n    },\n    forEach: function(f) {\n      for (var value in this) {\n        if (value.charCodeAt(0) === d3_map_prefixCode) {\n          f.call(this, value.substring(1));\n        }\n      }\n    }\n  });\n  d3.behavior = {};\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.substring(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.substring(i + 1);\n      type = type.substring(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatcher = d3_documentElement[d3_vendorSymbol(d3_documentElement, \"matchesSelector\")], d3_selectMatches = function(n, s) {\n    return d3_selectMatcher.call(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = function(s, n) {\n      return Sizzle.uniqueSort(Sizzle(s, n));\n    };\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3_selectionRoot;\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: \"http://www.w3.org/1999/xhtml\",\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0) {\n        prefix = name.substring(0, i);\n        name = name.substring(i + 1);\n      }\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = name.trim().split(/^|\\s+/g)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classed(name, value) {\n    name = name.trim().split(/\\s+/).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? function() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    } : function() {\n      return this.ownerDocument.createElementNS(this.namespaceURI, name);\n    };\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(function() {\n      var parent = this.parentNode;\n      if (parent) parent.removeChild(this);\n    });\n  };\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), dataByKeyValue = new d3_Map(), keyValues = [], keyValue;\n        for (i = -1; ++i < n; ) {\n          keyValue = key.call(node = group[i], node.__data__, i);\n          if (nodeByKeyValue.has(keyValue)) {\n            exitNodes[i] = node;\n          } else {\n            nodeByKeyValue.set(keyValue, node);\n          }\n          keyValues.push(keyValue);\n        }\n        for (i = -1; ++i < m; ) {\n          keyValue = key.call(groupData, nodeData = groupData[i], i);\n          if (node = nodeByKeyValue.get(keyValue)) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          } else if (!dataByKeyValue.has(keyValue)) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n          dataByKeyValue.set(keyValue, nodeData);\n          nodeByKeyValue.remove(keyValue);\n        }\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.has(keyValues[i])) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3.ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    this.each(function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3_selectionPrototype.transition = function() {\n    var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_selectionPrototype.interrupt = function() {\n    return this.each(d3_selection_interrupt);\n  };\n  function d3_selection_interrupt() {\n    var lock = this.__transition__;\n    if (lock) ++lock.active;\n  }\n  d3.select = function(node) {\n    var group = [ typeof node === \"string\" ? d3_select(node, d3_document) : node ];\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group = d3_array(typeof nodes === \"string\" ? d3_selectAll(nodes, d3_document) : nodes);\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  var d3_selectionRoot = d3.select(d3_documentElement);\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.substring(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  d3_selection_onFilters.forEach(function(k) {\n    if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n  });\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect = d3_vendorSymbol(d3_documentElement.style, \"userSelect\"), d3_event_dragId = 0;\n  function d3_event_dragSuppress() {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, touchmove = \"touchmove\" + name, selectstart = \"selectstart\" + name, dragstart = \"dragstart\" + name, click = \"click\" + name, w = d3.select(d3_window).on(touchmove, d3_eventPreventDefault).on(selectstart, d3_eventPreventDefault).on(dragstart, d3_eventPreventDefault), style = d3_documentElement.style, select = style[d3_event_dragSelect];\n    style[d3_event_dragSelect] = \"none\";\n    return function(suppressClick) {\n      w.on(name, null);\n      style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        function off() {\n          w.on(click, null);\n        }\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {\n        svg = d3.select(\"body\").append(\"svg\").style({\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          margin: 0,\n          padding: 0,\n          border: \"none\"\n        }, \"important\");\n        var ctm = svg[0][0].getScreenCTM();\n        d3_mouse_bug44083 = !(ctm.f || ctm.e);\n        svg.remove();\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, \"mousemove\", \"mouseup\"), touchstart = dragstart(touchid, touchposition, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function touchid() {\n      return d3.event.changedTouches[0].identifier;\n    }\n    function touchposition(parent, id) {\n      return d3.touches(parent).filter(function(p) {\n        return p.identifier === id;\n      })[0];\n    }\n    function dragstart(id, position, move, end) {\n      return function() {\n        var target = this, parent = target.parentNode, event_ = event.of(target, arguments), eventTarget = d3.event.target, eventId = id(), drag = eventId == null ? \"drag\" : \"drag-\" + eventId, origin_ = position(parent, eventId), dragged = 0, offset, w = d3.select(d3_window).on(move + \".\" + drag, moved).on(end + \".\" + drag, ended), dragRestore = d3_event_dragSuppress();\n        if (origin) {\n          offset = origin.apply(target, arguments);\n          offset = [ offset.x - origin_[0], offset.y - origin_[1] ];\n        } else {\n          offset = [ 0, 0 ];\n        }\n        event_({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var p = position(parent, eventId), dx = p[0] - origin_[0], dy = p[1] - origin_[1];\n          dragged |= dx | dy;\n          origin_ = p;\n          event_({\n            type: \"drag\",\n            x: p[0] + offset[0],\n            y: p[1] + offset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          w.on(move + \".\" + drag, null).on(end + \".\" + drag, null);\n          dragRestore(dragged && d3.event.target === eventTarget);\n          event_({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  var π = Math.PI, τ = 2 * π, halfπ = π / 2, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];\n    var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;\n    function interpolate(t) {\n      var s = t * S;\n      if (dr) {\n        var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      }\n      return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];\n    }\n    interpolate.duration = S * 1e3;\n    return interpolate;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(mousemove, mousewheelreset).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(event_);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = dx / 2, cy = dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(event_);\n            };\n          }).each(\"end.zoom\", function() {\n            zoomended(event_);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(event_);\n          zoomed(event_);\n          zoomended(event_);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: +_\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(event) {\n      event({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(event) {\n      rescale();\n      event({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(event) {\n      event({\n        type: \"zoomend\"\n      });\n    }\n    function mousedowned() {\n      var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, dragged = 0, w = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), l = location(d3.mouse(target)), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(target);\n      zoomstarted(event_);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(target), l);\n        zoomed(event_);\n      }\n      function ended() {\n        w.on(mousemove, d3_window === target ? mousewheelreset : null).on(mouseup, null);\n        dragRestore(dragged && d3.event.target === eventTarget);\n        zoomended(event_);\n      }\n    }\n    function touchstarted() {\n      var target = this, event_ = event.of(target, arguments), locations0 = {}, distance0 = 0, scale0, eventId = d3.event.changedTouches[0].identifier, touchmove = \"touchmove.zoom-\" + eventId, touchend = \"touchend.zoom-\" + eventId, w = d3.select(d3_window).on(touchmove, moved).on(touchend, ended), t = d3.select(target).on(mousedown, null).on(touchstart, started), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(target);\n      started();\n      zoomstarted(event_);\n      function relocate() {\n        var touches = d3.touches(target);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0], l = locations0[p.identifier];\n            scaleTo(view.k * 2);\n            translateTo(p, l);\n            d3_eventPreventDefault();\n            zoomed(event_);\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(target), p0, l0, p1, l1;\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(event_);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        w.on(touchmove, null).on(touchend, null);\n        t.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(event_);\n      }\n    }\n    function mousewheeled() {\n      var event_ = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n      zoomstarted(event_);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(event_);\n      }, 50);\n      d3_eventPreventDefault();\n      var point = center || d3.mouse(this);\n      if (!translate0) translate0 = location(point);\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(point, translate0);\n      zoomed(event_);\n    }\n    function mousewheelreset() {\n      translate0 = null;\n    }\n    function dblclicked() {\n      var event_ = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2;\n      zoomstarted(event_);\n      scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));\n      translateTo(p, l);\n      zoomed(event_);\n      zoomended(event_);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ];\n  var d3_behavior_zoomDelta, d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n  }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return d3.event.wheelDelta;\n  }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n    return -d3.event.detail;\n  }, \"MozMousePixelScroll\");\n  function d3_Color() {}\n  d3_Color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = function(h, s, l) {\n    return arguments.length === 1 ? h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : d3_hsl(+h, +s, +l);\n  };\n  function d3_hsl(h, s, l) {\n    return new d3_Hsl(h, s, l);\n  }\n  function d3_Hsl(h, s, l) {\n    this.h = h;\n    this.s = s;\n    this.l = l;\n  }\n  var d3_hslPrototype = d3_Hsl.prototype = new d3_Color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = function(h, c, l) {\n    return arguments.length === 1 ? h instanceof d3_Hcl ? d3_hcl(h.h, h.c, h.l) : h instanceof d3_Lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : d3_hcl(+h, +c, +l);\n  };\n  function d3_hcl(h, c, l) {\n    return new d3_Hcl(h, c, l);\n  }\n  function d3_Hcl(h, c, l) {\n    this.h = h;\n    this.c = c;\n    this.l = l;\n  }\n  var d3_hclPrototype = d3_Hcl.prototype = new d3_Color();\n  d3_hclPrototype.brighter = function(k) {\n    return d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = function(l, a, b) {\n    return arguments.length === 1 ? l instanceof d3_Lab ? d3_lab(l.l, l.a, l.b) : l instanceof d3_Hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3.rgb(l)).r, l.g, l.b) : d3_lab(+l, +a, +b);\n  };\n  function d3_lab(l, a, b) {\n    return new d3_Lab(l, a, b);\n  }\n  function d3_Lab(l, a, b) {\n    this.l = l;\n    this.a = a;\n    this.b = b;\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_Lab.prototype = new d3_Color();\n  d3_labPrototype.brighter = function(k) {\n    return d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = function(r, g, b) {\n    return arguments.length === 1 ? r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : d3_rgb(~~r, ~~g, ~~b);\n  };\n  function d3_rgbNumber(value) {\n    return d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  function d3_rgb(r, g, b) {\n    return new d3_Rgb(r, g, b);\n  }\n  function d3_Rgb(r, g, b) {\n    this.r = r;\n    this.g = g;\n    this.b = b;\n  }\n  var d3_rgbPrototype = d3_Rgb.prototype = new d3_Color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return d3_rgb(Math.min(255, ~~(r / k)), Math.min(255, ~~(g / k)), Math.min(255, ~~(b / k)));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return d3_rgb(~~(k * this.r), ~~(k * this.g), ~~(k * this.b));\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, name;\n    m1 = /([a-z]+)\\((.*)\\)/i.exec(format);\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b);\n    if (format != null && format.charAt(0) === \"#\") {\n      if (format.length === 4) {\n        r = format.charAt(1);\n        r += r;\n        g = format.charAt(2);\n        g += g;\n        b = format.charAt(3);\n        b += b;\n      } else if (format.length === 7) {\n        r = format.substring(1, 3);\n        g = format.substring(3, 5);\n        b = format.substring(5, 7);\n      }\n      r = parseInt(r, 16);\n      g = parseInt(g, 16);\n      b = parseInt(b, 16);\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  function d3_identity(d) {\n    return d;\n  }\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (d3_window.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && request.responseText || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3.xhr(url, mimeType, callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr.row(row);\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.substring(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.substring(j, I - k);\n        }\n        return text.substring(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && !(a = f(a, n++))) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      f: false,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  };\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now();\n    d3_timer_active = d3_timer_queueHead;\n    while (d3_timer_active) {\n      if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);\n      d3_timer_active = d3_timer_active.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.f) {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      } else {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  var d3_format_decimalPoint = \".\", d3_format_thousandsSeparator = \",\", d3_format_grouping = [ 3, 3 ], d3_format_currencySymbol = \"$\";\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  d3.format = function(specifier) {\n    var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, suffix = \"\", integer = false;\n    if (precision) precision = +precision.substring(1);\n    if (zfill || fill === \"0\" && align === \"=\") {\n      zfill = fill = \"0\";\n      align = \"=\";\n      if (comma) width -= Math.floor((width - 1) / 4);\n    }\n    switch (type) {\n     case \"n\":\n      comma = true;\n      type = \"g\";\n      break;\n\n     case \"%\":\n      scale = 100;\n      suffix = \"%\";\n      type = \"f\";\n      break;\n\n     case \"p\":\n      scale = 100;\n      suffix = \"%\";\n      type = \"r\";\n      break;\n\n     case \"b\":\n     case \"o\":\n     case \"x\":\n     case \"X\":\n      if (symbol === \"#\") symbol = \"0\" + type.toLowerCase();\n\n     case \"c\":\n     case \"d\":\n      integer = true;\n      precision = 0;\n      break;\n\n     case \"s\":\n      scale = -1;\n      type = \"r\";\n      break;\n    }\n    if (symbol === \"#\") symbol = \"\"; else if (symbol === \"$\") symbol = d3_format_currencySymbol;\n    if (type == \"r\" && !precision) type = \"g\";\n    if (precision != null) {\n      if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n    }\n    type = d3_format_types.get(type) || d3_format_typeDefault;\n    var zcomma = zfill && comma;\n    return function(value) {\n      if (integer && value % 1) return \"\";\n      var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign;\n      if (scale < 0) {\n        var prefix = d3.formatPrefix(value, precision);\n        value = prefix.scale(value);\n        suffix = prefix.symbol;\n      } else {\n        value *= scale;\n      }\n      value = type(value, precision);\n      var i = value.lastIndexOf(\".\"), before = i < 0 ? value : value.substring(0, i), after = i < 0 ? \"\" : d3_format_decimalPoint + value.substring(i + 1);\n      if (!zfill && comma) before = d3_format_group(before);\n      var length = symbol.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n      if (zcomma) before = d3_format_group(padding + before);\n      negative += symbol;\n      value = before + after;\n      return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + suffix;\n    };\n  };\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_format_group = d3_identity;\n  if (d3_format_grouping) {\n    var d3_format_groupingLength = d3_format_grouping.length;\n    d3_format_group = function(value) {\n      var i = value.length, t = [], j = 0, g = d3_format_grouping[0];\n      while (i > 0 && g > 0) {\n        t.push(value.substring(i -= g, i + g));\n        g = d3_format_grouping[j = (j + 1) % d3_format_groupingLength];\n      }\n      return t.reverse().join(d3_format_thousandsSeparator);\n    };\n  }\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(dλ), v = k * Math.sin(dλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n          listener.polygonStart();\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          listener.polygonEnd();\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          listener.lineStart();\n          while (++i < n) listener.point((point = segment[i])[0], point[1]);\n          listener.lineEnd();\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, antimeridian = abs(dλ) > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * Math.sin(dλ), cosφ0 * cosφ + k * Math.cos(dλ)));\n        polarAngle += antimeridian ? dλ + (dλ >= 0 ? τ : -τ) : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && isLeft(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && isLeft(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function isLeft(a, b, c) {\n        return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]);\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      var transform = new d3_geo_transform(stream = resample(stream));\n      transform.point = function(x, y) {\n        stream.point(x * d3_radians, y * d3_radians);\n      };\n      return transform;\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    var transform = new d3_geo_transform(stream);\n    transform.point = function(λ, φ) {\n      stream.point(λ * d3_radians, φ * d3_radians);\n    };\n    return transform;\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      var ρ = abs(abs(φ) - halfπ) < ε ? 0 : F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    var B = Math.cos(φ) * Math.sin(λ);\n    return [ Math.log((1 + B) / (1 - B)) / 2, Math.atan2(Math.tan(φ), Math.cos(λ)) ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ Math.atan2(d3_sinh(x), Math.cos(y)), d3_asin(Math.sin(y) / d3_cosh(x)) ];\n  };\n  (d3.geo.transverseMercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_transverseMercator);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), n = data.length, vertices, plen = n - 1, points = [], stack = [], d, i, j, h = 0, x1, y1, x2, y2, u, v, a, sp;\n      if (fx === d3_geom_pointX && y === d3_geom_pointY) vertices = data; else for (i = 0, \n      vertices = []; i < n; ++i) {\n        vertices.push([ +fx.call(this, d = data[i], i), +fy.call(this, d, i) ]);\n      }\n      for (i = 1; i < n; ++i) {\n        if (vertices[i][1] < vertices[h][1] || vertices[i][1] == vertices[h][1] && vertices[i][0] < vertices[h][0]) h = i;\n      }\n      for (i = 0; i < n; ++i) {\n        if (i === h) continue;\n        y1 = vertices[i][1] - vertices[h][1];\n        x1 = vertices[i][0] - vertices[h][0];\n        points.push({\n          angle: Math.atan2(y1, x1),\n          index: i\n        });\n      }\n      points.sort(function(a, b) {\n        return a.angle - b.angle;\n      });\n      a = points[0].angle;\n      v = points[0].index;\n      u = 0;\n      for (i = 1; i < plen; ++i) {\n        j = points[i].index;\n        if (a == points[i].angle) {\n          x1 = vertices[v][0] - vertices[h][0];\n          y1 = vertices[v][1] - vertices[h][1];\n          x2 = vertices[j][0] - vertices[h][0];\n          y2 = vertices[j][1] - vertices[h][1];\n          if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) {\n            points[i].index = -1;\n            continue;\n          } else {\n            points[u].index = -1;\n          }\n        }\n        a = points[i].angle;\n        u = i;\n        v = j;\n      }\n      stack.push(h);\n      for (i = 0, j = 0; i < 2; ++j) {\n        if (points[j].index > -1) {\n          stack.push(points[j].index);\n          i++;\n        }\n      }\n      sp = stack.length;\n      for (;j < plen; ++j) {\n        if (points[j].index < 0) continue;\n        while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) {\n          --sp;\n        }\n        stack[sp++] = points[j].index;\n      }\n      var poly = [];\n      for (i = sp - 1; i >= 0; --i) poly.push(data[stack[i]]);\n      return poly;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullCCW(i1, i2, i3, v) {\n    var t, a, b, c, d, e, f;\n    t = v[i1];\n    a = t[0];\n    b = t[1];\n    t = v[i2];\n    c = t[0];\n    d = t[1];\n    t = v[i3];\n    e = t[0];\n    f = t[1];\n    return (f - b) * (c - a) - (d - b) * (e - a) > 0;\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = x >= sx, bottom = y >= sy, i = (bottom << 1) + right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = sx; else x2 = sx;\n        if (bottom) y1 = sy; else y2 = sy;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    b -= a = +a;\n    return function(t) {\n      return a + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var m, i, j, s0 = 0, s1 = 0, s = [], q = [], n, o;\n    a = a + \"\", b = b + \"\";\n    d3_interpolate_number.lastIndex = 0;\n    for (i = 0; m = d3_interpolate_number.exec(b); ++i) {\n      if (m.index) s.push(b.substring(s0, s1 = m.index));\n      q.push({\n        i: s.length,\n        x: m[0]\n      });\n      s.push(null);\n      s0 = d3_interpolate_number.lastIndex;\n    }\n    if (s0 < b.length) s.push(b.substring(s0));\n    for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) {\n      o = q[i];\n      if (o.x == m[0]) {\n        if (o.i) {\n          if (s[o.i + 1] == null) {\n            s[o.i - 1] += o.x;\n            s.splice(o.i, 1);\n            for (j = i + 1; j < n; ++j) q[j].i--;\n          } else {\n            s[o.i - 1] += o.x + s[o.i + 1];\n            s.splice(o.i, 2);\n            for (j = i + 1; j < n; ++j) q[j].i -= 2;\n          }\n        } else {\n          if (s[o.i + 1] == null) {\n            s[o.i] = o.x;\n          } else {\n            s[o.i] = o.x + s[o.i + 1];\n            s.splice(o.i + 1, 1);\n            for (j = i + 1; j < n; ++j) q[j].i--;\n          }\n        }\n        q.splice(i, 1);\n        n--;\n        i--;\n      } else {\n        o.x = d3_interpolateNumber(parseFloat(m[0]), parseFloat(o.x));\n      }\n    }\n    while (i < n) {\n      o = q.pop();\n      if (s[o.i + 1] == null) {\n        s[o.i] = o.x;\n      } else {\n        s[o.i] = o.x + s[o.i + 1];\n        s.splice(o.i + 1, 1);\n      }\n      n--;\n    }\n    if (s.length === 1) {\n      return s[0] == null ? (o = q[0].x, function(t) {\n        return o(t) + \"\";\n      }) : function() {\n        return b;\n      };\n    }\n    return function(t) {\n      for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  var d3_interpolate_number = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g;\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b) || /^(#|rgb\\(|hsl\\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_Color ? d3_interpolateRgb : t === \"object\" ? Array.isArray(b) ? d3_interpolateArray : d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;\n    if (ta[0] != tb[0] || ta[1] != tb[1]) {\n      s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: 1,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: 3,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    } else {\n      s.push(\"\");\n    }\n    if (ra != rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(s.pop() + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(s.pop() + \"rotate(\" + rb + \")\");\n    }\n    if (wa != wb) {\n      q.push({\n        i: s.push(s.pop() + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(s.pop() + \"skewX(\" + wb + \")\");\n    }\n    if (ka[0] != kb[0] || ka[1] != kb[1]) {\n      n = s.push(s.pop() + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: n - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: n - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] != 1 || kb[1] != 1) {\n      s.push(s.pop() + \"scale(\" + kb + \")\");\n    }\n    n = q.length;\n    return function(t) {\n      var i = -1, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = b - (a = +a) ? 1 / (b - a) : 0;\n    return function(x) {\n      return (x - a) * b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = b - (a = +a) ? 1 / (b - a) : 0;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) * b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: (x - x0) / k\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy);\n          if ((x2 - x1) * dn < theta) {\n            var k = quad.charge * dn * dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n            return true;\n          }\n          if (quad.point && isFinite(dn)) {\n            var k = quad.pointCharge * dn * dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight / (t.weight + s.weight));\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return theta;\n      theta = +x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) alpha = x; else alpha = 0;\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        d3.timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, m = candidates.length, x;\n        while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function recurse(node, depth, nodes) {\n      var childs = children.call(hierarchy, node, depth);\n      node.depth = depth;\n      nodes.push(node);\n      if (childs && (n = childs.length)) {\n        var i = -1, n, c = node.children = new Array(n), v = 0, j = depth + 1, d;\n        while (++i < n) {\n          d = c[i] = recurse(childs[i], j, nodes);\n          d.parent = node;\n          v += d.value;\n        }\n        if (sort) c.sort(sort);\n        if (value) node.value = v;\n      } else {\n        delete node.children;\n        if (value) {\n          node.value = +value.call(hierarchy, node, depth) || 0;\n        }\n      }\n      return node;\n    }\n    function revalue(node, depth) {\n      var children = node.children, v = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n, j = depth + 1;\n        while (++i < n) v += revalue(children[i], j);\n      } else if (value) {\n        v = +value.call(hierarchy, node, depth) || 0;\n      }\n      if (value) node.value = v;\n      return v;\n    }\n    function hierarchy(d) {\n      var nodes = [];\n      recurse(d, 0, nodes);\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      revalue(root, 0);\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ;\n    function pie(data) {\n      var values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      });\n      var a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle);\n      var k = ((typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a) / d3.sum(values);\n      var index = d3.range(data.length);\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      var arcs = [];\n      index.forEach(function(i) {\n        var d;\n        arcs[i] = {\n          data: data[i],\n          value: d = values[i],\n          startAngle: a,\n          endAngle: a += d * k\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return pie;\n    };\n    pie.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return pie;\n    };\n    pie.startAngle = function(x) {\n      if (!arguments.length) return startAngle;\n      startAngle = x;\n      return pie;\n    };\n    pie.endAngle = function(x) {\n      if (!arguments.length) return endAngle;\n      endAngle = x;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var n = series.length, m = series[0].length, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0];\n      function firstWalk(node, previousSibling) {\n        var children = node.children, layout = node._tree;\n        if (children && (n = children.length)) {\n          var n, firstChild = children[0], previousChild, ancestor = firstChild, child, i = -1;\n          while (++i < n) {\n            child = children[i];\n            firstWalk(child, previousChild);\n            ancestor = apportion(child, previousChild, ancestor);\n            previousChild = child;\n          }\n          d3_layout_treeShift(node);\n          var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim);\n          if (previousSibling) {\n            layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);\n            layout.mod = layout.prelim - midpoint;\n          } else {\n            layout.prelim = midpoint;\n          }\n        } else {\n          if (previousSibling) {\n            layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling);\n          }\n        }\n      }\n      function secondWalk(node, x) {\n        node.x = node._tree.prelim + x;\n        var children = node.children;\n        if (children && (n = children.length)) {\n          var i = -1, n;\n          x += node._tree.mod;\n          while (++i < n) {\n            secondWalk(children[i], x);\n          }\n        }\n      }\n      function apportion(node, previousSibling, ancestor) {\n        if (previousSibling) {\n          var vip = node, vop = node, vim = previousSibling, vom = node.parent.children[0], sip = vip._tree.mod, sop = vop._tree.mod, sim = vim._tree.mod, som = vom._tree.mod, shift;\n          while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n            vom = d3_layout_treeLeft(vom);\n            vop = d3_layout_treeRight(vop);\n            vop._tree.ancestor = node;\n            shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip);\n            if (shift > 0) {\n              d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift);\n              sip += shift;\n              sop += shift;\n            }\n            sim += vim._tree.mod;\n            sip += vip._tree.mod;\n            som += vom._tree.mod;\n            sop += vop._tree.mod;\n          }\n          if (vim && !d3_layout_treeRight(vop)) {\n            vop._tree.thread = vim;\n            vop._tree.mod += sim - sop;\n          }\n          if (vip && !d3_layout_treeLeft(vom)) {\n            vom._tree.thread = vip;\n            vom._tree.mod += sip - som;\n            ancestor = node;\n          }\n        }\n        return ancestor;\n      }\n      d3_layout_treeVisitAfter(root, function(node, previousSibling) {\n        node._tree = {\n          ancestor: node,\n          prelim: 0,\n          mod: 0,\n          change: 0,\n          shift: 0,\n          number: previousSibling ? previousSibling._tree.number + 1 : 0\n        };\n      });\n      firstWalk(root);\n      secondWalk(root, -root._tree.prelim);\n      var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), right = d3_layout_treeSearch(root, d3_layout_treeRightmost), deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2, y1 = deep.depth || 1;\n      d3_layout_treeVisitAfter(root, nodeSize ? function(node) {\n        node.x *= size[0];\n        node.y = node.depth * size[1];\n        delete node._tree;\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = node.depth / y1 * size[1];\n        delete node._tree;\n      });\n      return nodes;\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(node) {\n    var children = node.children;\n    return children && children.length ? children[0] : node._tree.thread;\n  }\n  function d3_layout_treeRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? children[n - 1] : node._tree.thread;\n  }\n  function d3_layout_treeSearch(node, compare) {\n    var children = node.children;\n    if (children && (n = children.length)) {\n      var child, n, i = -1;\n      while (++i < n) {\n        if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) {\n          node = child;\n        }\n      }\n    }\n    return node;\n  }\n  function d3_layout_treeRightmost(a, b) {\n    return a.x - b.x;\n  }\n  function d3_layout_treeLeftmost(a, b) {\n    return b.x - a.x;\n  }\n  function d3_layout_treeDeepest(a, b) {\n    return a.depth - b.depth;\n  }\n  function d3_layout_treeVisitAfter(node, callback) {\n    function visit(node, previousSibling) {\n      var children = node.children;\n      if (children && (n = children.length)) {\n        var child, previousChild = null, i = -1, n;\n        while (++i < n) {\n          child = children[i];\n          visit(child, previousChild);\n          previousChild = child;\n        }\n      }\n      callback(node, previousSibling);\n    }\n    visit(node, null);\n  }\n  function d3_layout_treeShift(node) {\n    var shift = 0, change = 0, children = node.children, i = children.length, child;\n    while (--i >= 0) {\n      child = children[i]._tree;\n      child.prelim += shift;\n      child.mod += shift;\n      shift += child.shift + (change += child.change);\n    }\n  }\n  function d3_layout_treeMove(ancestor, node, shift) {\n    ancestor = ancestor._tree;\n    node = node._tree;\n    var change = shift / (node.number - ancestor.number);\n    ancestor.change += change;\n    node.change -= change;\n    node.shift += shift;\n    node.prelim += shift;\n    node.mod += shift;\n  }\n  function d3_layout_treeAncestor(vim, node, ancestor) {\n    return vim._tree.ancestor.parent == node.parent ? vim._tree.ancestor : ancestor;\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_treeVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_treeVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_treeVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_treeVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_treeVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_treeVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_treeVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = 0;\n      root.y = 0;\n      root.dx = size[0];\n      root.dy = size[1];\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s / m;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var precision = -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01);\n    return d3.format(format ? format.replace(d3_format_re, function(a, b, c, d, e, f, g, h, i, j) {\n      return [ b, c, d, e, f, g, h, i || \".\" + (precision - (j === \"%\") * 2), j ].join(\"\");\n    }) : \",.\" + precision + \"f\");\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12, \n      Math.floor), e;\n      return function(d) {\n        return d / pow(f(log(d) + e)) <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || ranger.t === \"range\" && index.set(x, domain.push(x))) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);\n      range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;\n      range = steps(start + Math.round(error / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.filter(function(d) {\n        return !isNaN(d);\n      }).sort(d3.ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function arc() {\n      var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, \n      a0 = a1, a1 = da), a1 - a0), df = da < π ? \"0\" : \"1\", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);\n      return da >= d3_svg_arcMax ? r0 ? \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"M0,\" + r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + -r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + r0 + \"Z\" : \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"Z\" : r0 ? \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L\" + r0 * c1 + \",\" + r0 * s1 + \"A\" + r0 + \",\" + r0 + \" 0 \" + df + \",0 \" + r0 * c0 + \",\" + r0 * s0 + \"Z\" : \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L0,0\" + \"Z\";\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcOffset = -halfπ, d3_svg_arcMax = τ - ε;\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.join(\"L\");\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return d3_svg_lineLinear(points) + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] + d3_svg_arcOffset;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  function d3_transition(groups, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection) {\n    return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, id, node.__transition__[id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node.__transition__[id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id;\n    if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node.__transition__[id].tween.remove(name);\n    } : function(node) {\n      node.__transition__[id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node.__transition__[id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node.__transition__[id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node.__transition__[id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node.__transition__[id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      d3_transitionInheritId = id;\n      d3_selection_each(this, function(node, i, j) {\n        d3_transitionInherit = node.__transition__[id];\n        type.call(node, node.__data__, i, j);\n      });\n      d3_transitionInherit = inherit;\n      d3_transitionInheritId = inheritId;\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node.__transition__[id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = Object.create(node.__transition__[id0]);\n          transition.delay += transition.duration;\n          d3_transitionNode(node, i, id1, transition);\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id1);\n  };\n  function d3_transitionNode(node, i, id, inherit) {\n    var lock = node.__transition__ || (node.__transition__ = {\n      active: 0,\n      count: 0\n    }), transition = lock[id];\n    if (!transition) {\n      var time = inherit.time;\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        ease: inherit.ease,\n        delay: inherit.delay,\n        duration: inherit.duration\n      };\n      ++lock.count;\n      d3.timer(function(elapsed) {\n        var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, timer = d3_timer_active, tweened = [];\n        timer.t = delay + time;\n        if (delay <= elapsed) return start(elapsed - delay);\n        timer.c = start;\n        function start(elapsed) {\n          if (lock.active > id) return stop();\n          lock.active = id;\n          transition.event && transition.event.start.call(node, d, i);\n          transition.tween.forEach(function(key, value) {\n            if (value = value.call(node, d, i)) {\n              tweened.push(value);\n            }\n          });\n          d3.timer(function() {\n            timer.c = tick(elapsed || 1) ? d3_true : tick;\n            return 1;\n          }, 0, time);\n        }\n        function tick(elapsed) {\n          if (lock.active !== id) return stop();\n          var t = elapsed / duration, e = ease(t), n = tweened.length;\n          while (n > 0) {\n            tweened[--n].call(node, e);\n          }\n          if (t >= 1) {\n            transition.event && transition.event.end.call(node, d, i);\n            return stop();\n          }\n        }\n        function stop() {\n          if (--lock.count) delete lock[id]; else delete node.__transition__;\n          return 1;\n        }\n      }, 0, time);\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick).style(\"opacity\", 1), tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\");\n        switch (orient) {\n         case \"bottom\":\n          {\n            tickTransform = d3_svg_axisX;\n            lineEnter.attr(\"y2\", innerTickSize);\n            textEnter.attr(\"y\", Math.max(innerTickSize, 0) + tickPadding);\n            lineUpdate.attr(\"x2\", 0).attr(\"y2\", innerTickSize);\n            textUpdate.attr(\"x\", 0).attr(\"y\", Math.max(innerTickSize, 0) + tickPadding);\n            text.attr(\"dy\", \".71em\").style(\"text-anchor\", \"middle\");\n            pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + outerTickSize + \"V0H\" + range[1] + \"V\" + outerTickSize);\n            break;\n          }\n\n         case \"top\":\n          {\n            tickTransform = d3_svg_axisX;\n            lineEnter.attr(\"y2\", -innerTickSize);\n            textEnter.attr(\"y\", -(Math.max(innerTickSize, 0) + tickPadding));\n            lineUpdate.attr(\"x2\", 0).attr(\"y2\", -innerTickSize);\n            textUpdate.attr(\"x\", 0).attr(\"y\", -(Math.max(innerTickSize, 0) + tickPadding));\n            text.attr(\"dy\", \"0em\").style(\"text-anchor\", \"middle\");\n            pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + -outerTickSize + \"V0H\" + range[1] + \"V\" + -outerTickSize);\n            break;\n          }\n\n         case \"left\":\n          {\n            tickTransform = d3_svg_axisY;\n            lineEnter.attr(\"x2\", -innerTickSize);\n            textEnter.attr(\"x\", -(Math.max(innerTickSize, 0) + tickPadding));\n            lineUpdate.attr(\"x2\", -innerTickSize).attr(\"y2\", 0);\n            textUpdate.attr(\"x\", -(Math.max(innerTickSize, 0) + tickPadding)).attr(\"y\", 0);\n            text.attr(\"dy\", \".32em\").style(\"text-anchor\", \"end\");\n            pathUpdate.attr(\"d\", \"M\" + -outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + -outerTickSize);\n            break;\n          }\n\n         case \"right\":\n          {\n            tickTransform = d3_svg_axisY;\n            lineEnter.attr(\"x2\", innerTickSize);\n            textEnter.attr(\"x\", Math.max(innerTickSize, 0) + tickPadding);\n            lineUpdate.attr(\"x2\", innerTickSize).attr(\"y2\", 0);\n            textUpdate.attr(\"x\", Math.max(innerTickSize, 0) + tickPadding).attr(\"y\", 0);\n            text.attr(\"dy\", \".32em\").style(\"text-anchor\", \"start\");\n            pathUpdate.attr(\"d\", \"M\" + outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + outerTickSize);\n            break;\n          }\n        }\n        if (scale1.rangeBand) {\n          var dx = scale1.rangeBand() / 2, x = function(d) {\n            return scale1(d) + dx;\n          };\n          tickEnter.call(tickTransform, x);\n          tickUpdate.call(tickTransform, x);\n        } else {\n          tickEnter.call(tickTransform, scale0);\n          tickUpdate.call(tickTransform, scale1);\n          tickExit.call(tickTransform, scale1);\n        }\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = arguments;\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x) {\n    selection.attr(\"transform\", function(d) {\n      return \"translate(\" + x(d) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y) {\n    selection.attr(\"transform\", function(d) {\n      return \"translate(0,\" + y(d) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time = d3.time = {}, d3_date = Date, d3_time_daySymbols = [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ];\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  var d3_time_formatDateTime = \"%a %b %e %X %Y\", d3_time_formatDate = \"%m/%d/%Y\", d3_time_formatTime = \"%H:%M:%S\";\n  var d3_time_days = [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ], d3_time_dayAbbreviations = [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ], d3_time_months = [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ], d3_time_monthAbbreviations = [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ];\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  d3_time_daySymbols.forEach(function(day, i) {\n    day = day.toLowerCase();\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  d3_time.format = d3_time_format;\n  function d3_time_format(template) {\n    var n = template.length;\n    function format(date) {\n      var string = [], i = -1, j = 0, c, p, f;\n      while (++i < n) {\n        if (template.charCodeAt(i) === 37) {\n          string.push(template.substring(j, i));\n          if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n          if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n          string.push(c);\n          j = i + 1;\n        }\n      }\n      string.push(template.substring(j, i));\n      return string.join(\"\");\n    }\n    format.parse = function(string) {\n      var d = {\n        y: 1900,\n        m: 0,\n        d: 1,\n        H: 0,\n        M: 0,\n        S: 0,\n        L: 0,\n        Z: null\n      }, i = d3_time_parse(d, template, string, 0);\n      if (i != string.length) return null;\n      if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n      var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n      if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"w\" in d && (\"W\" in d || \"U\" in d)) {\n        date.setFullYear(d.y, 0, 1);\n        date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n      } else date.setFullYear(d.y, d.m, d.d);\n      date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L);\n      return localZ ? date._ : date;\n    };\n    format.toString = function() {\n      return template;\n    };\n    return format;\n  }\n  function d3_time_parse(date, template, string, j) {\n    var c, p, t, i = 0, n = template.length, m = string.length;\n    while (i < n) {\n      if (j >= m) return -1;\n      c = template.charCodeAt(i++);\n      if (c === 37) {\n        t = template.charAt(i++);\n        p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n        if (!p || (j = p(date, string, j)) < 0) return -1;\n      } else if (c != string.charCodeAt(j++)) {\n        return -1;\n      }\n    }\n    return j;\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  var d3_time_dayRe = d3_time_formatRe(d3_time_days), d3_time_dayLookup = d3_time_formatLookup(d3_time_days), d3_time_dayAbbrevRe = d3_time_formatRe(d3_time_dayAbbreviations), d3_time_dayAbbrevLookup = d3_time_formatLookup(d3_time_dayAbbreviations), d3_time_monthRe = d3_time_formatRe(d3_time_months), d3_time_monthLookup = d3_time_formatLookup(d3_time_months), d3_time_monthAbbrevRe = d3_time_formatRe(d3_time_monthAbbreviations), d3_time_monthAbbrevLookup = d3_time_formatLookup(d3_time_monthAbbreviations), d3_time_percentRe = /^%/;\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  };\n  var d3_time_formats = {\n    a: function(d) {\n      return d3_time_dayAbbreviations[d.getDay()];\n    },\n    A: function(d) {\n      return d3_time_days[d.getDay()];\n    },\n    b: function(d) {\n      return d3_time_monthAbbreviations[d.getMonth()];\n    },\n    B: function(d) {\n      return d3_time_months[d.getMonth()];\n    },\n    c: d3_time_format(d3_time_formatDateTime),\n    d: function(d, p) {\n      return d3_time_formatPad(d.getDate(), p, 2);\n    },\n    e: function(d, p) {\n      return d3_time_formatPad(d.getDate(), p, 2);\n    },\n    H: function(d, p) {\n      return d3_time_formatPad(d.getHours(), p, 2);\n    },\n    I: function(d, p) {\n      return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n    },\n    j: function(d, p) {\n      return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n    },\n    L: function(d, p) {\n      return d3_time_formatPad(d.getMilliseconds(), p, 3);\n    },\n    m: function(d, p) {\n      return d3_time_formatPad(d.getMonth() + 1, p, 2);\n    },\n    M: function(d, p) {\n      return d3_time_formatPad(d.getMinutes(), p, 2);\n    },\n    p: function(d) {\n      return d.getHours() >= 12 ? \"PM\" : \"AM\";\n    },\n    S: function(d, p) {\n      return d3_time_formatPad(d.getSeconds(), p, 2);\n    },\n    U: function(d, p) {\n      return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n    },\n    w: function(d) {\n      return d.getDay();\n    },\n    W: function(d, p) {\n      return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n    },\n    x: d3_time_format(d3_time_formatDate),\n    X: d3_time_format(d3_time_formatTime),\n    y: function(d, p) {\n      return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n    },\n    Y: function(d, p) {\n      return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n    },\n    Z: d3_time_zone,\n    \"%\": function() {\n      return \"%\";\n    }\n  };\n  var d3_time_parsers = {\n    a: d3_time_parseWeekdayAbbrev,\n    A: d3_time_parseWeekday,\n    b: d3_time_parseMonthAbbrev,\n    B: d3_time_parseMonth,\n    c: d3_time_parseLocaleFull,\n    d: d3_time_parseDay,\n    e: d3_time_parseDay,\n    H: d3_time_parseHour24,\n    I: d3_time_parseHour24,\n    j: d3_time_parseDayOfYear,\n    L: d3_time_parseMilliseconds,\n    m: d3_time_parseMonthNumber,\n    M: d3_time_parseMinutes,\n    p: d3_time_parseAmPm,\n    S: d3_time_parseSeconds,\n    U: d3_time_parseWeekNumberSunday,\n    w: d3_time_parseWeekdayNumber,\n    W: d3_time_parseWeekNumberMonday,\n    x: d3_time_parseLocaleDate,\n    X: d3_time_parseLocaleTime,\n    y: d3_time_parseYear,\n    Y: d3_time_parseFullYear,\n    Z: d3_time_parseZone,\n    \"%\": d3_time_parseLiteralPercent\n  };\n  function d3_time_parseWeekdayAbbrev(date, string, i) {\n    d3_time_dayAbbrevRe.lastIndex = 0;\n    var n = d3_time_dayAbbrevRe.exec(string.substring(i));\n    return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekday(date, string, i) {\n    d3_time_dayRe.lastIndex = 0;\n    var n = d3_time_dayRe.exec(string.substring(i));\n    return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMonthAbbrev(date, string, i) {\n    d3_time_monthAbbrevRe.lastIndex = 0;\n    var n = d3_time_monthAbbrevRe.exec(string.substring(i));\n    return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n  function d3_time_parseMonth(date, string, i) {\n    d3_time_monthRe.lastIndex = 0;\n    var n = d3_time_monthRe.exec(string.substring(i));\n    return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n  }\n  function d3_time_parseLocaleFull(date, string, i) {\n    return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n  }\n  function d3_time_parseLocaleDate(date, string, i) {\n    return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n  }\n  function d3_time_parseLocaleTime(date, string, i) {\n    return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.substring(i, i + 5)) ? (date.Z = +string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  var d3_time_numberRe = /^\\s*\\d+/;\n  function d3_time_parseAmPm(date, string, i) {\n    var n = d3_time_amPmLookup.get(string.substring(i, i += 2).toLowerCase());\n    return n == null ? -1 : (date.p = n, i);\n  }\n  var d3_time_amPmLookup = d3.map({\n    am: 0,\n    pm: 1\n  });\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = ~~(abs(z) / 60), zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.substring(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  d3_time_format.utc = d3_time_formatUtc;\n  function d3_time_formatUtc(template) {\n    var local = d3_time_format(template);\n    function format(date) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date();\n        utc._ = date;\n        return local(utc);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    format.parse = function(string) {\n      try {\n        d3_date = d3_date_utc;\n        var date = local.parse(string);\n        return date && date._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n    format.toString = local.toString;\n    return format;\n  }\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  function d3_time_scaleFormat(formats) {\n    return function(date) {\n      var i = formats.length - 1, f = formats[i];\n      while (!f[1](date)) f = formats[--i];\n      return f[0](date);\n    };\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormats = [ [ d3_time_format(\"%Y\"), d3_true ], [ d3_time_format(\"%B\"), function(d) {\n    return d.getMonth();\n  } ], [ d3_time_format(\"%b %d\"), function(d) {\n    return d.getDate() != 1;\n  } ], [ d3_time_format(\"%a %d\"), function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ d3_time_format(\"%I %p\"), function(d) {\n    return d.getHours();\n  } ], [ d3_time_format(\"%I:%M\"), function(d) {\n    return d.getMinutes();\n  } ], [ d3_time_format(\":%S\"), function(d) {\n    return d.getSeconds();\n  } ], [ d3_time_format(\".%L\"), function(d) {\n    return d.getMilliseconds();\n  } ] ];\n  var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats);\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(+start, +stop, step).map(d3_time_scaleDate);\n    }\n  };\n  var d3_time_scaleUTCMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUTCFormats = [ [ d3_time_formatUtc(\"%Y\"), d3_true ], [ d3_time_formatUtc(\"%B\"), function(d) {\n    return d.getUTCMonth();\n  } ], [ d3_time_formatUtc(\"%b %d\"), function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ d3_time_formatUtc(\"%a %d\"), function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ d3_time_formatUtc(\"%I %p\"), function(d) {\n    return d.getUTCHours();\n  } ], [ d3_time_formatUtc(\"%I:%M\"), function(d) {\n    return d.getUTCMinutes();\n  } ], [ d3_time_formatUtc(\":%S\"), function(d) {\n    return d.getUTCSeconds();\n  } ], [ d3_time_formatUtc(\".%L\"), function(d) {\n    return d.getUTCMilliseconds();\n  } ] ];\n  var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats);\n  d3_time_scaleUTCMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  return d3;\n}();"
  },
  {
    "path": "server/static/lib/images/LICENSE",
    "content": "icons source:\nhttps://www.iconfinder.com/iconsets/free-grey-cloud-icons#readme\nhttps://www.iconfinder.com/icons/129397/spider_web_icon#size=96\n\nlicense:\nhttp://creativecommons.org/licenses/by/3.0/legalcode\n"
  },
  {
    "path": "server/static/lib/jquery-2.0.3.js",
    "content": "/*!\n * jQuery JavaScript Library v2.0.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:30Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// Support: IE9\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"2.0.3\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler and self cleanup method\n\tcompleted = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\twindow.removeEventListener( \"load\", completed, false );\n\t\tjQuery.ready();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\t// Support: Safari <= 5.1 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: Firefox <20\n\t\t// The try/catch suppresses exceptions thrown when attempting to access\n\t\t// the \"constructor\" property of certain host objects, ie. |window.location|\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=814622\n\t\ttry {\n\t\t\tif ( obj.constructor &&\n\t\t\t\t\t!core_hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: JSON.parse,\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Support: IE9\n\t\ttry {\n\t\t\ttmp = new DOMParser();\n\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t} catch ( e ) {\n\t\t\txml = undefined;\n\t\t}\n\n\t\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\ttrim: function( text ) {\n\t\treturn text == null ? \"\" : core_trim.call( text );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : core_indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: Date.now,\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.9.4-pre\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-06-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content_script attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\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\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\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}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content_script nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\tvar input = document.createElement(\"input\"),\n\t\tfragment = document.createDocumentFragment(),\n\t\tdiv = document.createElement(\"div\"),\n\t\tselect = document.createElement(\"select\"),\n\t\topt = select.appendChild( document.createElement(\"option\") );\n\n\t// Finish early in limited environments\n\tif ( !input.type ) {\n\t\treturn support;\n\t}\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// Check the default checkbox/radio value (\"\" on old WebKit; \"on\" elsewhere)\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Must access the parent to make an option select properly\n\t// Support: IE9, IE10\n\tsupport.optSelected = opt.selected;\n\n\t// Will be defined later\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\tsupport.pixelPosition = false;\n\n\t// Make sure checked status is properly cloned\n\t// Support: IE9, IE10\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Check if an input maintains its value after becoming a radio\n\t// Support: IE9, IE10\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment.appendChild( input );\n\n\t// Support: Safari 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: Firefox, Chrome, Safari\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tsupport.focusinBubbles = \"onfocusin\" in window;\n\n\tdiv.style.backgroundClip = \"content_script-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content_script-box\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv,\n\t\t\t// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content_script-box;-moz-box-sizing:content_script-box;box-sizing:content_script-box\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[ 0 ];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\t// Check box-sizing and margin behavior.\n\t\tbody.appendChild( container ).appendChild( div );\n\t\tdiv.innerHTML = \"\";\n\t\t// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).\n\t\tdiv.style.cssText = \"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tbody.removeChild( container );\n\t});\n\n\treturn support;\n})( {} );\n\n/*\n\tImplementation Summary\n\n\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n\t2. Improve the module's maintainability by reducing the storage\n\t\tpaths to a single mechanism.\n\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n*/\nvar data_user, data_priv,\n\trbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction Data() {\n\t// Support: Android < 4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Math.random();\n}\n\nData.uid = 1;\n\nData.accepts = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType ?\n\t\towner.nodeType === 1 || owner.nodeType === 9 : true;\n};\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android < 4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( core_rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\n\n// These may be used throughout the jQuery core codebase\ndata_user = new Data();\ndata_priv = new Data();\n\n\njQuery.extend({\n\tacceptData: Data.accepts,\n\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\telem = this[ 0 ],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[ i ].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? JSON.parse( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\tret = isXML ?\n\t\t\t\tundefined :\n\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t// Temporarily disable this handler to check existence\n\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\n\t\t// Restore handler\n\t\tjQuery.expr.attrHandle[ name ] = fn;\n\n\t\treturn ret;\n\t};\n});\n\n// Support: IE9+\n// Selectedness for an option in an optgroup can be inaccurate\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome < 28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Create \"bubbling\" focus and blur events\n// Support: Firefox, Chrome, Safari\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = ( rneedsContext.test( selectors ) || typeof selectors !== \"string\" ) ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = matched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn core_indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn core_indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\nvar rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE 9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE 9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content_script\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content_script to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content_script (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because core_push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because core_push.apply(_, arraylike) throws\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Support: IE >= 9\n\t\t// Fix Cloning issues\n\t\tif ( !jQuery.support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\ti = 0,\n\t\t\tl = elems.length,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [];\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t// jQuery.merge because core_push.apply(_, arraylike) throws\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content_script\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t// jQuery.merge because core_push.apply(_, arraylike) throws\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Fixes #12346\n\t\t\t\t\t// Support: Webkit, IE\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, events, type, key, j,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( Data.accepts( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tevents = Object.keys( data.events || {} );\n\t\t\t\t\tif ( events.length ) {\n\t\t\t\t\t\tfor ( j = 0; (type = events[j]) !== undefined; j++ ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar l = elems.length,\n\t\ti = 0;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Support: IE >= 9\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar curCSS, iframe,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nfunction getStyles( elem ) {\n\treturn window.getComputedStyle( elem, null );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css(elem, \"display\") );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifying setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\ncurCSS = function( elem, name, _computed ) {\n\tvar width, minWidth, maxWidth,\n\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t// Support: IE9\n\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\tstyle = elem.style;\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: Safari 5.1\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content_script\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content_script\n\t\t\tif ( extra === \"content_script\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content_script, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content_script nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content_script\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\t// Support: Android 2.3\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// Support: Android 2.3\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content_script-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content_script\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content_script\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content_script\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content_script-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content_script-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content_script-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrSupported = jQuery.ajaxSettings.xhr(),\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\t// Support: IE9\n\t// We need to keep track of outbound xhr and abort them manually\n\t// because IE is not smart enough to do it all by itself\n\txhrId = 0,\n\txhrCallbacks = {};\n\nif ( window.ActiveXObject ) {\n\tjQuery( window ).on( \"unload\", function() {\n\t\tfor( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t\txhrCallbacks = undefined;\n\t});\n}\n\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\njQuery.support.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i, id,\n\t\t\t\t\txhr = options.xhr();\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file protocol always yields status 0, assume 404\n\t\t\t\t\t\t\t\t\txhr.status || 404,\n\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// #11426: When requesting binary data, IE9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[( id = xhrId++ )] = callback(\"abort\");\n\t\t\t\t// Do send the request\n\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\telem = this[ 0 ],\n\t\tbox = { top: 0, left: 0 },\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && ( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// We assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n// If there is a window object, that at least has a document property,\n// define jQuery and $ identifiers\nif ( typeof window === \"object\" && typeof window.document === \"object\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n})( window );\n"
  },
  {
    "path": "server/static/lib/jquery.bootstrapvalidator/bootstrapValidator.css",
    "content": "/**\n * BootstrapValidator (http://bootstrapvalidator.com)\n * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3\n *\n * @author      http://twitter.com/nghuuphuoc\n * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc\n * @license     MIT\n */\n\n.bv-form .help-block {\n    margin-bottom: 0;\n}\n.bv-form .tooltip-inner {\n    text-align: left;\n}\n.nav-tabs li.bv-tab-success > a {\n    color: #3c763d;\n}\n.nav-tabs li.bv-tab-error > a {\n    color: #a94442;\n}\n"
  },
  {
    "path": "server/static/lib/jquery.bootstrapvalidator/bootstrapValidator.js",
    "content": "/*!\n * BootstrapValidator (http://bootstrapvalidator.com)\n * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3\n *\n * @version     v0.5.0, built on 2014-07-14 4:31:02 PM\n * @author      https://twitter.com/nghuuphuoc\n * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc\n * @license     MIT\n */\n(function($) {\n    var BootstrapValidator = function(form, options) {\n        this.$form   = $(form);\n        this.options = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, options);\n\n        this.$invalidFields = $([]);    // Array of invalid fields\n        this.$submitButton  = null;     // The submit button which is clicked to submit form\n\n        // Validating status\n        this.STATUS_NOT_VALIDATED = 'NOT_VALIDATED';\n        this.STATUS_VALIDATING    = 'VALIDATING';\n        this.STATUS_INVALID       = 'INVALID';\n        this.STATUS_VALID         = 'VALID';\n\n        // Determine the event that is fired when user change the field value\n        // Most modern browsers supports input event except IE 7, 8.\n        // IE 9 supports input event but the event is still not fired if I press the backspace key.\n        // Get IE version\n        // https://gist.github.com/padolsey/527683/#comment-7595\n        var ieVersion = (function() {\n            var v = 3, div = document.createElement('div'), a = div.all || [];\n            while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]) {}\n            return v > 4 ? v : !v;\n        }());\n\n        var el = document.createElement('div');\n        this._changeEvent = (ieVersion === 9 || !('oninput' in el)) ? 'keyup' : 'input';\n\n        // The flag to indicate that the form is ready to submit when a remote/callback validator returns\n        this._submitIfValid = null;\n\n        // Field elements\n        this._cacheFields = {};\n\n        this._init();\n    };\n\n    BootstrapValidator.prototype = {\n        constructor: BootstrapValidator,\n\n        /**\n         * Init form\n         */\n        _init: function() {\n            var that    = this,\n                options = {\n                    excluded:       this.$form.attr('data-bv-excluded'),\n                    trigger:        this.$form.attr('data-bv-trigger'),\n                    message:        this.$form.attr('data-bv-message'),\n                    container:      this.$form.attr('data-bv-container'),\n                    group:          this.$form.attr('data-bv-group'),\n                    submitButtons:  this.$form.attr('data-bv-submitbuttons'),\n                    threshold:      this.$form.attr('data-bv-threshold'),\n                    live:           this.$form.attr('data-bv-live'),\n                    onSuccess:      this.$form.attr('data-bv-onsuccess'),\n                    onError:        this.$form.attr('data-bv-onerror'),\n                    fields:         {},\n                    feedbackIcons: {\n                        valid:      this.$form.attr('data-bv-feedbackicons-valid'),\n                        invalid:    this.$form.attr('data-bv-feedbackicons-invalid'),\n                        validating: this.$form.attr('data-bv-feedbackicons-validating')\n                    }\n                };\n\n            this.$form\n                // Disable client side validation in HTML 5\n                .attr('novalidate', 'novalidate')\n                .addClass(this.options.elementClass)\n                // Disable the default submission first\n                .on('submit.bv', function(e) {\n                    e.preventDefault();\n                    that.validate();\n                })\n                .on('click.bv', this.options.submitButtons, function() {\n                    that.$submitButton  = $(this);\n\t\t\t\t\t// The user just click the submit button\n\t\t\t\t\tthat._submitIfValid = true;\n                })\n                // Find all fields which have either \"name\" or \"data-bv-field\" attribute\n                .find('[name], [data-bv-field]')\n                    .each(function() {\n                        var $field = $(this),\n                            field  = $field.attr('name') || $field.attr('data-bv-field'),\n                            opts   = that._parseOptions($field);\n                        if (opts) {\n                            $field.attr('data-bv-field', field);\n                            options.fields[field] = $.extend({}, opts, options.fields[field]);\n                        }\n                    });\n\n            this.options = $.extend(true, this.options, options);\n            for (var field in this.options.fields) {\n                this._initField(field);\n            }\n\n            this.$form.trigger($.Event('init.form.bv'), {\n                bv: this,\n                options: this.options\n            });\n\n            // Prepare the events\n            if (this.options.onSuccess) {\n                this.$form.on('success.form.bv', function(e) {\n                    $.fn.bootstrapValidator.helpers.call(that.options.onSuccess, [e]);\n                });\n            }\n            if (this.options.onError) {\n                this.$form.on('error.form.bv', function(e) {\n                    $.fn.bootstrapValidator.helpers.call(that.options.onError, [e]);\n                });\n            }\n        },\n\n        /**\n         * Parse the validator options from HTML attributes\n         *\n         * @param {jQuery} $field The field element\n         * @returns {Object}\n         */\n        _parseOptions: function($field) {\n            var field      = $field.attr('name') || $field.attr('data-bv-field'),\n                validators = {},\n                validator,\n                v,          // Validator name\n                enabled,\n                optionName,\n                optionValue,\n                html5AttrName,\n                html5AttrMap;\n\n            for (v in $.fn.bootstrapValidator.validators) {\n                validator    = $.fn.bootstrapValidator.validators[v];\n                enabled      = $field.attr('data-bv-' + v.toLowerCase()) + '';\n                html5AttrMap = ('function' === typeof validator.enableByHtml5) ? validator.enableByHtml5($field) : null;\n\n                if ((html5AttrMap && enabled !== 'false')\n                    || (html5AttrMap !== true && ('' === enabled || 'true' === enabled)))\n                {\n                    // Try to parse the options via attributes\n                    validator.html5Attributes = $.extend({}, { message: 'message', onerror: 'onError', onsuccess: 'onSuccess' }, validator.html5Attributes);\n                    validators[v] = $.extend({}, html5AttrMap === true ? {} : html5AttrMap, validators[v]);\n\n                    for (html5AttrName in validator.html5Attributes) {\n                        optionName  = validator.html5Attributes[html5AttrName];\n                        optionValue = $field.attr('data-bv-' + v.toLowerCase() + '-' + html5AttrName);\n                        if (optionValue) {\n                            if ('true' === optionValue) {\n                                optionValue = true;\n                            } else if ('false' === optionValue) {\n                                optionValue = false;\n                            }\n                            validators[v][optionName] = optionValue;\n                        }\n                    }\n                }\n            }\n\n            var opts = {\n                    excluded:      $field.attr('data-bv-excluded'),\n                    feedbackIcons: $field.attr('data-bv-feedbackicons'),\n                    trigger:       $field.attr('data-bv-trigger'),\n                    message:       $field.attr('data-bv-message'),\n                    container:     $field.attr('data-bv-container'),\n                    group:         $field.attr('data-bv-group'),\n                    selector:      $field.attr('data-bv-selector'),\n                    threshold:     $field.attr('data-bv-threshold'),\n                    onStatus:      $field.attr('data-bv-onstatus'),\n                    onSuccess:     $field.attr('data-bv-onsuccess'),\n                    onError:       $field.attr('data-bv-onerror'),\n                    validators:    validators\n                },\n                emptyOptions    = $.isEmptyObject(opts),        // Check if the field options are set using HTML attributes\n                emptyValidators = $.isEmptyObject(validators);  // Check if the field validators are set using HTML attributes\n\n            if (!emptyValidators || (!emptyOptions && this.options.fields && this.options.fields[field])) {\n                opts.validators = validators;\n                return opts;\n            } else {\n                return null;\n            }\n        },\n\n        /**\n         * Init field\n         *\n         * @param {String|jQuery} field The field name or field element\n         */\n        _initField: function(field) {\n            var fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    fields = field;\n                    field  = field.attr('data-bv-field');\n                    break;\n                case 'string':\n                    fields = this.getFieldElements(field);\n                    fields.attr('data-bv-field', field);\n                    break;\n                default:\n                    break;\n            }\n\n            if (this.options.fields[field] === null || this.options.fields[field].validators === null) {\n                return;\n            }\n\n            // We don't need to validate non-existing fields\n            if (fields.length === 0) {\n                delete this.options.fields[field];\n                return;\n            }\n            var validatorName;\n            for (validatorName in this.options.fields[field].validators) {\n                if (!$.fn.bootstrapValidator.validators[validatorName]) {\n                    delete this.options.fields[field].validators[validatorName];\n                }\n            }\n            if (this.options.fields[field].enabled === null) {\n                this.options.fields[field].enabled = true;\n            }\n\n            var that      = this,\n                total     = fields.length,\n                type      = fields.attr('type'),\n                updateAll = (total === 1) || ('radio' === type) || ('checkbox' === type),\n                event     = ('radio' === type || 'checkbox' === type || 'file' === type || 'SELECT' === fields.eq(0).get(0).tagName) ? 'change' : this._changeEvent,\n                trigger   = (this.options.fields[field].trigger || this.options.trigger || event).split(' '),\n                events    = $.map(trigger, function(item) {\n                    return item + '.update.bv';\n                }).join(' ');\n\n            for (var i = 0; i < total; i++) {\n                var $field    = fields.eq(i),\n                    group     = this.options.fields[field].group || this.options.group,\n                    $parent   = $field.parents(group),\n                    // Allow user to indicate where the error messages are shown\n                    container = this.options.fields[field].container || this.options.container,\n                    $message  = (container && container !== 'tooltip' && container !== 'popover') ? $(container) : this._getMessageContainer($field, group);\n\n                if (container && container !== 'tooltip' && container !== 'popover') {\n                    $message.addClass('has-error');\n                }\n\n                // Remove all error messages and feedback icons\n                $message.find('.help-block[data-bv-validator][data-bv-for=\"' + field + '\"]').remove();\n                $parent.find('i[data-bv-icon-for=\"' + field + '\"]').remove();\n\n                // Whenever the user change the field value, mark it as not validated yet\n                $field.off(events).on(events, function() {\n                    that.updateStatus($(this), that.STATUS_NOT_VALIDATED);\n                });\n\n                // Create help block elements for showing the error messages\n                $field.data('bv.messages', $message);\n                for (validatorName in this.options.fields[field].validators) {\n                    $field.data('bv.result.' + validatorName, this.STATUS_NOT_VALIDATED);\n\n                    if (!updateAll || i === total - 1) {\n                        $('<small/>')\n                            .css('display', 'none')\n                            .addClass('help-block')\n                            .attr('data-bv-validator', validatorName)\n                            .attr('data-bv-for', field)\n                            .attr('data-bv-result', this.STATUS_NOT_VALIDATED)\n                            .html(this._getMessage(field, validatorName))\n                            .appendTo($message);\n                    }\n\n                    // Prepare the validator events\n                    if (this.options.fields[field].validators[validatorName].onSuccess) {\n                        $field.on('success.validator.bv', function(e, data) {\n                             $.fn.bootstrapValidator.helpers.call(that.options.fields[field].validators[validatorName].onSuccess, [e, data]);\n                        });\n                    }\n                    if (this.options.fields[field].validators[validatorName].onError) {\n                        $field.on('error.validator.bv', function(e, data) {\n                             $.fn.bootstrapValidator.helpers.call(that.options.fields[field].validators[validatorName].onError, [e, data]);\n                        });\n                    }\n                }\n\n                // Prepare the feedback icons\n                // Available from Bootstrap 3.1 (http://getbootstrap.com/css/#forms-control-validation)\n                if (this.options.fields[field].feedbackIcons !== false && this.options.fields[field].feedbackIcons !== 'false'\n                    && this.options.feedbackIcons\n                    && this.options.feedbackIcons.validating && this.options.feedbackIcons.invalid && this.options.feedbackIcons.valid\n                    && (!updateAll || i === total - 1))\n                {\n                    $parent.removeClass('has-success').removeClass('has-error').addClass('has-feedback');\n                    var $icon = $('<i/>')\n                                    .css('display', 'none')\n                                    .addClass('form-control-feedback')\n                                    .attr('data-bv-icon-for', field)\n                                    // Place it after the label containing the checkbox/radio\n                                    // so when clicking the icon, it doesn't effect to the checkbox/radio element\n                                    .insertAfter(('checkbox' === type || 'radio' === type) ? $field.parent() : $field);\n\n                    // The feedback icon does not render correctly if there is no label\n                    // https://github.com/twbs/bootstrap/issues/12873\n                    if ($parent.find('label').length === 0) {\n                        $icon.css('top', 0);\n                    }\n                    // Fix feedback icons in input-group\n                    if ($parent.find('.input-group').length !== 0) {\n                        $icon.css({\n                            'top': 0,\n                            'z-index': 100\n                        }).insertAfter($parent.find('.input-group').eq(0));\n                    }\n                }\n            }\n\n            // Prepare the events\n            if (this.options.fields[field].onSuccess) {\n                fields.on('success.field.bv', function(e, data) {\n                    $.fn.bootstrapValidator.helpers.call(that.options.fields[field].onSuccess, [e, data]);\n                });\n            }\n            if (this.options.fields[field].onError) {\n                fields.on('error.field.bv', function(e, data) {\n                    $.fn.bootstrapValidator.helpers.call(that.options.fields[field].onError, [e, data]);\n                });\n            }\n            if (this.options.fields[field].onStatus) {\n                fields.on('status.field.bv', function(e, data) {\n                    $.fn.bootstrapValidator.helpers.call(that.options.fields[field].onStatus, [e, data]);\n                });\n            }\n\n            // Set live mode\n            events = $.map(trigger, function(item) {\n                return item + '.live.bv';\n            }).join(' ');\n            switch (this.options.live) {\n                case 'submitted':\n                    break;\n                case 'disabled':\n                    fields.off(events);\n                    break;\n                case 'enabled':\n                /* falls through */\n                default:\n                    fields.off(events).on(events, function() {\n                        if (that._exceedThreshold($(this))) {\n                            that.validateField($(this));\n                        }\n                    });\n                    break;\n            }\n\n            fields.trigger($.Event('init.field.bv'), {\n                bv: this,\n                field: field,\n                element: fields\n            });\n        },\n\n        /**\n         * Get the error message for given field and validator\n         *\n         * @param {String} field The field name\n         * @param {String} validatorName The validator name\n         * @returns {String}\n         */\n        _getMessage: function(field, validatorName) {\n            if (!this.options.fields[field] || !$.fn.bootstrapValidator.validators[validatorName]\n                || !this.options.fields[field].validators || !this.options.fields[field].validators[validatorName])\n            {\n                return '';\n            }\n\n            var options = this.options.fields[field].validators[validatorName];\n            switch (true) {\n                case (!!options.message):\n                    return options.message;\n                case (!!this.options.fields[field].message):\n                    return this.options.fields[field].message;\n                case (!!$.fn.bootstrapValidator.i18n[validatorName]):\n                    return $.fn.bootstrapValidator.i18n[validatorName]['default'];\n                default:\n                    return this.options.message;\n            }\n        },\n\n        /**\n         * Get the element to place the error messages\n         *\n         * @param {jQuery} $field The field element\n         * @param {String} group\n         * @returns {jQuery}\n         */\n        _getMessageContainer: function($field, group) {\n            var $parent = $field.parent();\n            if ($parent.is(group)) {\n                return $parent;\n            }\n\n            var cssClasses = $parent.attr('class');\n            if (!cssClasses) {\n                return this._getMessageContainer($parent, group);\n            }\n\n            cssClasses = cssClasses.split(' ');\n            var n = cssClasses.length;\n            for (var i = 0; i < n; i++) {\n                if (/^col-(xs|sm|md|lg)-\\d+$/.test(cssClasses[i]) || /^col-(xs|sm|md|lg)-offset-\\d+$/.test(cssClasses[i])) {\n                    return $parent;\n                }\n            }\n\n            return this._getMessageContainer($parent, group);\n        },\n\n        /**\n         * Called when all validations are completed\n         */\n        _submit: function() {\n            var isValid   = this.isValid(),\n                eventType = isValid ? 'success.form.bv' : 'error.form.bv',\n                e         = $.Event(eventType);\n\n            this.$form.trigger(e);\n\n            // Call default handler\n            // Check if whether the submit button is clicked\n            if (this.$submitButton) {\n                isValid ? this._onSuccess(e) : this._onError(e);\n            }\n        },\n\n        /**\n         * Check if the field is excluded.\n         * Returning true means that the field will not be validated\n         *\n         * @param {jQuery} $field The field element\n         * @returns {Boolean}\n         */\n        _isExcluded: function($field) {\n            var excludedAttr = $field.attr('data-bv-excluded'),\n                // I still need to check the 'name' attribute while initializing the field\n                field        = $field.attr('data-bv-field') || $field.attr('name');\n\n            switch (true) {\n                case (!!field && this.options.fields && this.options.fields[field] && (this.options.fields[field].excluded === 'true' || this.options.fields[field].excluded === true)):\n                case (excludedAttr === 'true'):\n                case (excludedAttr === ''):\n                    return true;\n\n                case (!!field && this.options.fields && this.options.fields[field] && (this.options.fields[field].excluded === 'false' || this.options.fields[field].excluded === false)):\n                case (excludedAttr === 'false'):\n                    return false;\n\n                default:\n                    if (this.options.excluded) {\n                        // Convert to array first\n                        if ('string' === typeof this.options.excluded) {\n                            this.options.excluded = $.map(this.options.excluded.split(','), function(item) {\n                                // Trim the spaces\n                                return $.trim(item);\n                            });\n                        }\n\n                        var length = this.options.excluded.length;\n                        for (var i = 0; i < length; i++) {\n                            if (('string' === typeof this.options.excluded[i] && $field.is(this.options.excluded[i]))\n                                || ('function' === typeof this.options.excluded[i] && this.options.excluded[i].call(this, $field, this) === true))\n                            {\n                                return true;\n                            }\n                        }\n                    }\n                    return false;\n            }\n        },\n\n        /**\n         * Check if the number of characters of field value exceed the threshold or not\n         *\n         * @param {jQuery} $field The field element\n         * @returns {Boolean}\n         */\n        _exceedThreshold: function($field) {\n            var field     = $field.attr('data-bv-field'),\n                threshold = this.options.fields[field].threshold || this.options.threshold;\n            if (!threshold) {\n                return true;\n            }\n            var cannotType = $.inArray($field.attr('type'), ['button', 'checkbox', 'file', 'hidden', 'image', 'radio', 'reset', 'submit']) !== -1;\n            return (cannotType || $field.val().length >= threshold);\n        },\n        \n        // ---\n        // Events\n        // ---\n\n        /**\n         * The default handler of error.form.bv event.\n         * It will be called when there is a invalid field\n         *\n         * @param {jQuery.Event} e The jQuery event object\n         */\n        _onError: function(e) {\n            if (e.isDefaultPrevented()) {\n                return;\n            }\n\n            if ('submitted' === this.options.live) {\n                // Enable live mode\n                this.options.live = 'enabled';\n                var that = this;\n                for (var field in this.options.fields) {\n                    (function(f) {\n                        var fields  = that.getFieldElements(f);\n                        if (fields.length) {\n                            var type    = $(fields[0]).attr('type'),\n                                event   = ('radio' === type || 'checkbox' === type || 'file' === type || 'SELECT' === $(fields[0]).get(0).tagName) ? 'change' : that._changeEvent,\n                                trigger = that.options.fields[field].trigger || that.options.trigger || event,\n                                events  = $.map(trigger.split(' '), function(item) {\n                                    return item + '.live.bv';\n                                }).join(' ');\n\n                            fields.off(events).on(events, function() {\n                                if (that._exceedThreshold($(this))) {\n                                    that.validateField($(this));\n                                }\n                            });\n                        }\n                    })(field);\n                }\n            }\n\n            var $invalidField = this.$invalidFields.eq(0);\n            if ($invalidField) {\n                // Activate the tab containing the invalid field if exists\n                var $tabPane = $invalidField.parents('.tab-pane'), tabId;\n                if ($tabPane && (tabId = $tabPane.attr('id'))) {\n                    $('a[href=\"#' + tabId + '\"][data-toggle=\"tab\"]').tab('show');\n                }\n\n                // Focus to the first invalid field\n                $invalidField.focus();\n            }\n        },\n\n        /**\n         * The default handler of success.form.bv event.\n         * It will be called when all the fields are valid\n         *\n         * @param {jQuery.Event} e The jQuery event object\n         */\n        _onSuccess: function(e) {\n            if (e.isDefaultPrevented()) {\n                return;\n            }\n\n            // Submit the form\n            this.disableSubmitButtons(true).defaultSubmit();\n        },\n\n        /**\n         * Called after validating a field element\n         *\n         * @param {jQuery} $field The field element\n         * @param {String} [validatorName] The validator name\n         */\n        _onFieldValidated: function($field, validatorName) {\n            var field         = $field.attr('data-bv-field'),\n                validators    = this.options.fields[field].validators,\n                counter       = {},\n                numValidators = 0,\n                data          = {\n                    bv: this,\n                    field: field,\n                    element: $field,\n                    validator: validatorName\n                };\n\n            // Trigger an event after given validator completes\n            if (validatorName) {\n                switch ($field.data('bv.result.' + validatorName)) {\n                    case this.STATUS_INVALID:\n                        $field.trigger($.Event('error.validator.bv'), data);\n                        break;\n                    case this.STATUS_VALID:\n                        $field.trigger($.Event('success.validator.bv'), data);\n                        break;\n                    default:\n                        break;\n                }\n            }\n\n            counter[this.STATUS_NOT_VALIDATED] = 0;\n            counter[this.STATUS_VALIDATING]    = 0;\n            counter[this.STATUS_INVALID]       = 0;\n            counter[this.STATUS_VALID]         = 0;\n\n            for (var v in validators) {\n                if (validators[v].enabled === false) {\n                    continue;\n                }\n\n                numValidators++;\n                var result = $field.data('bv.result.' + v);\n                if (result) {\n                    counter[result]++;\n                }\n            }\n\n            if (counter[this.STATUS_VALID] === numValidators) {\n                // Remove from the list of invalid fields\n                this.$invalidFields = this.$invalidFields.not($field);\n\n                $field.trigger($.Event('success.field.bv'), data);\n            }\n            // If all validators are completed and there is at least one validator which doesn't pass\n            else if (counter[this.STATUS_NOT_VALIDATED] === 0 && counter[this.STATUS_VALIDATING] === 0 && counter[this.STATUS_INVALID] > 0) {\n                // Add to the list of invalid fields\n                this.$invalidFields = this.$invalidFields.add($field);\n\n                $field.trigger($.Event('error.field.bv'), data);\n            }\n        },\n\n        // ---\n        // Public methods\n        // ---\n\n        /**\n         * Retrieve the field elements by given name\n         *\n         * @param {String} field The field name\n         * @returns {null|jQuery[]}\n         */\n        getFieldElements: function(field) {\n            if (!this._cacheFields[field]) {\n                this._cacheFields[field] = (this.options.fields[field] && this.options.fields[field].selector)\n                                         ? $(this.options.fields[field].selector)\n                                         : this.$form.find('[name=\"' + field + '\"]');\n            }\n\n            return this._cacheFields[field];\n        },\n\n        /**\n         * Disable/enable submit buttons\n         *\n         * @param {Boolean} disabled Can be true or false\n         * @returns {BootstrapValidator}\n         */\n        disableSubmitButtons: function(disabled) {\n            if (!disabled) {\n                this.$form.find(this.options.submitButtons).removeAttr('disabled');\n            } else if (this.options.live !== 'disabled') {\n                // Don't disable if the live validating mode is disabled\n                this.$form.find(this.options.submitButtons).attr('disabled', 'disabled');\n            }\n\n            return this;\n        },\n\n        /**\n         * Validate the form\n         *\n         * @returns {BootstrapValidator}\n         */\n        validate: function() {\n            if (!this.options.fields) {\n                return this;\n            }\n            this.disableSubmitButtons(true);\n\n            for (var field in this.options.fields) {\n                this.validateField(field);\n            }\n\n            this._submit();\n\n            return this;\n        },\n\n        /**\n         * Validate given field\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @returns {BootstrapValidator}\n         */\n        validateField: function(field) {\n            var fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    fields = field;\n                    field  = field.attr('data-bv-field');\n                    break;\n                case 'string':\n                    fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n\n            if (this.options.fields[field] && this.options.fields[field].enabled === false) {\n                return this;\n            }\n\n            var that       = this,\n                type       = fields.attr('type'),\n                total      = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,\n                updateAll  = ('radio' === type || 'checkbox' === type),\n                validators = this.options.fields[field].validators,\n                validatorName,\n                validateResult;\n\n            for (var i = 0; i < total; i++) {\n                var $field = fields.eq(i);\n                if (this._isExcluded($field)) {\n                    continue;\n                }\n\n                for (validatorName in validators) {\n                    if ($field.data('bv.dfs.' + validatorName)) {\n                        $field.data('bv.dfs.' + validatorName).reject();\n                    }\n\n                    // Don't validate field if it is already done\n                    var result = $field.data('bv.result.' + validatorName);\n                    if (result === this.STATUS_VALID || result === this.STATUS_INVALID || validators[validatorName].enabled === false) {\n                        this._onFieldValidated($field, validatorName);\n                        continue;\n                    }\n\n                    $field.data('bv.result.' + validatorName, this.STATUS_VALIDATING);\n                    validateResult = $.fn.bootstrapValidator.validators[validatorName].validate(this, $field, validators[validatorName]);\n\n                    // validateResult can be a $.Deferred object ...\n                    if ('object' === typeof validateResult && validateResult.resolve) {\n                        this.updateStatus(updateAll ? field : $field, this.STATUS_VALIDATING, validatorName);\n                        $field.data('bv.dfs.' + validatorName, validateResult);\n\n                        validateResult.done(function($f, v, isValid, message) {\n                            // v is validator name\n                            $f.removeData('bv.dfs.' + v);\n                            if (message) {\n                                that.updateMessage($f, v, message);\n                            }\n\n                            that.updateStatus(updateAll ? $f.attr('data-bv-field') : $f, isValid ? that.STATUS_VALID : that.STATUS_INVALID, v);\n\n                            if (isValid && that._submitIfValid === true) {\n                                // If a remote validator returns true and the form is ready to submit, then do it\n                                that._submit();\n                            }\n                        });\n                    }\n                    // ... or object { valid: true/false, message: 'dynamic message' }\n                    else if ('object' === typeof validateResult && validateResult.valid !== undefined && validateResult.message !== undefined) {\n                        this.updateMessage(updateAll ? field : $field, validatorName, validateResult.message);\n                        this.updateStatus(updateAll ? field : $field, validateResult.valid ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);\n                    }\n                    // ... or a boolean value\n                    else if ('boolean' === typeof validateResult) {\n                        this.updateStatus(updateAll ? field : $field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);\n                    }\n                }\n            }\n\n            return this;\n        },\n\n        /**\n         * Update the error message\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @param {String} validator The validator name\n         * @param {String} message The message\n         * @returns {BootstrapValidator}\n         */\n        updateMessage: function(field, validator, message) {\n            var $fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    $fields = field;\n                    field   = field.attr('data-bv-field');\n                    break;\n                case 'string':\n                    $fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n\n            $fields.each(function() {\n                $(this).data('bv.messages').find('.help-block[data-bv-validator=\"' + validator + '\"][data-bv-for=\"' + field + '\"]').html(message);\n            });\n        },\n        \n        /**\n         * Update all validating results of field\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @param {String} status The status. Can be 'NOT_VALIDATED', 'VALIDATING', 'INVALID' or 'VALID'\n         * @param {String} [validatorName] The validator name. If null, the method updates validity result for all validators\n         * @returns {BootstrapValidator}\n         */\n        updateStatus: function(field, status, validatorName) {\n            var fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    fields = field;\n                    field  = field.attr('data-bv-field');\n                    break;\n                case 'string':\n                    fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n\n            if (status === this.STATUS_NOT_VALIDATED) {\n                // Reset the flag\n                this._submitIfValid = false;\n            }\n\n            var that  = this,\n                type  = fields.attr('type'),\n                group = this.options.fields[field].group || this.options.group,\n                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;\n\n            for (var i = 0; i < total; i++) {\n                var $field       = fields.eq(i);\n                if (this._isExcluded($field)) {\n                    continue;\n                }\n\n                var $parent      = $field.parents(group),\n                    $message     = $field.data('bv.messages'),\n                    $allErrors   = $message.find('.help-block[data-bv-validator][data-bv-for=\"' + field + '\"]'),\n                    $errors      = validatorName ? $allErrors.filter('[data-bv-validator=\"' + validatorName + '\"]') : $allErrors,\n                    $icon        = $parent.find('.form-control-feedback[data-bv-icon-for=\"' + field + '\"]'),\n                    container    = this.options.fields[field].container || this.options.container,\n                    isValidField = null;\n\n                // Update status\n                if (validatorName) {\n                    $field.data('bv.result.' + validatorName, status);\n                } else {\n                    for (var v in this.options.fields[field].validators) {\n                        $field.data('bv.result.' + v, status);\n                    }\n                }\n\n                // Show/hide error elements and feedback icons\n                $errors.attr('data-bv-result', status);\n\n                // Determine the tab containing the element\n                var $tabPane = $field.parents('.tab-pane'),\n                    tabId, $tab;\n                if ($tabPane && (tabId = $tabPane.attr('id'))) {\n                    $tab = $('a[href=\"#' + tabId + '\"][data-toggle=\"tab\"]').parent();\n                }\n\n                switch (status) {\n                    case this.STATUS_VALIDATING:\n                        isValidField = null;\n                        this.disableSubmitButtons(true);\n                        $parent.removeClass('has-success').removeClass('has-error');\n                        if ($icon) {\n                            $icon.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).addClass(this.options.feedbackIcons.validating).show();\n                        }\n                        if ($tab) {\n                            $tab.removeClass('bv-tab-success').removeClass('bv-tab-error');\n                        }\n                        break;\n\n                    case this.STATUS_INVALID:\n                        isValidField = false;\n                        this.disableSubmitButtons(true);\n                        $parent.removeClass('has-success').addClass('has-error');\n                        if ($icon) {\n                            $icon.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.validating).addClass(this.options.feedbackIcons.invalid).show();\n                        }\n                        if ($tab) {\n                            $tab.removeClass('bv-tab-success').addClass('bv-tab-error');\n                        }\n                        break;\n\n                    case this.STATUS_VALID:\n                        // If the field is valid (passes all validators)\n                        isValidField = ($allErrors.filter('[data-bv-result=\"' + this.STATUS_NOT_VALIDATED +'\"]').length === 0)\n                                     ? ($allErrors.filter('[data-bv-result=\"' + this.STATUS_VALID +'\"]').length === $allErrors.length)  // All validators are completed\n                                     : null;                                                                                            // There are some validators that have not done\n                        if (isValidField !== null) {\n                            this.disableSubmitButtons(this.$submitButton ? !this.isValid() : !isValidField);\n                            if ($icon) {\n                                $icon\n                                    .removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).removeClass(this.options.feedbackIcons.valid)\n                                    .addClass(isValidField ? this.options.feedbackIcons.valid : this.options.feedbackIcons.invalid)\n                                    .show();\n                            }\n                        }\n\n                        $parent.removeClass('has-error has-success').addClass(this.isValidContainer($parent) ? 'has-success' : 'has-error');\n                        if ($tab) {\n                            $tab.removeClass('bv-tab-success').removeClass('bv-tab-error').addClass(this.isValidContainer($tabPane) ? 'bv-tab-success' : 'bv-tab-error');\n                        }\n                        break;\n\n                    case this.STATUS_NOT_VALIDATED:\n                    /* falls through */\n                    default:\n                        isValidField = null;\n                        this.disableSubmitButtons(false);\n                        $parent.removeClass('has-success').removeClass('has-error');\n                        if ($icon) {\n                            $icon.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).hide();\n                        }\n                        if ($tab) {\n                            $tab.removeClass('bv-tab-success').removeClass('bv-tab-error');\n                        }\n                        break;\n                }\n\n                switch (true) {\n                    // Only show the first error message if it is placed inside a tooltip ...\n                    case ($icon && 'tooltip' === container):\n                        (isValidField === false)\n                                ? $icon.css('cursor', 'pointer').tooltip('destroy').tooltip({\n                                    html: true,\n                                    placement: 'top',\n                                    title: $allErrors.filter('[data-bv-result=\"' + that.STATUS_INVALID + '\"]').eq(0).html()\n                                })\n                                : $icon.css('cursor', '').tooltip('destroy');\n                        break;\n                    // ... or popover\n                    case ($icon && 'popover' === container):\n                        (isValidField === false)\n                                ? $icon.css('cursor', 'pointer').popover('destroy').popover({\n                                    content: $allErrors.filter('[data-bv-result=\"' + that.STATUS_INVALID + '\"]').eq(0).html(),\n                                    html: true,\n                                    placement: 'top',\n                                    trigger: 'hover click'\n                                })\n                                : $icon.css('cursor', '').popover('destroy');\n                        break;\n                    default:\n                        (status === this.STATUS_INVALID) ? $errors.show() : $errors.hide();\n                        break;\n                }\n\n                // Trigger an event\n                $field.trigger($.Event('status.field.bv'), {\n                    bv: this,\n                    field: field,\n                    element: $field,\n                    status: status\n                });\n                this._onFieldValidated($field, validatorName);\n            }\n\n            return this;\n        },\n\n        /**\n         * Check the form validity\n         *\n         * @returns {Boolean}\n         */\n        isValid: function() {\n            for (var field in this.options.fields) {\n                if (!this.isValidField(field)) {\n                    return false;\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Check if the field is valid or not\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @returns {Boolean}\n         */\n        isValidField: function(field) {\n            var fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    fields = field;\n                    field  = field.attr('data-bv-field');\n                    break;\n                case 'string':\n                    fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n            if (fields.length === 0 || this.options.fields[field] === null || this.options.fields[field].enabled === false) {\n                return true;\n            }\n\n            var type  = fields.attr('type'),\n                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,\n                $field, validatorName, status;\n            for (var i = 0; i < total; i++) {\n                $field = fields.eq(i);\n                if (this._isExcluded($field)) {\n                    continue;\n                }\n\n                for (validatorName in this.options.fields[field].validators) {\n                    if (this.options.fields[field].validators[validatorName].enabled === false) {\n                        continue;\n                    }\n\n                    status = $field.data('bv.result.' + validatorName);\n                    if (status !== this.STATUS_VALID) {\n                        return false;\n                    }\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Check if all fields inside a given container are valid.\n         * It's useful when working with a wizard-like such as tab, collapse\n         *\n         * @param {String|jQuery} container The container selector or element\n         * @returns {Boolean}\n         */\n        isValidContainer: function(container) {\n            var that       = this,\n                map        = {},\n                $container = ('string' === typeof container) ? $(container) : container;\n            if ($container.length === 0) {\n                return true;\n            }\n\n            $container.find('[data-bv-field]').each(function() {\n                var $field = $(this),\n                    field  = $field.attr('data-bv-field');\n                if (!that._isExcluded($field) && !map[field]) {\n                    map[field] = $field;\n                }\n            });\n\n            for (var field in map) {\n                var $f = map[field];\n                if ($f.data('bv.messages')\n                      .find('.help-block[data-bv-validator][data-bv-for=\"' + field + '\"]')\n                      .filter(function() {\n                          var v = $(this).attr('data-bv-validator'),\n                              f = $(this).attr('data-bv-for');\n                          return (that.options.fields[f].validators[v].enabled !== false\n                                && $f.data('bv.result.' + v) && $f.data('bv.result.' + v) !== that.STATUS_VALID);\n                      })\n                      .length !== 0)\n                {\n                    // The field is not valid\n                    return false;\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Submit the form using default submission.\n         * It also does not perform any validations when submitting the form\n         */\n        defaultSubmit: function() {\n            if (this.$submitButton) {\n                // Create hidden input to send the submit buttons\n                $('<input/>')\n                    .attr('type', 'hidden')\n                    .attr('data-bv-submit-hidden', '')\n                    .attr('name', this.$submitButton.attr('name'))\n                    .val(this.$submitButton.val())\n                    .appendTo(this.$form);\n            }\n\n            // Submit form\n            this.$form.off('submit.bv').submit();\n        },\n\n        // ---\n        // Useful APIs which aren't used internally\n        // ---\n\n        /**\n         * Get the list of invalid fields\n         *\n         * @returns {jQuery[]}\n         */\n        getInvalidFields: function() {\n            return this.$invalidFields;\n        },\n\n        /**\n         * Returns the clicked submit button\n         *\n         * @returns {jQuery}\n         */\n        getSubmitButton: function() {\n            return this.$submitButton;\n        },\n\n        /**\n         * Get the error messages\n         *\n         * @param {String|jQuery} [field] The field name or field element\n         * If the field is not defined, the method returns all error messages of all fields\n         * @param {String} [validator] The name of validator\n         * If the validator is not defined, the method returns error messages of all validators\n         * @returns {String[]}\n         */\n        getMessages: function(field, validator) {\n            var that     = this,\n                messages = [],\n                $fields  = $([]);\n\n            switch (true) {\n                case (field && 'object' === typeof field):\n                    $fields = field;\n                    break;\n                case (field && 'string' === typeof field):\n                    var f = this.getFieldElements(field);\n                    if (f.length > 0) {\n                        var type = f.attr('type');\n                        $fields = ('radio' === type || 'checkbox' === type) ? f.eq(0) : f;\n                    }\n                    break;\n                default:\n                    $fields = this.$invalidFields;\n                    break;\n            }\n\n            var filter = validator ? '[data-bv-validator=\"' + validator + '\"]' : '';\n            $fields.each(function() {\n                messages = messages.concat(\n                    $(this)\n                        .data('bv.messages')\n                        .find('.help-block[data-bv-for=\"' + $(this).attr('data-bv-field') + '\"][data-bv-result=\"' + that.STATUS_INVALID + '\"]' + filter)\n                        .map(function() {\n                            var v = $(this).attr('data-bv-validator'),\n                                f = $(this).attr('data-bv-for');\n                            return (that.options.fields[f].validators[v].enabled === false) ? '' : $(this).html();\n                        })\n                        .get()\n                );\n            });\n\n            return messages;\n        },\n\n        /**\n         * Get the field options\n         *\n         * @param {String|jQuery} [field] The field name or field element. If it is not set, the method returns the form options\n         * @param {String} [validator] The name of validator. It null, the method returns form options\n         * @param {String} [option] The option name\n         * @return {String|Object}\n         */\n        getOptions: function(field, validator, option) {\n            if (!field) {\n                return this.options;\n            }\n            if ('object' === typeof field) {\n                field = field.attr('data-bv-field');\n            }\n            if (!this.options.fields[field]) {\n                return null;\n            }\n\n            var options = this.options.fields[field];\n            if (!validator) {\n                return options;\n            }\n            if (!options.validators || !options.validators[validator]) {\n                return null;\n            }\n\n            return option ? options.validators[validator][option] : options.validators[validator];\n        },\n\n        /**\n         * Update the option of a specific validator\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @param {String} validator The validator name\n         * @param {String} option The option name\n         * @param {String} value The value to set\n         * @returns {BootstrapValidator}\n         */\n        updateOption: function(field, validator, option, value) {\n            if ('object' === typeof field) {\n                field = field.attr('data-bv-field');\n            }\n            if (this.options.fields[field] && this.options.fields[field].validators[validator]) {\n                this.options.fields[field].validators[validator][option] = value;\n                this.updateStatus(field, this.STATUS_NOT_VALIDATED, validator);\n            }\n\n            return this;\n        },\n\n        /**\n         * Add a new field\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @param {Object} [options] The validator rules\n         * @returns {BootstrapValidator}\n         */\n        addField: function(field, options) {\n            var fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    fields = field;\n                    field  = field.attr('data-bv-field') || field.attr('name');\n                    break;\n                case 'string':\n                    delete this._cacheFields[field];\n                    fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n\n            fields.attr('data-bv-field', field);\n\n            var type  = fields.attr('type'),\n                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;\n\n            for (var i = 0; i < total; i++) {\n                var $field = fields.eq(i);\n\n                // Try to parse the options from HTML attributes\n                var opts = this._parseOptions($field);\n                opts = (opts === null) ? options : $.extend(true, options, opts);\n\n                this.options.fields[field] = $.extend(true, this.options.fields[field], opts);\n\n                // Update the cache\n                this._cacheFields[field] = this._cacheFields[field] ? this._cacheFields[field].add($field) : $field;\n\n                // Init the element\n                this._initField(('checkbox' === type || 'radio' === type) ? field : $field);\n            }\n\n            this.disableSubmitButtons(false);\n            // Trigger an event\n            this.$form.trigger($.Event('added.field.bv'), {\n                field: field,\n                element: fields,\n                options: this.options.fields[field]\n            });\n\n            return this;\n        },\n\n        /**\n         * Remove a given field\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @returns {BootstrapValidator}\n         */\n        removeField: function(field) {\n            var fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    fields = field;\n                    field  = field.attr('data-bv-field') || field.attr('name');\n                    fields.attr('data-bv-field', field);\n                    break;\n                case 'string':\n                    fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n\n            if (fields.length === 0) {\n                return this;\n            }\n\n            var type  = fields.attr('type'),\n                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;\n\n            for (var i = 0; i < total; i++) {\n                var $field = fields.eq(i);\n\n                // Remove from the list of invalid fields\n                this.$invalidFields = this.$invalidFields.not($field);\n\n                // Update the cache\n                this._cacheFields[field] = this._cacheFields[field].not($field);\n            }\n\n            if (!this._cacheFields[field] || this._cacheFields[field].length === 0) {\n                delete this.options.fields[field];\n            }\n            if ('checkbox' === type || 'radio' === type) {\n                this._initField(field);\n            }\n\n            this.disableSubmitButtons(false);\n            // Trigger an event\n            this.$form.trigger($.Event('removed.field.bv'), {\n                field: field,\n                element: fields\n            });\n\n            return this;\n        },\n\n        /**\n         * Reset given field\n         *\n         * @param {String|jQuery} field The field name or field element\n         * @param {Boolean} [resetValue] If true, the method resets field value to empty or remove checked/selected attribute (for radio/checkbox)\n         * @returns {BootstrapValidator}\n         */\n        resetField: function(field, resetValue) {\n            var $fields = $([]);\n            switch (typeof field) {\n                case 'object':\n                    $fields = field;\n                    field   = field.attr('data-bv-field');\n                    break;\n                case 'string':\n                    $fields = this.getFieldElements(field);\n                    break;\n                default:\n                    break;\n            }\n\n            var total = $fields.length;\n            if (this.options.fields[field]) {\n                for (var i = 0; i < total; i++) {\n                    for (var validator in this.options.fields[field].validators) {\n                        $fields.eq(i).removeData('bv.dfs.' + validator);\n                    }\n                }\n            }\n\n            // Mark field as not validated yet\n            this.updateStatus(field, this.STATUS_NOT_VALIDATED);\n\n            if (resetValue) {\n                var type = $fields.attr('type');\n                ('radio' === type || 'checkbox' === type) ? $fields.removeAttr('checked').removeAttr('selected') : $fields.val('');\n            }\n\n            return this;\n        },\n\n        /**\n         * Reset the form\n         *\n         * @param {Boolean} [resetValue] If true, the method resets field value to empty or remove checked/selected attribute (for radio/checkbox)\n         * @returns {BootstrapValidator}\n         */\n        resetForm: function(resetValue) {\n            for (var field in this.options.fields) {\n                this.resetField(field, resetValue);\n            }\n\n            this.$invalidFields = $([]);\n            this.$submitButton  = null;\n\n            // Enable submit buttons\n            this.disableSubmitButtons(false);\n\n            return this;\n        },\n\n        /**\n         * Revalidate given field\n         * It's used when you need to revalidate the field which its value is updated by other plugin\n         *\n         * @param {String|jQuery} field The field name of field element\n         * @returns {BootstrapValidator}\n         */\n        revalidateField: function(field) {\n            this.updateStatus(field, this.STATUS_NOT_VALIDATED)\n                .validateField(field);\n\n            return this;\n        },\n\n        /**\n         * Enable/Disable all validators to given field\n         *\n         * @param {String} field The field name\n         * @param {Boolean} enabled Enable/Disable field validators\n         * @param {String} [validatorName] The validator name. If null, all validators will be enabled/disabled\n         * @returns {BootstrapValidator}\n         */\n        enableFieldValidators: function(field, enabled, validatorName) {\n            var validators = this.options.fields[field].validators;\n\n            // Enable/disable particular validator\n            if (validatorName\n                && validators\n                && validators[validatorName] && validators[validatorName].enabled !== enabled)\n            {\n                this.options.fields[field].validators[validatorName].enabled = enabled;\n                this.updateStatus(field, this.STATUS_NOT_VALIDATED, validatorName);\n            }\n            // Enable/disable all validators\n            else if (!validatorName && this.options.fields[field].enabled !== enabled) {\n                this.options.fields[field].enabled = enabled;\n                for (var v in validators) {\n                    this.enableFieldValidators(field, enabled, v);\n                }\n            }\n\n            return this;\n        },\n\n        /**\n         * Some validators have option which its value is dynamic.\n         * For example, the zipCode validator has the country option which might be changed dynamically by a select element.\n         *\n         * @param {jQuery|String} field The field name or element\n         * @param {String|Function} option The option which can be determined by:\n         * - a string\n         * - name of field which defines the value\n         * - name of function which returns the value\n         * - a function returns the value\n         *\n         * The callback function has the format of\n         *      callback: function(value, validator, $field) {\n         *          // value is the value of field\n         *          // validator is the BootstrapValidator instance\n         *          // $field is the field element\n         *      }\n         *\n         * @returns {String}\n         */\n        getDynamicOption: function(field, option) {\n            var $field = ('string' === typeof field) ? this.getFieldElements(field) : field,\n                value  = $field.val();\n\n            // Option can be determined by\n            // ... a function\n            if ('function' === typeof option) {\n                return $.fn.bootstrapValidator.helpers.call(option, [value, this, $field]);\n            }\n            // ... value of other field\n            else if ('string' === typeof option) {\n                var $f = this.getFieldElements(option);\n                if ($f.length) {\n                    return $f.val();\n                }\n                // ... return value of callback\n                else {\n                    return $.fn.bootstrapValidator.helpers.call(option, [value, this, $field]);\n                }\n            }\n\n            return null;\n        },\n\n        /**\n         * Destroy the plugin\n         * It will remove all error messages, feedback icons and turn off the events\n         */\n        destroy: function() {\n            var field, fields, $field, validator, $icon, container, group;\n            for (field in this.options.fields) {\n                fields    = this.getFieldElements(field);\n                container = this.options.fields[field].container || this.options.container,\n                group     = this.options.fields[field].group || this.options.group;\n                for (var i = 0; i < fields.length; i++) {\n                    $field = fields.eq(i);\n                    $field\n                        // Remove all error messages\n                        .data('bv.messages')\n                            .find('.help-block[data-bv-validator][data-bv-for=\"' + field + '\"]').remove().end()\n                            .end()\n                        .removeData('bv.messages')\n                        // Remove feedback classes\n                        .parents(group)\n                            .removeClass('has-feedback has-error has-success')\n                            .end()\n                        // Turn off events\n                        .off('.bv')\n                        .removeAttr('data-bv-field');\n\n                    // Remove feedback icons, tooltip/popover container\n                    $icon = $field.parents(group).find('i[data-bv-icon-for=\"' + field + '\"]');\n                    if ($icon) {\n                        switch (container) {\n                            case 'tooltip':\n                                $icon.tooltip('destroy').remove();\n                                break;\n                            case 'popover':\n                                $icon.popover('destroy').remove();\n                                break;\n                            default:\n                                $icon.remove();\n                                break;\n                        }\n                    }\n\n                    for (validator in this.options.fields[field].validators) {\n                        if ($field.data('bv.dfs.' + validator)) {\n                            $field.data('bv.dfs.' + validator).reject();\n                        }\n                        $field.removeData('bv.result.' + validator).removeData('bv.dfs.' + validator);\n                    }\n                }\n            }\n\n            // Enable submit buttons\n            this.disableSubmitButtons(false);\n\n            this.$form\n                .removeClass(this.options.elementClass)\n                .off('.bv')\n                .removeData('bootstrapValidator')\n                // Remove generated hidden elements\n                .find('[data-bv-submit-hidden]').remove();\n        }\n    };\n\n    // Plugin definition\n    $.fn.bootstrapValidator = function(option) {\n        var params = arguments;\n        return this.each(function() {\n            var $this   = $(this),\n                data    = $this.data('bootstrapValidator'),\n                options = 'object' === typeof option && option;\n            if (!data) {\n                data = new BootstrapValidator(this, options);\n                $this.data('bootstrapValidator', data);\n            }\n\n            // Allow to call plugin method\n            if ('string' === typeof option) {\n                data[option].apply(data, Array.prototype.slice.call(params, 1));\n            }\n        });\n    };\n\n    // The default options\n    $.fn.bootstrapValidator.DEFAULT_OPTIONS = {\n        // The form CSS class\n        elementClass: 'bv-form',\n\n        // Default invalid message\n        message: 'This value is not valid',\n\n        // The CSS selector for indicating the element consists the field\n        // By default, each field is placed inside the <div class=\"form-group\"></div>\n        // You should adjust this option if your form group consists of many fields which not all of them need to be validated\n        group: '.form-group',\n\n        //The error messages container. It can be:\n        // - 'tooltip' if you want to use Bootstrap tooltip to show error messages\n        // - 'popover' if you want to use Bootstrap popover to show error messages\n        // - a CSS selector indicating the container\n        // In the first two cases, since the tooltip/popover should be small enough, the plugin only shows only one error message\n        // You also can define the message container for particular field\n        container: null,\n\n        // The field will not be live validated if its length is less than this number of characters\n        threshold: null,\n\n        // Indicate fields which won't be validated\n        // By default, the plugin will not validate the following kind of fields:\n        // - disabled\n        // - hidden\n        // - invisible\n        //\n        // The setting consists of jQuery filters. Accept 3 formats:\n        // - A string. Use a comma to separate filter\n        // - An array. Each element is a filter\n        // - An array. Each element can be a callback function\n        //      function($field, validator) {\n        //          $field is jQuery object representing the field element\n        //          validator is the BootstrapValidator instance\n        //          return true or false;\n        //      }\n        //\n        // The 3 following settings are equivalent:\n        //\n        // 1) ':disabled, :hidden, :not(:visible)'\n        // 2) [':disabled', ':hidden', ':not(:visible)']\n        // 3) [':disabled', ':hidden', function($field) {\n        //        return !$field.is(':visible');\n        //    }]\n        excluded: [':disabled', ':hidden', ':not(:visible)'],\n\n        // Shows ok/error/loading icons based on the field validity.\n        // This feature requires Bootstrap v3.1.0 or later (http://getbootstrap.com/css/#forms-control-validation).\n        // Since Bootstrap doesn't provide any methods to know its version, this option cannot be on/off automatically.\n        // In other word, to use this feature you have to upgrade your Bootstrap to v3.1.0 or later.\n        //\n        // Examples:\n        // - Use Glyphicons icons:\n        //  feedbackIcons: {\n        //      valid: 'glyphicon glyphicon-ok',\n        //      invalid: 'glyphicon glyphicon-remove',\n        //      validating: 'glyphicon glyphicon-refresh'\n        //  }\n        // - Use FontAwesome icons:\n        //  feedbackIcons: {\n        //      valid: 'fa fa-check',\n        //      invalid: 'fa fa-times',\n        //      validating: 'fa fa-refresh'\n        //  }\n        feedbackIcons: {\n            valid:      null,\n            invalid:    null,\n            validating: null\n        },\n\n        // The submit buttons selector\n        // These buttons will be disabled to prevent the valid form from multiple submissions\n        submitButtons: '[type=\"submit\"]',\n\n        // Live validating option\n        // Can be one of 3 values:\n        // - enabled: The plugin validates fields as soon as they are changed\n        // - disabled: Disable the live validating. The error messages are only shown after the form is submitted\n        // - submitted: The live validating is enabled after the form is submitted\n        live: 'enabled',\n\n        // Map the field name with validator rules\n        fields: null\n    };\n\n    // Available validators\n    $.fn.bootstrapValidator.validators  = {};\n\n    // i18n\n    $.fn.bootstrapValidator.i18n        = {};\n\n    $.fn.bootstrapValidator.Constructor = BootstrapValidator;\n\n    // Helper methods, which can be used in validator class\n    $.fn.bootstrapValidator.helpers = {\n        /**\n         * Execute a callback function\n         *\n         * @param {String|Function} functionName Can be\n         * - name of global function\n         * - name of namespace function (such as A.B.C)\n         * - a function\n         * @param {Array} args The callback arguments\n         */\n        call: function(functionName, args) {\n            if ('function' === typeof functionName) {\n                return functionName.apply(this, args);\n            } else if ('string' === typeof functionName) {\n                if ('()' === functionName.substring(functionName.length - 2)) {\n                    functionName = functionName.substring(0, functionName.length - 2);\n                }\n                var ns      = functionName.split('.'),\n                    func    = ns.pop(),\n                    context = window;\n                for (var i = 0; i < ns.length; i++) {\n                    context = context[ns[i]];\n                }\n                return context[func].apply(this, args);\n            }\n        },\n\n        /**\n         * Format a string\n         * It's used to format the error message\n         * format('The field must between %s and %s', [10, 20]) = 'The field must between 10 and 20'\n         *\n         * @param {String} message\n         * @param {Array} parameters\n         * @returns {String}\n         */\n        format: function(message, parameters) {\n            if (!$.isArray(parameters)) {\n                parameters = [parameters];\n            }\n\n            for (var i in parameters) {\n                message = message.replace('%s', parameters[i]);\n            }\n\n            return message;\n        },\n\n        /**\n         * Validate a date\n         *\n         * @param {Number} year The full year in 4 digits\n         * @param {Number} month The month number\n         * @param {Number} day The day number\n         * @param {Boolean} [notInFuture] If true, the date must not be in the future\n         * @returns {Boolean}\n         */\n        date: function(year, month, day, notInFuture) {\n            if (isNaN(year) || isNaN(month) || isNaN(day)) {\n                return false;\n            }\n\n            day   = parseInt(day, 10);\n            month = parseInt(month, 10);\n            year  = parseInt(year, 10);\n\n            if (year < 1000 || year > 9999 || month <= 0 || month > 12) {\n                return false;\n            }\n            var numDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n            // Update the number of days in Feb of leap year\n            if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {\n                numDays[1] = 29;\n            }\n\n            // Check the day\n            if (day <= 0 || day > numDays[month - 1]) {\n                return false;\n            }\n\n            if (notInFuture === true) {\n                var currentDate  = new Date(),\n                    currentYear  = currentDate.getFullYear(),\n                    currentMonth = currentDate.getMonth(),\n                    currentDay   = currentDate.getDate();\n                return (year < currentYear\n                        || (year === currentYear && month - 1 < currentMonth)\n                        || (year === currentYear && month - 1 === currentMonth && day < currentDay));\n            }\n\n            return true;\n        },\n\n        /**\n         * Implement Luhn validation algorithm\n         * Credit to https://gist.github.com/ShirtlessKirk/2134376\n         *\n         * @see http://en.wikipedia.org/wiki/Luhn\n         * @param {String} value\n         * @returns {Boolean}\n         */\n        luhn: function(value) {\n            var length  = value.length,\n                mul     = 0,\n                prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]],\n                sum     = 0;\n\n            while (length--) {\n                sum += prodArr[mul][parseInt(value.charAt(length), 10)];\n                mul ^= 1;\n            }\n\n            return (sum % 10 === 0 && sum > 0);\n        },\n\n        /**\n         * Implement modulus 11, 10 (ISO 7064) algorithm\n         *\n         * @param {String} value\n         * @returns {Boolean}\n         */\n        mod11And10: function(value) {\n            var check  = 5,\n                length = value.length;\n            for (var i = 0; i < length; i++) {\n                check = (((check || 10) * 2) % 11 + parseInt(value.charAt(i), 10)) % 10;\n            }\n            return (check === 1);\n        },\n\n        /**\n         * Implements Mod 37, 36 (ISO 7064) algorithm\n         * Usages:\n         * mod37And36('A12425GABC1234002M')\n         * mod37And36('002006673085', '0123456789')\n         *\n         * @param {String} value\n         * @param {String} [alphabet]\n         * @returns {Boolean}\n         */\n        mod37And36: function(value, alphabet) {\n            alphabet = alphabet || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n            var modulus = alphabet.length,\n                length  = value.length,\n                check   = Math.floor(modulus / 2);\n            for (var i = 0; i < length; i++) {\n                check = (((check || modulus) * 2) % (modulus + 1) + alphabet.indexOf(value.charAt(i))) % modulus;\n            }\n            return (check === 1);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.base64 = $.extend($.fn.bootstrapValidator.i18n.base64 || {}, {\n        'default': 'Please enter a valid base 64 encoded'\n    });\n\n    $.fn.bootstrapValidator.validators.base64 = {\n        /**\n         * Return true if the input value is a base 64 encoded string.\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.between = $.extend($.fn.bootstrapValidator.i18n.between || {}, {\n        'default': 'Please enter a value between %s and %s',\n        notInclusive: 'Please enter a value between %s and %s strictly'\n    });\n\n    $.fn.bootstrapValidator.validators.between = {\n        html5Attributes: {\n            message: 'message',\n            min: 'min',\n            max: 'max',\n            inclusive: 'inclusive'\n        },\n\n        enableByHtml5: function($field) {\n            if ('range' === $field.attr('type')) {\n                return {\n                    min: $field.attr('min'),\n                    max: $field.attr('max')\n                };\n            }\n\n            return false;\n        },\n\n        /**\n         * Return true if the input value is between (strictly or not) two given numbers\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - min\n         * - max\n         *\n         * The min, max keys define the number which the field value compares to. min, max can be\n         *      - A number\n         *      - Name of field which its value defines the number\n         *      - Name of callback function that returns the number\n         *      - A callback function that returns the number\n         *\n         * - inclusive [optional]: Can be true or false. Default is true\n         * - message: The invalid message\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),\n                max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max);\n\n            value = parseFloat(value);\n\t\t\treturn (options.inclusive === true || options.inclusive === undefined)\n                    ? {\n                        valid: value >= min && value <= max,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between['default'], [min, max])\n                    }\n                    : {\n                        valid: value > min  && value <  max,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between.notInclusive, [min, max])\n                    };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.callback = $.extend($.fn.bootstrapValidator.i18n.callback || {}, {\n        'default': 'Please enter a valid value'\n    });\n\n    $.fn.bootstrapValidator.validators.callback = {\n        html5Attributes: {\n            message: 'message',\n            callback: 'callback'\n        },\n\n        /**\n         * Return result from the callback method\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - callback: The callback method that passes 2 parameters:\n         *      callback: function(fieldValue, validator, $field) {\n         *          // fieldValue is the value of field\n         *          // validator is instance of BootstrapValidator\n         *          // $field is the field element\n         *      }\n         * - message: The invalid message\n         * @returns {Boolean|Deferred}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n\n            if (options.callback) {\n                var dfd      = new $.Deferred(),\n                    response = $.fn.bootstrapValidator.helpers.call(options.callback, [value, validator, $field]);\n                dfd.resolve($field, 'callback', 'boolean' === typeof response ? response : response.valid, 'object' === typeof response && response.message ? response.message : null);\n                return dfd;\n            }\n\n            return true;\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.choice = $.extend($.fn.bootstrapValidator.i18n.choice || {}, {\n        'default': 'Please enter a valid value',\n        less: 'Please choose %s options at minimum',\n        more: 'Please choose %s options at maximum',\n        between: 'Please choose %s - %s options'\n    });\n\n    $.fn.bootstrapValidator.validators.choice = {\n        html5Attributes: {\n            message: 'message',\n            min: 'min',\n            max: 'max'\n        },\n\n        /**\n         * Check if the number of checked boxes are less or more than a given number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consists of following keys:\n         * - min\n         * - max\n         *\n         * At least one of two keys is required\n         * The min, max keys define the number which the field value compares to. min, max can be\n         *      - A number\n         *      - Name of field which its value defines the number\n         *      - Name of callback function that returns the number\n         *      - A callback function that returns the number\n         *\n         * - message: The invalid message\n         * @returns {Object}\n         */\n        validate: function(validator, $field, options) {\n            var numChoices = $field.is('select')\n                            ? validator.getFieldElements($field.attr('data-bv-field')).find('option').filter(':selected').length\n                            : validator.getFieldElements($field.attr('data-bv-field')).filter(':checked').length,\n                min        = options.min ? ($.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min)) : null,\n                max        = options.max ? ($.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max)) : null,\n                isValid    = true,\n                message    = options.message || $.fn.bootstrapValidator.i18n.choice['default'];\n\n            if ((min && numChoices < parseInt(min, 10)) || (max && numChoices > parseInt(max, 10))) {\n                isValid = false;\n            }\n\n            switch (true) {\n                case (!!min && !!max):\n                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.between, [parseInt(min, 10), parseInt(max, 10)]);\n                    break;\n\n                case (!!min):\n                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.less, parseInt(min, 10));\n                    break;\n\n                case (!!max):\n                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.more, parseInt(max, 10));\n                    break;\n\n                default:\n                    break;\n            }\n\n            return { valid: isValid, message: message };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.creditCard = $.extend($.fn.bootstrapValidator.i18n.creditCard || {}, {\n        'default': 'Please enter a valid credit card number'\n    });\n\n    $.fn.bootstrapValidator.validators.creditCard = {\n        /**\n         * Return true if the input value is valid credit card number\n         * Based on https://gist.github.com/DiegoSalazar/4075533\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} [options] Can consist of the following key:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // Accept only digits, dashes or spaces\n            if (/[^0-9-\\s]+/.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\D/g, '');\n\n            if (!$.fn.bootstrapValidator.helpers.luhn(value)) {\n                return false;\n            }\n\n            // Validate the card number based on prefix (IIN ranges) and length\n            var cards = {\n                AMERICAN_EXPRESS: {\n                    length: [15],\n                    prefix: ['34', '37']\n                },\n                DINERS_CLUB: {\n                    length: [14],\n                    prefix: ['300', '301', '302', '303', '304', '305', '36']\n                },\n                DINERS_CLUB_US: {\n                    length: [16],\n                    prefix: ['54', '55']\n                },\n                DISCOVER: {\n                    length: [16],\n                    prefix: ['6011', '622126', '622127', '622128', '622129', '62213',\n                             '62214', '62215', '62216', '62217', '62218', '62219',\n                             '6222', '6223', '6224', '6225', '6226', '6227', '6228',\n                             '62290', '62291', '622920', '622921', '622922', '622923',\n                             '622924', '622925', '644', '645', '646', '647', '648',\n                             '649', '65']\n                },\n                JCB: {\n                    length: [16],\n                    prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']\n                },\n                LASER: {\n                    length: [16, 17, 18, 19],\n                    prefix: ['6304', '6706', '6771', '6709']\n                },\n                MAESTRO: {\n                    length: [12, 13, 14, 15, 16, 17, 18, 19],\n                    prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']\n                },\n                MASTERCARD: {\n                    length: [16],\n                    prefix: ['51', '52', '53', '54', '55']\n                },\n                SOLO: {\n                    length: [16, 18, 19],\n                    prefix: ['6334', '6767']\n                },\n                UNIONPAY: {\n                    length: [16, 17, 18, 19],\n                    prefix: ['622126', '622127', '622128', '622129', '62213', '62214',\n                             '62215', '62216', '62217', '62218', '62219', '6222', '6223',\n                             '6224', '6225', '6226', '6227', '6228', '62290', '62291',\n                             '622920', '622921', '622922', '622923', '622924', '622925']\n                },\n                VISA: {\n                    length: [16],\n                    prefix: ['4']\n                }\n            };\n\n            var type, i;\n            for (type in cards) {\n                for (i in cards[type].prefix) {\n                    if (value.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i]     // Check the prefix\n                        && $.inArray(value.length, cards[type].length) !== -1)                      // and length\n                    {\n                        return true;\n                    }\n                }\n            }\n\n            return false;\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.cusip = $.extend($.fn.bootstrapValidator.i18n.cusip || {}, {\n        'default': 'Please enter a valid CUSIP number'\n    });\n\n    $.fn.bootstrapValidator.validators.cusip = {\n        /**\n         * Validate a CUSIP\n         * Examples:\n         * - Valid: 037833100, 931142103, 14149YAR8, 126650BG6\n         * - Invalid: 31430F200, 022615AC2\n         *\n         * @see http://en.wikipedia.org/wiki/CUSIP\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} [options] Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            value = value.toUpperCase();\n            if (!/^[0-9A-Z]{9}$/.test(value)) {\n                return false;\n            }\n\n            var converted = $.map(value.split(''), function(item) {\n                                var code = item.charCodeAt(0);\n                                return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))\n                                            // Replace A, B, C, ..., Z with 10, 11, ..., 35\n                                            ? (code - 'A'.charCodeAt(0) + 10)\n                                            : item;\n                            }),\n                length    = converted.length,\n                sum       = 0;\n            for (var i = 0; i < length - 1; i++) {\n                var num = parseInt(converted[i], 10);\n                if (i % 2 !== 0) {\n                    num *= 2;\n                }\n                if (num > 9) {\n                    num -= 9;\n                }\n                sum += num;\n            }\n\n            sum = (10 - (sum % 10)) % 10;\n            return sum === converted[length - 1];\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.cvv = $.extend($.fn.bootstrapValidator.i18n.cvv || {}, {\n        'default': 'Please enter a valid CVV number'\n    });\n\n    $.fn.bootstrapValidator.validators.cvv = {\n        html5Attributes: {\n            message: 'message',\n            ccfield: 'creditCardField'\n        },\n\n        /**\n         * Return true if the input value is a valid CVV number.\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - creditCardField: The credit card number field. It can be null\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            if (!/^[0-9]{3,4}$/.test(value)) {\n                return false;\n            }\n\n            if (!options.creditCardField) {\n                return true;\n            }\n\n            // Get the credit card number\n            var creditCard = validator.getFieldElements(options.creditCardField).val();\n            if (creditCard === '') {\n                return true;\n            }\n            \n            creditCard = creditCard.replace(/\\D/g, '');\n\n            // Supported credit card types\n            var cards = {\n                AMERICAN_EXPRESS: {\n                    length: [15],\n                    prefix: ['34', '37']\n                },\n                DINERS_CLUB: {\n                    length: [14],\n                    prefix: ['300', '301', '302', '303', '304', '305', '36']\n                },\n                DINERS_CLUB_US: {\n                    length: [16],\n                    prefix: ['54', '55']\n                },\n                DISCOVER: {\n                    length: [16],\n                    prefix: ['6011', '622126', '622127', '622128', '622129', '62213',\n                             '62214', '62215', '62216', '62217', '62218', '62219',\n                             '6222', '6223', '6224', '6225', '6226', '6227', '6228',\n                             '62290', '62291', '622920', '622921', '622922', '622923',\n                             '622924', '622925', '644', '645', '646', '647', '648',\n                             '649', '65']\n                },\n                JCB: {\n                    length: [16],\n                    prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']\n                },\n                LASER: {\n                    length: [16, 17, 18, 19],\n                    prefix: ['6304', '6706', '6771', '6709']\n                },\n                MAESTRO: {\n                    length: [12, 13, 14, 15, 16, 17, 18, 19],\n                    prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']\n                },\n                MASTERCARD: {\n                    length: [16],\n                    prefix: ['51', '52', '53', '54', '55']\n                },\n                SOLO: {\n                    length: [16, 18, 19],\n                    prefix: ['6334', '6767']\n                },\n                UNIONPAY: {\n                    length: [16, 17, 18, 19],\n                    prefix: ['622126', '622127', '622128', '622129', '62213', '62214',\n                             '62215', '62216', '62217', '62218', '62219', '6222', '6223',\n                             '6224', '6225', '6226', '6227', '6228', '62290', '62291',\n                             '622920', '622921', '622922', '622923', '622924', '622925']\n                },\n                VISA: {\n                    length: [16],\n                    prefix: ['4']\n                }\n            };\n            var type, i, creditCardType = null;\n            for (type in cards) {\n                for (i in cards[type].prefix) {\n                    if (creditCard.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i]    // Check the prefix\n                        && $.inArray(creditCard.length, cards[type].length) !== -1)                     // and length\n                    {\n                        creditCardType = type;\n                        break;\n                    }\n                }\n            }\n\n            return (creditCardType === null)\n                        ? false\n                        : (('AMERICAN_EXPRESS' === creditCardType) ? (value.length === 4) : (value.length === 3));\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.date = $.extend($.fn.bootstrapValidator.i18n.date || {}, {\n        'default': 'Please enter a valid date'\n    });\n\n    $.fn.bootstrapValidator.validators.date = {\n        html5Attributes: {\n            message: 'message',\n            format: 'format',\n            separator: 'separator'\n        },\n\n        /**\n         * Return true if the input value is valid date\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * - separator: Use to separate the date, month, and year.\n         * By default, it is /\n         * - format: The date format. Default is MM/DD/YYYY\n         * The format can be:\n         *\n         * i) date: Consist of DD, MM, YYYY parts which are separated by the separator option\n         * ii) date and time:\n         * The time can consist of h, m, s parts which are separated by :\n         * ii) date, time and A (indicating AM or PM)\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            options.format = options.format || 'MM/DD/YYYY';\n\n            var formats    = options.format.split(' '),\n                dateFormat = formats[0],\n                timeFormat = (formats.length > 1) ? formats[1] : null,\n                amOrPm     = (formats.length > 2) ? formats[2] : null,\n                sections   = value.split(' '),\n                date       = sections[0],\n                time       = (sections.length > 1) ? sections[1] : null;\n\n            if (formats.length !== sections.length) {\n                return false;\n            }\n\n            // Determine the separator\n            var separator = options.separator;\n            if (!separator) {\n                separator = (date.indexOf('/') !== -1) ? '/' : ((date.indexOf('-') !== -1) ? '-' : null);\n            }\n            if (separator === null || date.indexOf(separator) === -1) {\n                return false;\n            }\n\n            // Determine the date\n            date       = date.split(separator);\n            dateFormat = dateFormat.split(separator);\n            if (date.length !== dateFormat.length) {\n                return false;\n            }\n\n            var year  = date[$.inArray('YYYY', dateFormat)],\n                month = date[$.inArray('MM', dateFormat)],\n                day   = date[$.inArray('DD', dateFormat)];\n\n            if (!year || !month || !day) {\n                return false;\n            }\n\n            // Determine the time\n            var minutes = null, hours = null, seconds = null;\n            if (timeFormat) {\n                timeFormat = timeFormat.split(':');\n                time       = time.split(':');\n\n                if (timeFormat.length !== time.length) {\n                    return false;\n                }\n\n                hours   = time.length > 0 ? time[0] : null;\n                minutes = time.length > 1 ? time[1] : null;\n                seconds = time.length > 2 ? time[2] : null;\n\n                // Validate seconds\n                if (seconds) {\n                    seconds = parseInt(seconds, 10);\n                    if (isNaN(seconds) || seconds < 0 || seconds > 60) {\n                        return false;\n                    }\n                }\n\n                // Validate hours\n                if (hours) {\n                    hours = parseInt(hours, 10);\n                    if (isNaN(hours) || hours < 0 || hours >= 24 || (amOrPm && hours > 12)) {\n                        return false;\n                    }\n                }\n\n                // Validate minutes\n                if (minutes) {\n                    minutes = parseInt(minutes, 10);\n                    if (isNaN(minutes) || minutes < 0 || minutes > 59) {\n                        return false;\n                    }\n                }\n            }\n\n            // Validate day, month, and year\n            return $.fn.bootstrapValidator.helpers.date(year, month, day);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.different = $.extend($.fn.bootstrapValidator.i18n.different || {}, {\n        'default': 'Please enter a different value'\n    });\n\n    $.fn.bootstrapValidator.validators.different = {\n        html5Attributes: {\n            message: 'message',\n            field: 'field'\n        },\n\n        /**\n         * Return true if the input value is different with given field's value\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consists of the following key:\n         * - field: The name of field that will be used to compare with current one\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var compareWith = validator.getFieldElements(options.field);\n            if (compareWith === null) {\n                return true;\n            }\n\n            if (value !== compareWith.val()) {\n                validator.updateStatus(options.field, validator.STATUS_VALID, 'different');\n                return true;\n            } else {\n                return false;\n            }\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.digits = $.extend($.fn.bootstrapValidator.i18n.digits || {}, {\n        'default': 'Please enter only digits'\n    });\n\n    $.fn.bootstrapValidator.validators.digits = {\n        /**\n         * Return true if the input value contains digits only\n         *\n         * @param {BootstrapValidator} validator Validate plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} [options]\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            return /^\\d+$/.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.ean = $.extend($.fn.bootstrapValidator.i18n.ean || {}, {\n        'default': 'Please enter a valid EAN number'\n    });\n\n    $.fn.bootstrapValidator.validators.ean = {\n        /**\n         * Validate EAN (International Article Number)\n         * Examples:\n         * - Valid: 73513537, 9780471117094, 4006381333931\n         * - Invalid: 73513536\n         *\n         * @see http://en.wikipedia.org/wiki/European_Article_Number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            if (!/^(\\d{8}|\\d{12}|\\d{13})$/.test(value)) {\n                return false;\n            }\n\n            var length = value.length,\n                sum    = 0,\n                weight = (length === 8) ? [3, 1] : [1, 3];\n            for (var i = 0; i < length - 1; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i % 2];\n            }\n            sum = (10 - sum % 10) % 10;\n            return (sum + '' === value.charAt(length - 1));\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.emailAddress = $.extend($.fn.bootstrapValidator.i18n.emailAddress || {}, {\n        'default': 'Please enter a valid email address'\n    });\n\n    $.fn.bootstrapValidator.validators.emailAddress = {\n        enableByHtml5: function($field) {\n            return ('email' === $field.attr('type'));\n        },\n\n        /**\n         * Return true if and only if the input value is a valid email address\n         *\n         * @param {BootstrapValidator} validator Validate plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} [options]\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // Email address regular expression\n            // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript\n            var emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n            return emailRegExp.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.file = $.extend($.fn.bootstrapValidator.i18n.file || {}, {\n        'default': 'Please choose a valid file'\n    });\n\n    $.fn.bootstrapValidator.validators.file = {\n        html5Attributes: {\n            extension: 'extension',\n            maxsize: 'maxSize',\n            message: 'message',\n            type: 'type'\n        },\n\n        /**\n         * Validate upload file. Use HTML 5 API if the browser supports\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - extension: The allowed extensions, separated by a comma\n         * - maxSize: The maximum size in bytes\n         * - message: The invalid message\n         * - type: The allowed MIME type, separated by a comma\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var ext,\n                extensions = options.extension ? options.extension.toLowerCase().split(',') : null,\n                types      = options.type      ? options.type.toLowerCase().split(',')      : null,\n                html5      = (window.File && window.FileList && window.FileReader);\n\n            if (html5) {\n                // Get FileList instance\n                var files = $field.get(0).files,\n                    total = files.length;\n                for (var i = 0; i < total; i++) {\n                    // Check file size\n                    if (options.maxSize && files[i].size > parseInt(options.maxSize, 10)) {\n                        return false;\n                    }\n\n                    // Check file extension\n                    ext = files[i].name.substr(files[i].name.lastIndexOf('.') + 1);\n                    if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {\n                        return false;\n                    }\n\n                    // Check file type\n                    if (types && $.inArray(files[i].type.toLowerCase(), types) === -1) {\n                        return false;\n                    }\n                }\n            } else {\n                // Check file extension\n                ext = value.substr(value.lastIndexOf('.') + 1);\n                if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.greaterThan = $.extend($.fn.bootstrapValidator.i18n.greaterThan || {}, {\n        'default': 'Please enter a value greater than or equal to %s',\n        notInclusive: 'Please enter a value greater than %s'\n    });\n\n    $.fn.bootstrapValidator.validators.greaterThan = {\n        html5Attributes: {\n            message: 'message',\n            value: 'value',\n            inclusive: 'inclusive'\n        },\n\n        enableByHtml5: function($field) {\n            var min = $field.attr('min');\n            if (min) {\n                return {\n                    value: min\n                };\n            }\n\n            return false;\n        },\n\n        /**\n         * Return true if the input value is greater than or equals to given number\n         *\n         * @param {BootstrapValidator} validator Validate plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - value: Define the number to compare with. It can be\n         *      - A number\n         *      - Name of field which its value defines the number\n         *      - Name of callback function that returns the number\n         *      - A callback function that returns the number\n         *\n         * - inclusive [optional]: Can be true or false. Default is true\n         * - message: The invalid message\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value);\n\n            value = parseFloat(value);\n\t\t\treturn (options.inclusive === true || options.inclusive === undefined)\n                    ? {\n                        valid: value >= compareTo,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan['default'], compareTo)\n                    }\n                    : {\n                        valid: value > compareTo,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan.notInclusive, compareTo)\n                    };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.grid = $.extend($.fn.bootstrapValidator.i18n.grid || {}, {\n        'default': 'Please enter a valid GRId number'\n    });\n\n    $.fn.bootstrapValidator.validators.grid = {\n        /**\n         * Validate GRId (Global Release Identifier)\n         * Examples:\n         * - Valid: A12425GABC1234002M, A1-2425G-ABC1234002-M, A1 2425G ABC1234002 M, Grid:A1-2425G-ABC1234002-M\n         * - Invalid: A1-2425G-ABC1234002-Q\n         *\n         * @see http://en.wikipedia.org/wiki/Global_Release_Identifier\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            value = value.toUpperCase();\n            if (!/^[GRID:]*([0-9A-Z]{2})[-\\s]*([0-9A-Z]{5})[-\\s]*([0-9A-Z]{10})[-\\s]*([0-9A-Z]{1})$/g.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\s/g, '').replace(/-/g, '');\n            if ('GRID:' === value.substr(0, 5)) {\n                value = value.substr(5);\n            }\n            return $.fn.bootstrapValidator.helpers.mod37And36(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.hex = $.extend($.fn.bootstrapValidator.i18n.hex || {}, {\n        'default': 'Please enter a valid hexadecimal number'\n    });\n\n    $.fn.bootstrapValidator.validators.hex = {\n        /**\n         * Return true if and only if the input value is a valid hexadecimal number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            return /^[0-9a-fA-F]+$/.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.hexColor = $.extend($.fn.bootstrapValidator.i18n.hexColor || {}, {\n        'default': 'Please enter a valid hex color'\n    });\n\n    $.fn.bootstrapValidator.validators.hexColor = {\n        enableByHtml5: function($field) {\n            return ('color' === $field.attr('type'));\n        },\n\n        /**\n         * Return true if the input value is a valid hex color\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n            return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.iban = $.extend($.fn.bootstrapValidator.i18n.iban || {}, {\n        'default': 'Please enter a valid IBAN number',\n        countryNotSupported: 'The country code %s is not supported',\n        country: 'Please enter a valid IBAN number in %s',\n        countries: {\n            AD: 'Andorra',\n            AE: 'United Arab Emirates',\n            AL: 'Albania',\n            AO: 'Angola',\n            AT: 'Austria',\n            AZ: 'Azerbaijan',\n            BA: 'Bosnia and Herzegovina',\n            BE: 'Belgium',\n            BF: 'Burkina Faso',\n            BG: 'Bulgaria',\n            BH: 'Bahrain',\n            BI: 'Burundi',\n            BJ: 'Benin',\n            BR: 'Brazil',\n            CH: 'Switzerland',\n            CI: 'Ivory Coast',\n            CM: 'Cameroon',\n            CR: 'Costa Rica',\n            CV: 'Cape Verde',\n            CY: 'Cyprus',\n            CZ: 'Czech Republic',\n            DE: 'Germany',\n            DK: 'Denmark',\n            DO: 'Dominican Republic',\n            DZ: 'Algeria',\n            EE: 'Estonia',\n            ES: 'Spain',\n            FI: 'Finland',\n            FO: 'Faroe Islands',\n            FR: 'France',\n            GB: 'United Kingdom',\n            GE: 'Georgia',\n            GI: 'Gibraltar',\n            GL: 'Greenland',\n            GR: 'Greece',\n            GT: 'Guatemala',\n            HR: 'Croatia',\n            HU: 'Hungary',\n            IE: 'Ireland',\n            IL: 'Israel',\n            IR: 'Iran',\n            IS: 'Iceland',\n            IT: 'Italy',\n            JO: 'Jordan',\n            KW: 'Kuwait',\n            KZ: 'Kazakhstan',\n            LB: 'Lebanon',\n            LI: 'Liechtenstein',\n            LT: 'Lithuania',\n            LU: 'Luxembourg',\n            LV: 'Latvia',\n            MC: 'Monaco',\n            MD: 'Moldova',\n            ME: 'Montenegro',\n            MG: 'Madagascar',\n            MK: 'Macedonia',\n            ML: 'Mali',\n            MR: 'Mauritania',\n            MT: 'Malta',\n            MU: 'Mauritius',\n            MZ: 'Mozambique',\n            NL: 'Netherlands',\n            NO: 'Norway',\n            PK: 'Pakistan',\n            PL: 'Poland',\n            PS: 'Palestinian',\n            PT: 'Portugal',\n            QA: 'Qatar',\n            RO: 'Romania',\n            RS: 'Serbia',\n            SA: 'Saudi Arabia',\n            SE: 'Sweden',\n            SI: 'Slovenia',\n            SK: 'Slovakia',\n            SM: 'San Marino',\n            SN: 'Senegal',\n            TN: 'Tunisia',\n            TR: 'Turkey',\n            VG: 'Virgin Islands, British'\n        }\n    });\n\n    $.fn.bootstrapValidator.validators.iban = {\n        html5Attributes: {\n            message: 'message',\n            country: 'country'\n        },\n\n        // http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf\n        // http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country\n        REGEX: {\n            'AD': 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}',                     // Andorra\n            'AE': 'AE[0-9]{2}[0-9]{3}[0-9]{16}',                                // United Arab Emirates\n            'AL': 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}',                             // Albania\n            'AO': 'AO[0-9]{2}[0-9]{21}',                                        // Angola\n            'AT': 'AT[0-9]{2}[0-9]{5}[0-9]{11}',                                // Austria\n            'AZ': 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}',                             // Azerbaijan\n            'BA': 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}',                 // Bosnia and Herzegovina\n            'BE': 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}',                         // Belgium\n            'BF': 'BF[0-9]{2}[0-9]{23}',                                        // Burkina Faso\n            'BG': 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}',              // Bulgaria\n            'BH': 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}',                             // Bahrain\n            'BI': 'BI[0-9]{2}[0-9]{12}',                                        // Burundi\n            'BJ': 'BJ[0-9]{2}[A-Z]{1}[0-9]{23}',                                // Benin\n            'BR': 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]',           // Brazil\n            'CH': 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}',                             // Switzerland\n            'CI': 'CI[0-9]{2}[A-Z]{1}[0-9]{23}',                                // Ivory Coast\n            'CM': 'CM[0-9]{2}[0-9]{23}',                                        // Cameroon\n            'CR': 'CR[0-9]{2}[0-9]{3}[0-9]{14}',                                // Costa Rica\n            'CV': 'CV[0-9]{2}[0-9]{21}',                                        // Cape Verde\n            'CY': 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}',                     // Cyprus\n            'CZ': 'CZ[0-9]{2}[0-9]{20}',                                        // Czech Republic\n            'DE': 'DE[0-9]{2}[0-9]{8}[0-9]{10}',                                // Germany\n            'DK': 'DK[0-9]{2}[0-9]{14}',                                        // Denmark\n            'DO': 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}',                             // Dominican Republic\n            'DZ': 'DZ[0-9]{2}[0-9]{20}',                                        // Algeria\n            'EE': 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}',                // Estonia\n            'ES': 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}',        // Spain\n            'FI': 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}',                         // Finland\n            'FO': 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                         // Faroe Islands\n            'FR': 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}',             // France\n            'GB': 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',                         // United Kingdom\n            'GE': 'GE[0-9]{2}[A-Z]{2}[0-9]{16}',                                // Georgia\n            'GI': 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}',                             // Gibraltar\n            'GL': 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                         // Greenland\n            'GR': 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}',                     // Greece\n            'GT': 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}',                          // Guatemala\n            'HR': 'HR[0-9]{2}[0-9]{7}[0-9]{10}',                                // Croatia\n            'HU': 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}',        // Hungary\n            'IE': 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',                         // Ireland\n            'IL': 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}',                        // Israel\n            'IR': 'IR[0-9]{2}[0-9]{22}',                                        // Iran\n            'IS': 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}',                // Iceland\n            'IT': 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}',             // Italy\n            'JO': 'JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}',               // Jordan\n            'KW': 'KW[0-9]{2}[A-Z]{4}[0-9]{22}',                                // Kuwait\n            'KZ': 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}',                             // Kazakhstan\n            'LB': 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}',                             // Lebanon\n            'LI': 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}',                             // Liechtenstein\n            'LT': 'LT[0-9]{2}[0-9]{5}[0-9]{11}',                                // Lithuania\n            'LU': 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}',                             // Luxembourg\n            'LV': 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}',                             // Latvia\n            'MC': 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}',             // Monaco\n            'MD': 'MD[0-9]{2}[A-Z0-9]{20}',                                     // Moldova\n            'ME': 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',                        // Montenegro\n            'MG': 'MG[0-9]{2}[0-9]{23}',                                        // Madagascar\n            'MK': 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}',                     // Macedonia\n            'ML': 'ML[0-9]{2}[A-Z]{1}[0-9]{23}',                                // Mali\n            'MR': 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}',                      // Mauritania\n            'MT': 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}',                     // Malta\n            'MU': 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}',// Mauritius\n            'MZ': 'MZ[0-9]{2}[0-9]{21}',                                        // Mozambique\n            'NL': 'NL[0-9]{2}[A-Z]{4}[0-9]{10}',                                // Netherlands\n            'NO': 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}',                         // Norway\n            'PK': 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}',                             // Pakistan\n            'PL': 'PL[0-9]{2}[0-9]{8}[0-9]{16}',                                // Poland\n            'PS': 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}',                             // Palestinian\n            'PT': 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}',                // Portugal\n            'QA': 'QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}',                             // Qatar\n            'RO': 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}',                             // Romania\n            'RS': 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',                        // Serbia\n            'SA': 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}',                             // Saudi Arabia\n            'SE': 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}',                        // Sweden\n            'SI': 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}',                         // Slovenia\n            'SK': 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}',                        // Slovakia\n            'SM': 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}',             // San Marino\n            'SN': 'SN[0-9]{2}[A-Z]{1}[0-9]{23}',                                // Senegal\n            'TN': 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',                      // Tunisia\n            'TR': 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}',                  // Turkey\n            'VG': 'VG[0-9]{2}[A-Z]{4}[0-9]{16}'                                 // Virgin Islands, British\n        },\n\n        /**\n         * Validate an International Bank Account Number (IBAN)\n         * To test it, take the sample IBAN from\n         * http://www.nordea.com/Our+services/International+products+and+services/Cash+Management/IBAN+countries/908462.html\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * - country: The ISO 3166-1 country code. It can be\n         *      - A country code\n         *      - Name of field which its value defines the country code\n         *      - Name of callback function that returns the country code\n         *      - A callback function that returns the country code\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();\n            var country = options.country;\n            if (!country) {\n                country = value.substr(0, 2);\n            } else if (typeof country !== 'string' || !this.REGEX[country]) {\n                // Determine the country code\n                country = validator.getDynamicOption($field, country);\n            }\n\n            if (!this.REGEX[country]) {\n                return {\n                    valid: false,\n                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.countryNotSupported, country)\n                };\n            }\n\n            if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {\n                return {\n                    valid: false,\n                    message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])\n                };\n            }\n\n            value = value.substr(4) + value.substr(0, 4);\n            value = $.map(value.split(''), function(n) {\n                var code = n.charCodeAt(0);\n                return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))\n                        // Replace A, B, C, ..., Z with 10, 11, ..., 35\n                        ? (code - 'A'.charCodeAt(0) + 10)\n                        : n;\n            });\n            value = value.join('');\n\n            var temp   = parseInt(value.substr(0, 1), 10),\n                length = value.length;\n            for (var i = 1; i < length; ++i) {\n                temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;\n            }\n\n            return {\n                valid: (temp === 1),\n                message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])\n            };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.id = $.extend($.fn.bootstrapValidator.i18n.id || {}, {\n        'default': 'Please enter a valid identification number',\n        countryNotSupported: 'The country code %s is not supported',\n        country: 'Please enter a valid %s identification number',\n        countries: {\n            BA: 'Bosnia and Herzegovina',\n            BG: 'Bulgarian',\n            BR: 'Brazilian',\n            CH: 'Swiss',\n            CL: 'Chilean',\n            CZ: 'Czech',\n            DK: 'Danish',\n            EE: 'Estonian',\n            ES: 'Spanish',\n            FI: 'Finnish',\n            HR: 'Croatian',\n            IE: 'Irish',\n            IS: 'Iceland',\n            LT: 'Lithuanian',\n            LV: 'Latvian',\n            ME: 'Montenegro',\n            MK: 'Macedonian',\n            NL: 'Dutch',\n            RO: 'Romanian',\n            RS: 'Serbian',\n            SE: 'Swedish',\n            SI: 'Slovenian',\n            SK: 'Slovak',\n            SM: 'San Marino',\n            ZA: 'South African'\n        }\n    });\n\n    $.fn.bootstrapValidator.validators.id = {\n        html5Attributes: {\n            message: 'message',\n            country: 'country'\n        },\n\n        // Supported country codes\n        COUNTRY_CODES: [\n            'BA', 'BG', 'BR', 'CH', 'CL', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',\n            'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'ZA'\n        ],\n\n        /**\n         * Validate identification number in different countries\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - country: The ISO 3166-1 country code. It can be\n         *      - One of country code defined in COUNTRY_CODES\n         *      - Name of field which its value defines the country code\n         *      - Name of callback function that returns the country code\n         *      - A callback function that returns the country code\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var country = options.country;\n            if (!country) {\n                country = value.substr(0, 2);\n            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n                // Determine the country code\n                country = validator.getDynamicOption($field, country);\n            }\n\n            if ($.inArray(country, this.COUNTRY_CODES) === -1) {\n                return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.countryNotSupported, country) };\n            }\n\n            var method  = ['_', country.toLowerCase()].join('');\n            return this[method](value)\n                    ? true\n                    : {\n                        valid: false,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.id.country, $.fn.bootstrapValidator.i18n.id.countries[country.toUpperCase()])\n                    };\n        },\n\n        /**\n         * Validate Unique Master Citizen Number which uses in\n         * - Bosnia and Herzegovina (country code: BA)\n         * - Macedonia (MK)\n         * - Montenegro (ME)\n         * - Serbia (RS)\n         * - Slovenia (SI)\n         *\n         * @see http://en.wikipedia.org/wiki/Unique_Master_Citizen_Number\n         * @param {String} value The ID\n         * @param {String} countryCode The ISO country code, can be BA, MK, ME, RS, SI\n         * @returns {Boolean}\n         */\n        _validateJMBG: function(value, countryCode) {\n            if (!/^\\d{13}$/.test(value)) {\n                return false;\n            }\n            var day   = parseInt(value.substr(0, 2), 10),\n                month = parseInt(value.substr(2, 2), 10),\n                year  = parseInt(value.substr(4, 3), 10),\n                rr    = parseInt(value.substr(7, 2), 10),\n                k     = parseInt(value.substr(12, 1), 10);\n\n            // Validate date of birth\n            // FIXME: Validate the year of birth\n            if (day > 31 || month > 12) {\n                return false;\n            }\n\n            // Validate checksum\n            var sum = 0;\n            for (var i = 0; i < 6; i++) {\n                sum += (7 - i) * (parseInt(value.charAt(i), 10) + parseInt(value.charAt(i + 6), 10));\n            }\n            sum = 11 - sum % 11;\n            if (sum === 10 || sum === 11) {\n                sum = 0;\n            }\n            if (sum !== k) {\n                return false;\n            }\n\n            // Validate political region\n            // rr is the political region of birth, which can be in ranges:\n            // 10-19: Bosnia and Herzegovina\n            // 20-29: Montenegro\n            // 30-39: Croatia (not used anymore)\n            // 41-49: Macedonia\n            // 50-59: Slovenia (only 50 is used)\n            // 70-79: Central Serbia\n            // 80-89: Serbian province of Vojvodina\n            // 90-99: Kosovo\n            switch (countryCode.toUpperCase()) {\n                case 'BA':\n                    return (10 <= rr && rr <= 19);\n                case 'MK':\n                    return (41 <= rr && rr <= 49);\n                case 'ME':\n                    return (20 <= rr && rr <= 29);\n                case 'RS':\n                    return (70 <= rr && rr <= 99);\n                case 'SI':\n                    return (50 <= rr && rr <= 59);\n                default:\n                    return true;\n            }\n        },\n\n        _ba: function(value) {\n            return this._validateJMBG(value, 'BA');\n        },\n        _mk: function(value) {\n            return this._validateJMBG(value, 'MK');\n        },\n        _me: function(value) {\n            return this._validateJMBG(value, 'ME');\n        },\n        _rs: function(value) {\n            return this._validateJMBG(value, 'RS');\n        },\n\n        /**\n         * Examples: 0101006500006\n         */\n        _si: function(value) {\n            return this._validateJMBG(value, 'SI');\n        },\n\n        /**\n         * Validate Bulgarian national identification number (EGN)\n         * Examples:\n         * - Valid: 7523169263, 8032056031, 803205 603 1, 8001010008, 7501020018, 7552010005, 7542011030\n         * - Invalid: 8019010008\n         *\n         * @see http://en.wikipedia.org/wiki/Uniform_civil_number\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _bg: function(value) {\n            if (!/^\\d{10}$/.test(value) && !/^\\d{6}\\s\\d{3}\\s\\d{1}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\s/g, '');\n            // Check the birth date\n            var year  = parseInt(value.substr(0, 2), 10) + 1900,\n                month = parseInt(value.substr(2, 2), 10),\n                day   = parseInt(value.substr(4, 2), 10);\n            if (month > 40) {\n                year += 100;\n                month -= 40;\n            } else if (month > 20) {\n                year -= 100;\n                month -= 20;\n            }\n\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                return false;\n            }\n\n            var sum    = 0,\n                weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];\n            for (var i = 0; i < 9; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = (sum % 11) % 10;\n            return (sum + '' === value.substr(9, 1));\n        },\n\n        /**\n         * Validate Brazilian national identification number (CPF)\n         * Examples:\n         * - Valid: 39053344705, 390.533.447-05, 111.444.777-35\n         * - Invalid: 231.002.999-00\n         *\n         * @see http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _br: function(value) {\n            if (/^1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}$/.test(value)) {\n                return false;\n            }\n            if (!/^\\d{11}$/.test(value) && !/^\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\./g, '').replace(/-/g, '');\n\n            var d1 = 0;\n            for (var i = 0; i < 9; i++) {\n                d1 += (10 - i) * parseInt(value.charAt(i), 10);\n            }\n            d1 = 11 - d1 % 11;\n            if (d1 === 10 || d1 === 11) {\n                d1 = 0;\n            }\n            if (d1 + '' !== value.charAt(9)) {\n                return false;\n            }\n\n            var d2 = 0;\n            for (i = 0; i < 10; i++) {\n                d2 += (11 - i) * parseInt(value.charAt(i), 10);\n            }\n            d2 = 11 - d2 % 11;\n            if (d2 === 10 || d2 === 11) {\n                d2 = 0;\n            }\n\n            return (d2 + '' === value.charAt(10));\n        },\n\n        /**\n         * Validate Swiss Social Security Number (AHV-Nr/No AVS)\n         * Examples:\n         * - Valid: 756.1234.5678.95, 7561234567895\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number#Switzerland\n         * @see http://www.bsv.admin.ch/themen/ahv/00011/02185/index.html?lang=de\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _ch: function(value) {\n            if (!/^756[\\.]{0,1}[0-9]{4}[\\.]{0,1}[0-9]{4}[\\.]{0,1}[0-9]{2}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\D/g, '').substr(3);\n            var length = value.length,\n                sum    = 0,\n                weight = (length === 8) ? [3, 1] : [1, 3];\n            for (var i = 0; i < length - 1; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i % 2];\n            }\n            sum = 10 - sum % 10;\n            return (sum + '' === value.charAt(length - 1));\n        },\n\n        /**\n         * Validate Chilean national identification number (RUN/RUT)\n         * Examples:\n         * - Valid: 76086428-5, 22060449-7, 12531909-2\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number#Chile\n         * @see https://palena.sii.cl/cvc/dte/ee_empresas_emisoras.html for samples\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _cl: function(value) {\n            if (!/^\\d{7,8}[-]{0,1}[0-9K]$/i.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\-/g, '');\n            while (value.length < 9) {\n                value = '0' + value;\n            }\n            var sum    = 0,\n                weight = [3, 2, 7, 6, 5, 4, 3, 2];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = 11 - sum % 11;\n            if (sum === 11) {\n                sum = 0;\n            } else if (sum === 10) {\n                sum = 'K';\n            }\n            return sum + '' === value.charAt(8).toUpperCase();\n        },\n\n        /**\n         * Validate Czech national identification number (RC)\n         * Examples:\n         * - Valid: 7103192745, 991231123\n         * - Invalid: 1103492745, 590312123\n         *\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _cz: function(value) {\n            if (!/^\\d{9,10}$/.test(value)) {\n                return false;\n            }\n            var year  = 1900 + parseInt(value.substr(0, 2), 10),\n                month = parseInt(value.substr(2, 2), 10) % 50 % 20,\n                day   = parseInt(value.substr(4, 2), 10);\n            if (value.length === 9) {\n                if (year >= 1980) {\n                    year -= 100;\n                }\n                if (year > 1953) {\n                    return false;\n                }\n            } else if (year < 1954) {\n                year += 100;\n            }\n\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                return false;\n            }\n\n            // Check that the birth date is not in the future\n            if (value.length === 10) {\n                var check = parseInt(value.substr(0, 9), 10) % 11;\n                if (year < 1985) {\n                    check = check % 10;\n                }\n                return (check + '' === value.substr(9, 1));\n            }\n\n            return true;\n        },\n\n        /**\n         * Validate Danish Personal Identification number (CPR)\n         * Examples:\n         * - Valid: 2110625629, 211062-5629\n         * - Invalid: 511062-5629\n         *\n         * @see https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark)\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _dk: function(value) {\n            if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/-/g, '');\n            var day   = parseInt(value.substr(0, 2), 10),\n                month = parseInt(value.substr(2, 2), 10),\n                year  = parseInt(value.substr(4, 2), 10);\n\n            switch (true) {\n                case ('5678'.indexOf(value.charAt(6)) !== -1 && year >= 58):\n                    year += 1800;\n                    break;\n                case ('0123'.indexOf(value.charAt(6)) !== -1):\n                case ('49'.indexOf(value.charAt(6)) !== -1 && year >= 37):\n                    year += 1900;\n                    break;\n                default:\n                    year += 2000;\n                    break;\n            }\n\n            return $.fn.bootstrapValidator.helpers.date(year, month, day);\n        },\n\n        /**\n         * Validate Estonian Personal Identification Code (isikukood)\n         * Examples:\n         * - Valid: 37605030299\n         *\n         * @see http://et.wikipedia.org/wiki/Isikukood\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _ee: function(value) {\n            // Use the same format as Lithuanian Personal Code\n            return this._lt(value);\n        },\n\n        /**\n         * Validate Spanish personal identity code (DNI)\n         * Support i) DNI (for Spanish citizens) and ii) NIE (for foreign people)\n         *\n         * Examples:\n         * - Valid: i) 54362315K, 54362315-K; ii) X2482300W, X-2482300W, X-2482300-W\n         * - Invalid: i) 54362315Z; ii) X-2482300A\n         *\n         * @see https://en.wikipedia.org/wiki/National_identification_number#Spain\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _es: function(value) {\n            if (!/^[0-9A-Z]{8}[-]{0,1}[0-9A-Z]$/.test(value)                    // DNI\n                && !/^[XYZ][-]{0,1}[0-9]{7}[-]{0,1}[0-9A-Z]$/.test(value)) {    // NIE\n                return false;\n            }\n\n            value = value.replace(/-/g, '');\n            var index = 'XYZ'.indexOf(value.charAt(0));\n            if (index !== -1) {\n                // It is NIE number\n                value = index + value.substr(1) + '';\n            }\n\n            var check = parseInt(value.substr(0, 8), 10);\n            check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n            return (check === value.substr(8, 1));\n        },\n\n        /**\n         * Validate Finnish Personal Identity Code (HETU)\n         * Examples:\n         * - Valid: 311280-888Y, 131052-308T\n         * - Invalid: 131052-308U, 310252-308Y\n         *\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _fi: function(value) {\n            if (!/^[0-9]{6}[-+A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/.test(value)) {\n                return false;\n            }\n            var day       = parseInt(value.substr(0, 2), 10),\n                month     = parseInt(value.substr(2, 2), 10),\n                year      = parseInt(value.substr(4, 2), 10),\n                centuries = {\n                    '+': 1800,\n                    '-': 1900,\n                    'A': 2000\n                };\n            year = centuries[value.charAt(6)] + year;\n\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                return false;\n            }\n\n            var individual = parseInt(value.substr(7, 3), 10);\n            if (individual < 2) {\n                return false;\n            }\n            var n = value.substr(0, 6) + value.substr(7, 3) + '';\n            n = parseInt(n, 10);\n            return '0123456789ABCDEFHJKLMNPRSTUVWXY'.charAt(n % 31) === value.charAt(10);\n        },\n\n        /**\n         * Validate Croatian personal identification number (OIB)\n         * Examples:\n         * - Valid: 33392005961\n         * - Invalid: 33392005962\n         *\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _hr: function(value) {\n            if (!/^[0-9]{11}$/.test(value)) {\n                return false;\n            }\n            return $.fn.bootstrapValidator.helpers.mod11And10(value);\n        },\n\n        /**\n         * Validate Irish Personal Public Service Number (PPS)\n         * Examples:\n         * - Valid: 6433435F, 6433435FT, 6433435FW, 6433435OA, 6433435IH, 1234567TW, 1234567FA\n         * - Invalid: 6433435E, 6433435VH\n         *\n         * @see https://en.wikipedia.org/wiki/Personal_Public_Service_Number\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _ie: function(value) {\n            if (!/^\\d{7}[A-W][AHWTX]?$/.test(value)) {\n                return false;\n            }\n\n            var getCheckDigit = function(value) {\n                while (value.length < 7) {\n                    value = '0' + value;\n                }\n                var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',\n                    sum      = 0;\n                for (var i = 0; i < 7; i++) {\n                    sum += parseInt(value.charAt(i), 10) * (8 - i);\n                }\n                sum += 9 * alphabet.indexOf(value.substr(7));\n                return alphabet[sum % 23];\n            };\n\n            // 2013 format\n            if (value.length === 9 && ('A' === value.charAt(8) || 'H' === value.charAt(8))) {\n                return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');\n            }\n            // The old format\n            else {\n                return value.charAt(7) === getCheckDigit(value.substr(0, 7));\n            }\n        },\n\n        /**\n         * Validate Iceland national identification number (Kennitala)\n         * Examples:\n         * - Valid: 120174-3399, 1201743399, 0902862349\n         *\n         * @see http://en.wikipedia.org/wiki/Kennitala\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _is: function(value) {\n            if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/-/g, '');\n            var day     = parseInt(value.substr(0, 2), 10),\n                month   = parseInt(value.substr(2, 2), 10),\n                year    = parseInt(value.substr(4, 2), 10),\n                century = parseInt(value.charAt(9), 10);\n\n            year = (century === 9) ? (1900 + year) : ((20 + century) * 100 + year);\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {\n                return false;\n            }\n            // Validate the check digit\n            var sum    = 0,\n                weight = [3, 2, 7, 6, 5, 4, 3, 2];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = 11 - sum % 11;\n            return (sum + '' === value.charAt(8));\n        },\n\n        /**\n         * Validate Lithuanian Personal Code (Asmens kodas)\n         * Examples:\n         * - Valid: 38703181745\n         * - Invalid: 38703181746, 78703181745, 38703421745\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number#Lithuania\n         * @see http://www.adomas.org/midi2007/pcode.html\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _lt: function(value) {\n            if (!/^[0-9]{11}$/.test(value)) {\n                return false;\n            }\n            var gender  = parseInt(value.charAt(0), 10),\n                year    = parseInt(value.substr(1, 2), 10),\n                month   = parseInt(value.substr(3, 2), 10),\n                day     = parseInt(value.substr(5, 2), 10),\n                century = (gender % 2 === 0) ? (17 + gender / 2) : (17 + (gender + 1) / 2);\n            year = century * 100 + year;\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {\n                return false;\n            }\n\n            // Validate the check digit\n            var sum    = 0,\n                weight = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];\n            for (var i = 0; i < 10; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = sum % 11;\n            if (sum !== 10) {\n                return sum + '' === value.charAt(10);\n            }\n\n            // Re-calculate the check digit\n            sum    = 0;\n            weight = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];\n            for (i = 0; i < 10; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = sum % 11;\n            if (sum === 10) {\n                sum = 0;\n            }\n            return (sum + '' === value.charAt(10));\n        },\n\n        /**\n         * Validate Latvian Personal Code (Personas kods)\n         * Examples:\n         * - Valid: 161175-19997, 16117519997\n         * - Invalid: 161375-19997\n         *\n         * @see http://laacz.lv/2006/11/25/pk-parbaudes-algoritms/\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _lv: function(value) {\n            if (!/^[0-9]{6}[-]{0,1}[0-9]{5}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\D/g, '');\n            // Check birth date\n            var day   = parseInt(value.substr(0, 2), 10),\n                month = parseInt(value.substr(2, 2), 10),\n                year  = parseInt(value.substr(4, 2), 10);\n            year = year + 1800 + parseInt(value.charAt(6), 10) * 100;\n\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {\n                return false;\n            }\n\n            // Check personal code\n            var sum    = 0,\n                weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];\n            for (var i = 0; i < 10; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = (sum + 1) % 11 % 10;\n            return (sum + '' === value.charAt(10));\n        },\n\n        /**\n         * Validate Dutch national identification number (BSN)\n         * Examples:\n         * - Valid: 111222333, 941331490, 9413.31.490\n         * - Invalid: 111252333\n         *\n         * @see https://nl.wikipedia.org/wiki/Burgerservicenummer\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _nl: function(value) {\n            while (value.length < 9) {\n                value = '0' + value;\n            }\n            if (!/^[0-9]{4}[.]{0,1}[0-9]{2}[.]{0,1}[0-9]{3}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/\\./g, '');\n            if (parseInt(value, 10) === 0) {\n                return false;\n            }\n            var sum    = 0,\n                length = value.length;\n            for (var i = 0; i < length - 1; i++) {\n                sum += (9 - i) * parseInt(value.charAt(i), 10);\n            }\n            sum = sum % 11;\n            if (sum === 10) {\n                sum = 0;\n            }\n            return (sum + '' === value.charAt(length - 1));\n        },\n\n        /**\n         * Validate Romanian numerical personal code (CNP)\n         * Examples:\n         * - Valid: 1630615123457, 1800101221144\n         * - Invalid: 8800101221144, 1632215123457, 1630615123458\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number#Romania\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _ro: function(value) {\n            if (!/^[0-9]{13}$/.test(value)) {\n                return false;\n            }\n            var gender = parseInt(value.charAt(0), 10);\n            if (gender === 0 || gender === 7 || gender === 8) {\n                return false;\n            }\n\n            // Determine the date of birth\n            var year      = parseInt(value.substr(1, 2), 10),\n                month     = parseInt(value.substr(3, 2), 10),\n                day       = parseInt(value.substr(5, 2), 10),\n                // The year of date is determined base on the gender\n                centuries = {\n                    '1': 1900,  // Male born between 1900 and 1999\n                    '2': 1900,  // Female born between 1900 and 1999\n                    '3': 1800,  // Male born between 1800 and 1899\n                    '4': 1800,  // Female born between 1800 and 1899\n                    '5': 2000,  // Male born after 2000\n                    '6': 2000   // Female born after 2000\n                };\n            if (day > 31 && month > 12) {\n                return false;\n            }\n            if (gender !== 9) {\n                year = centuries[gender + ''] + year;\n                if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                    return false;\n                }\n            }\n\n            // Validate the check digit\n            var sum    = 0,\n                weight = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9],\n                length = value.length;\n            for (var i = 0; i < length - 1; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = sum % 11;\n            if (sum === 10) {\n                sum = 1;\n            }\n            return (sum + '' === value.charAt(length - 1));\n        },\n\n        /**\n         * Validate Swedish personal identity number (personnummer)\n         * Examples:\n         * - Valid: 8112289874, 811228-9874, 811228+9874\n         * - Invalid: 811228-9873\n         *\n         * @see http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden)\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _se: function(value) {\n            if (!/^[0-9]{10}$/.test(value) && !/^[0-9]{6}[-|+][0-9]{4}$/.test(value)) {\n                return false;\n            }\n            value = value.replace(/[^0-9]/g, '');\n\n            var year  = parseInt(value.substr(0, 2), 10) + 1900,\n                month = parseInt(value.substr(2, 2), 10),\n                day   = parseInt(value.substr(4, 2), 10);\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                return false;\n            }\n\n            // Validate the last check digit\n            return $.fn.bootstrapValidator.helpers.luhn(value);\n        },\n\n        /**\n         * Validate Slovak national identifier number (RC)\n         * Examples:\n         * - Valid: 7103192745, 991231123\n         * - Invalid: 7103192746, 1103492745\n         *\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _sk: function(value) {\n            // Slovakia uses the same format as Czech Republic\n            return this._cz(value);\n        },\n\n        /**\n         * Validate San Marino citizen number\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number#San_Marino\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _sm: function(value) {\n            return /^\\d{5}$/.test(value);\n        },\n\n        /**\n         * Validate South African ID\n         * Example:\n         * - Valid: 8001015009087\n         * - Invalid: 8001015009287, 8001015009086\n         *\n         * @see http://en.wikipedia.org/wiki/National_identification_number#South_Africa\n         * @param {String} value The ID\n         * @returns {Boolean}\n         */\n        _za: function(value) {\n            if (!/^[0-9]{10}[0|1][8|9][0-9]$/.test(value)) {\n                return false;\n            }\n            var year        = parseInt(value.substr(0, 2), 10),\n                currentYear = new Date().getFullYear() % 100,\n                month       = parseInt(value.substr(2, 2), 10),\n                day         = parseInt(value.substr(4, 2), 10);\n            year = (year >= currentYear) ? (year + 1900) : (year + 2000);\n\n            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                return false;\n            }\n\n            // Validate the last check digit\n            return $.fn.bootstrapValidator.helpers.luhn(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.identical = $.extend($.fn.bootstrapValidator.i18n.identical || {}, {\n        'default': 'Please enter the same value'\n    });\n\n    $.fn.bootstrapValidator.validators.identical = {\n        html5Attributes: {\n            message: 'message',\n            field: 'field'\n        },\n\n        /**\n         * Check if input value equals to value of particular one\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consists of the following key:\n         * - field: The name of field that will be used to compare with current one\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var compareWith = validator.getFieldElements(options.field);\n            if (compareWith === null) {\n                return true;\n            }\n\n            if (value === compareWith.val()) {\n                validator.updateStatus(options.field, validator.STATUS_VALID, 'identical');\n                return true;\n            } else {\n                return false;\n            }\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.imei = $.extend($.fn.bootstrapValidator.i18n.imei || {}, {\n        'default': 'Please enter a valid IMEI number'\n    });\n\n    $.fn.bootstrapValidator.validators.imei = {\n        /**\n         * Validate IMEI (International Mobile Station Equipment Identity)\n         * Examples:\n         * - Valid: 35-209900-176148-1, 35-209900-176148-23, 3568680000414120, 490154203237518\n         * - Invalid: 490154203237517\n         *\n         * @see http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            switch (true) {\n                case /^\\d{15}$/.test(value):\n                case /^\\d{2}-\\d{6}-\\d{6}-\\d{1}$/.test(value):\n                case /^\\d{2}\\s\\d{6}\\s\\d{6}\\s\\d{1}$/.test(value):\n                    value = value.replace(/[^0-9]/g, '');\n                    return $.fn.bootstrapValidator.helpers.luhn(value);\n\n                case /^\\d{14}$/.test(value):\n                case /^\\d{16}$/.test(value):\n                case /^\\d{2}-\\d{6}-\\d{6}(|-\\d{2})$/.test(value):\n                case /^\\d{2}\\s\\d{6}\\s\\d{6}(|\\s\\d{2})$/.test(value):\n                    return true;\n\n                default:\n                    return false;\n            }\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.integer = $.extend($.fn.bootstrapValidator.i18n.integer || {}, {\n        'default': 'Please enter a valid number'\n    });\n\n    $.fn.bootstrapValidator.validators.integer = {\n        enableByHtml5: function($field) {\n            return ('number' === $field.attr('type')) && ($field.attr('step') === undefined || $field.attr('step') % 1 === 0);\n        },\n\n        /**\n         * Return true if the input value is an integer\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following key:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n            return /^(?:-?(?:0|[1-9][0-9]*))$/.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.ip = $.extend($.fn.bootstrapValidator.i18n.ip || {}, {\n        'default': 'Please enter a valid IP address',\n        ipv4: 'Please enter a valid IPv4 address',\n        ipv6: 'Please enter a valid IPv6 address'\n    });\n\n    $.fn.bootstrapValidator.validators.ip = {\n        html5Attributes: {\n            message: 'message',\n            ipv4: 'ipv4',\n            ipv6: 'ipv6'\n        },\n\n        /**\n         * Return true if the input value is a IP address.\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - ipv4: Enable IPv4 validator, default to true\n         * - ipv6: Enable IPv6 validator, default to true\n         * - message: The invalid message\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n            options = $.extend({}, { ipv4: true, ipv6: true }, options);\n\n            if (options.ipv4) {\n                return {\n                    valid: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value),\n                    message: options.message || $.fn.bootstrapValidator.i18n.ip.ipv4\n                };\n            } else if (options.ipv6) {\n                return {\n                    valid: /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/.test(value),\n                    message: options.message || $.fn.bootstrapValidator.i18n.ip.ipv6\n                };\n            }\n\n            return false;\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.isbn = $.extend($.fn.bootstrapValidator.i18n.isbn || {}, {\n        'default': 'Please enter a valid ISBN number'\n    });\n\n    $.fn.bootstrapValidator.validators.isbn = {\n        /**\n         * Return true if the input value is a valid ISBN 10 or ISBN 13 number\n         * Examples:\n         * - Valid:\n         * ISBN 10: 99921-58-10-7, 9971-5-0210-0, 960-425-059-0, 80-902734-1-6, 85-359-0277-5, 1-84356-028-3, 0-684-84328-5, 0-8044-2957-X, 0-85131-041-9, 0-943396-04-2, 0-9752298-0-X\n         * ISBN 13: 978-0-306-40615-7\n         * - Invalid:\n         * ISBN 10: 99921-58-10-6\n         * ISBN 13: 978-0-306-40615-6\n         *\n         * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} [options] Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // http://en.wikipedia.org/wiki/International_Standard_Book_Number#Overview\n            // Groups are separated by a hyphen or a space\n            var type;\n            switch (true) {\n                case /^\\d{9}[\\dX]$/.test(value):\n                case (value.length === 13 && /^(\\d+)-(\\d+)-(\\d+)-([\\dX])$/.test(value)):\n                case (value.length === 13 && /^(\\d+)\\s(\\d+)\\s(\\d+)\\s([\\dX])$/.test(value)):\n                    type = 'ISBN10';\n                    break;\n                case /^(978|979)\\d{9}[\\dX]$/.test(value):\n                case (value.length === 17 && /^(978|979)-(\\d+)-(\\d+)-(\\d+)-([\\dX])$/.test(value)):\n                case (value.length === 17 && /^(978|979)\\s(\\d+)\\s(\\d+)\\s(\\d+)\\s([\\dX])$/.test(value)):\n                    type = 'ISBN13';\n                    break;\n                default:\n                    return false;\n            }\n\n            // Replace all special characters except digits and X\n            value = value.replace(/[^0-9X]/gi, '');\n            var chars  = value.split(''),\n                length = chars.length,\n                sum    = 0,\n                i,\n                checksum;\n\n            switch (type) {\n                case 'ISBN10':\n                    sum = 0;\n                    for (i = 0; i < length - 1; i++) {\n                        sum += parseInt(chars[i], 10) * (10 - i);\n                    }\n                    checksum = 11 - (sum % 11);\n                    if (checksum === 11) {\n                        checksum = 0;\n                    } else if (checksum === 10) {\n                        checksum = 'X';\n                    }\n                    return (checksum + '' === chars[length - 1]);\n\n                case 'ISBN13':\n                    sum = 0;\n                    for (i = 0; i < length - 1; i++) {\n                        sum += ((i % 2 === 0) ? parseInt(chars[i], 10) : (parseInt(chars[i], 10) * 3));\n                    }\n                    checksum = 10 - (sum % 10);\n                    if (checksum === 10) {\n                        checksum = '0';\n                    }\n                    return (checksum + '' === chars[length - 1]);\n\n                default:\n                    return false;\n            }\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.isin = $.extend($.fn.bootstrapValidator.i18n.isin || {}, {\n        'default': 'Please enter a valid ISIN number'\n    });\n\n    $.fn.bootstrapValidator.validators.isin = {\n        // Available country codes\n        // See http://isin.net/country-codes/\n        COUNTRY_CODES: 'AF|AX|AL|DZ|AS|AD|AO|AI|AQ|AG|AR|AM|AW|AU|AT|AZ|BS|BH|BD|BB|BY|BE|BZ|BJ|BM|BT|BO|BQ|BA|BW|BV|BR|IO|BN|BG|BF|BI|KH|CM|CA|CV|KY|CF|TD|CL|CN|CX|CC|CO|KM|CG|CD|CK|CR|CI|HR|CU|CW|CY|CZ|DK|DJ|DM|DO|EC|EG|SV|GQ|ER|EE|ET|FK|FO|FJ|FI|FR|GF|PF|TF|GA|GM|GE|DE|GH|GI|GR|GL|GD|GP|GU|GT|GG|GN|GW|GY|HT|HM|VA|HN|HK|HU|IS|IN|ID|IR|IQ|IE|IM|IL|IT|JM|JP|JE|JO|KZ|KE|KI|KP|KR|KW|KG|LA|LV|LB|LS|LR|LY|LI|LT|LU|MO|MK|MG|MW|MY|MV|ML|MT|MH|MQ|MR|MU|YT|MX|FM|MD|MC|MN|ME|MS|MA|MZ|MM|NA|NR|NP|NL|NC|NZ|NI|NE|NG|NU|NF|MP|NO|OM|PK|PW|PS|PA|PG|PY|PE|PH|PN|PL|PT|PR|QA|RE|RO|RU|RW|BL|SH|KN|LC|MF|PM|VC|WS|SM|ST|SA|SN|RS|SC|SL|SG|SX|SK|SI|SB|SO|ZA|GS|SS|ES|LK|SD|SR|SJ|SZ|SE|CH|SY|TW|TJ|TZ|TH|TL|TG|TK|TO|TT|TN|TR|TM|TC|TV|UG|UA|AE|GB|US|UM|UY|UZ|VU|VE|VN|VG|VI|WF|EH|YE|ZM|ZW',\n\n        /**\n         * Validate an ISIN (International Securities Identification Number)\n         * Examples:\n         * - Valid: US0378331005, AU0000XVGZA3, GB0002634946\n         * - Invalid: US0378331004, AA0000XVGZA3\n         *\n         * @see http://en.wikipedia.org/wiki/International_Securities_Identifying_Number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            value = value.toUpperCase();\n            var regex = new RegExp('^(' + this.COUNTRY_CODES + ')[0-9A-Z]{10}$');\n            if (!regex.test(value)) {\n                return false;\n            }\n\n            var converted = '',\n                length    = value.length;\n            // Convert letters to number\n            for (var i = 0; i < length - 1; i++) {\n                var c = value.charCodeAt(i);\n                converted += ((c > 57) ? (c - 55).toString() : value.charAt(i));\n            }\n\n            var digits = '',\n                n      = converted.length,\n                group  = (n % 2 !== 0) ? 0 : 1;\n            for (i = 0; i < n; i++) {\n                digits += (parseInt(converted[i], 10) * ((i % 2) === group ? 2 : 1) + '');\n            }\n\n            var sum = 0;\n            for (i = 0; i < digits.length; i++) {\n                sum += parseInt(digits.charAt(i), 10);\n            }\n            sum = (10 - (sum % 10)) % 10;\n            return sum + '' === value.charAt(length - 1);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.ismn = $.extend($.fn.bootstrapValidator.i18n.ismn || {}, {\n        'default': 'Please enter a valid ISMN number'\n    });\n\n    $.fn.bootstrapValidator.validators.ismn = {\n        /**\n         * Validate ISMN (International Standard Music Number)\n         * Examples:\n         * - Valid: M230671187, 979-0-0601-1561-5, 979 0 3452 4680 5, 9790060115615\n         * - Invalid: 9790060115614\n         *\n         * @see http://en.wikipedia.org/wiki/International_Standard_Music_Number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // Groups are separated by a hyphen or a space\n            var type;\n            switch (true) {\n                case /^M\\d{9}$/.test(value):\n                case /^M-\\d{4}-\\d{4}-\\d{1}$/.test(value):\n                case /^M\\s\\d{4}\\s\\d{4}\\s\\d{1}$/.test(value):\n                    type = 'ISMN10';\n                    break;\n                case /^9790\\d{9}$/.test(value):\n                case /^979-0-\\d{4}-\\d{4}-\\d{1}$/.test(value):\n                case /^979\\s0\\s\\d{4}\\s\\d{4}\\s\\d{1}$/.test(value):\n                    type = 'ISMN13';\n                    break;\n                default:\n                    return false;\n            }\n\n            if ('ISMN10' === type) {\n                value = '9790' + value.substr(1);\n            }\n\n            // Replace all special characters except digits\n            value = value.replace(/[^0-9]/gi, '');\n            var length = value.length,\n                sum    = 0,\n                weight = [1, 3];\n            for (var i = 0; i < length - 1; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i % 2];\n            }\n            sum = 10 - sum % 10;\n            return (sum + '' === value.charAt(length - 1));\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.issn = $.extend($.fn.bootstrapValidator.i18n.issn || {}, {\n        'default': 'Please enter a valid ISSN number'\n    });\n\n    $.fn.bootstrapValidator.validators.issn = {\n        /**\n         * Validate ISSN (International Standard Serial Number)\n         * Examples:\n         * - Valid: 0378-5955, 0024-9319, 0032-1478\n         * - Invalid: 0032-147X\n         *\n         * @see http://en.wikipedia.org/wiki/International_Standard_Serial_Number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // Groups are separated by a hyphen or a space\n            if (!/^\\d{4}\\-\\d{3}[\\dX]$/.test(value)) {\n                return false;\n            }\n\n            // Replace all special characters except digits and X\n            value = value.replace(/[^0-9X]/gi, '');\n            var chars  = value.split(''),\n                length = chars.length,\n                sum    = 0;\n\n            if (chars[7] === 'X') {\n                chars[7] = 10;\n            }\n            for (var i = 0; i < length; i++) {\n                sum += parseInt(chars[i], 10) * (8 - i);\n            }\n            return (sum % 11 === 0);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.lessThan = $.extend($.fn.bootstrapValidator.i18n.lessThan || {}, {\n        'default': 'Please enter a value less than or equal to %s',\n        notInclusive: 'Please enter a value less than %s'\n    });\n\n    $.fn.bootstrapValidator.validators.lessThan = {\n        html5Attributes: {\n            message: 'message',\n            value: 'value',\n            inclusive: 'inclusive'\n        },\n\n        enableByHtml5: function($field) {\n            var max = $field.attr('max');\n            if (max) {\n                return {\n                    value: max\n                };\n            }\n\n            return false;\n        },\n\n        /**\n         * Return true if the input value is less than or equal to given number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - value: The number used to compare to. It can be\n         *      - A number\n         *      - Name of field which its value defines the number\n         *      - Name of callback function that returns the number\n         *      - A callback function that returns the number\n         *\n         * - inclusive [optional]: Can be true or false. Default is true\n         * - message: The invalid message\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value);\n\n            value = parseFloat(value);\n            return (options.inclusive === true || options.inclusive === undefined)\n                    ? {\n                        valid: value <= compareTo,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan['default'], compareTo)\n                    }\n                    : {\n                        valid: value < compareTo,\n                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan.notInclusive, compareTo)\n                    };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.mac = $.extend($.fn.bootstrapValidator.i18n.mac || {}, {\n        'default': 'Please enter a valid MAC address'\n    });\n\n    $.fn.bootstrapValidator.validators.mac = {\n        /**\n         * Return true if the input value is a MAC address.\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            return /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.notEmpty = $.extend($.fn.bootstrapValidator.i18n.notEmpty || {}, {\n        'default': 'Please enter a value'\n    });\n\n    $.fn.bootstrapValidator.validators.notEmpty = {\n        enableByHtml5: function($field) {\n            var required = $field.attr('required') + '';\n            return ('required' === required || 'true' === required);\n        },\n\n        /**\n         * Check if input value is empty or not\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var type = $field.attr('type');\n            if ('radio' === type || 'checkbox' === type) {\n                return validator\n                            .getFieldElements($field.attr('data-bv-field'))\n                            .filter(':checked')\n                            .length > 0;\n            }\n\n            return $.trim($field.val()) !== '';\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.numeric = $.extend($.fn.bootstrapValidator.i18n.numeric || {}, {\n        'default': 'Please enter a valid float number'\n    });\n\n    $.fn.bootstrapValidator.validators.numeric = {\n        html5Attributes: {\n            message: 'message',\n            separator: 'separator'\n        },\n\n        enableByHtml5: function($field) {\n            return ('number' === $field.attr('type')) && ($field.attr('step') !== undefined) && ($field.attr('step') % 1 !== 0);\n        },\n\n        /**\n         * Validate decimal number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - separator: The decimal separator. Can be \".\" (default), \",\"\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n            var separator = options.separator || '.';\n            if (separator !== '.') {\n                value = value.replace(separator, '.');\n            }\n\n            return !isNaN(parseFloat(value)) && isFinite(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.phone = $.extend($.fn.bootstrapValidator.i18n.phone || {}, {\n        'default': 'Please enter a valid phone number',\n        countryNotSupported: 'The country code %s is not supported',\n        country: 'Please enter a valid phone number in %s',\n        countries: {\n            GB: 'United Kingdom',\n            US: 'USA'\n        }\n    });\n\n    $.fn.bootstrapValidator.validators.phone = {\n        html5Attributes: {\n            message: 'message',\n            country: 'country'\n        },\n\n        // The supported countries\n        COUNTRY_CODES: ['GB', 'US'],\n\n        /**\n         * Return true if the input value contains a valid phone number for the country\n         * selected in the options\n         *\n         * @param {BootstrapValidator} validator Validate plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - country: The ISO-3166 country code. It can be\n         *      - A country code\n         *      - Name of field which its value defines the country code\n         *      - Name of callback function that returns the country code\n         *      - A callback function that returns the country code\n         *\n         * Currently it only supports United State (US) or United Kingdom (GB) countries\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var country = options.country;\n            if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {\n                // Try to determine the country\n                country = validator.getDynamicOption($field, country);\n            }\n\n            if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n                return {\n                    valid: false,\n                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.phone.countryNotSupported, country)\n                };\n            }\n\n            var isValid = true;\n            switch (country.toUpperCase()) {\n            \tcase 'GB':\n            \t\t// http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers#Match_GB_telephone_number_in_any_format\n            \t\t// Test: http://regexr.com/38uhv\n            \t\tvalue   = $.trim(value);\n            \t\tisValid = (/^\\(?(?:(?:0(?:0|11)\\)?[\\s-]?\\(?|\\+)44\\)?[\\s-]?\\(?(?:0\\)?[\\s-]?\\(?)?|0)(?:\\d{2}\\)?[\\s-]?\\d{4}[\\s-]?\\d{4}|\\d{3}\\)?[\\s-]?\\d{3}[\\s-]?\\d{3,4}|\\d{4}\\)?[\\s-]?(?:\\d{5}|\\d{3}[\\s-]?\\d{3})|\\d{5}\\)?[\\s-]?\\d{4,5}|8(?:00[\\s-]?11[\\s-]?11|45[\\s-]?46[\\s-]?4\\d))(?:(?:[\\s-]?(?:x|ext\\.?\\s?|\\#)\\d+)?)$/).test(value);\n                    break;\n\n                case 'US':\n                /* falls through */\n                default:\n                    // Make sure US phone numbers have 10 digits\n                    // May start with 1, +1, or 1-; should discard\n                    // Area code may be delimited with (), & sections may be delimited with . or -\n                    // Test: http://regexr.com/38mqi\n                    value   = value.replace(/\\D/g, '');\n                    isValid = (/^(?:(1\\-?)|(\\+1 ?))?\\(?(\\d{3})[\\)\\-\\.]?(\\d{3})[\\-\\.]?(\\d{4})$/).test(value) && (value.length === 10);\n                    break;\n            }\n\n            return {\n                valid: isValid,\n                message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.phone.country, $.fn.bootstrapValidator.i18n.phone.countries[country])\n            };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.regexp = $.extend($.fn.bootstrapValidator.i18n.regexp || {}, {\n        'default': 'Please enter a value matching the pattern'\n    });\n\n    $.fn.bootstrapValidator.validators.regexp = {\n        html5Attributes: {\n            message: 'message',\n            regexp: 'regexp'\n        },\n\n        enableByHtml5: function($field) {\n            var pattern = $field.attr('pattern');\n            if (pattern) {\n                return {\n                    regexp: pattern\n                };\n            }\n\n            return false;\n        },\n\n        /**\n         * Check if the element value matches given regular expression\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consists of the following key:\n         * - regexp: The regular expression you need to check\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var regexp = ('string' === typeof options.regexp) ? new RegExp(options.regexp) : options.regexp;\n            return regexp.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.remote = $.extend($.fn.bootstrapValidator.i18n.remote || {}, {\n        'default': 'Please enter a valid value'\n    });\n\n    $.fn.bootstrapValidator.validators.remote = {\n        html5Attributes: {\n            message: 'message',\n            url: 'url',\n            name: 'name'\n        },\n\n        /**\n         * Request a remote server to check the input value\n         *\n         * @param {BootstrapValidator} validator Plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - url {String|Function}\n         * - type {String} [optional] Can be GET or POST (default)\n         * - data {Object|Function} [optional]: By default, it will take the value\n         *  {\n         *      <fieldName>: <fieldValue>\n         *  }\n         * - name {String} [optional]: Override the field name for the request.\n         * - message: The invalid message\n         * @returns {Boolean|Deferred}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var name = $field.attr('data-bv-field'),\n                data = options.data || {},\n                url  = options.url,\n                type = options.type || 'POST';\n\n            // Support dynamic data\n            if ('function' === typeof data) {\n                data = data.call(this, validator);\n            }\n\n            // Support dynamic url\n            if ('function' === typeof url) {\n                url = url.call(this, validator);\n            }\n\n            data[options.name || name] = value;\n\n            var dfd = new $.Deferred();\n            var xhr = $.ajax({\n                type: type,\n                url: url,\n                dataType: 'json',\n                data: data\n            });\n            xhr.then(function(response) {\n                dfd.resolve($field, 'remote', response.valid === true || response.valid === 'true', response.message ? response.message : null);\n            });\n\n            dfd.fail(function() {\n                xhr.abort();\n            });\n\n            return dfd;\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.rtn = $.extend($.fn.bootstrapValidator.i18n.rtn || {}, {\n        'default': 'Please enter a valid RTN number'\n    });\n\n    $.fn.bootstrapValidator.validators.rtn = {\n        /**\n         * Validate a RTN (Routing transit number)\n         * Examples:\n         * - Valid: 021200025, 789456124\n         *\n         * @see http://en.wikipedia.org/wiki/Routing_transit_number\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            if (!/^\\d{9}$/.test(value)) {\n                return false;\n            }\n\n            var sum = 0;\n            for (var i = 0; i < value.length; i += 3) {\n                sum += parseInt(value.charAt(i),     10) * 3\n                    +  parseInt(value.charAt(i + 1), 10) * 7\n                    +  parseInt(value.charAt(i + 2), 10);\n            }\n            return (sum !== 0 && sum % 10 === 0);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.sedol = $.extend($.fn.bootstrapValidator.i18n.sedol || {}, {\n        'default': 'Please enter a valid SEDOL number'\n    });\n\n    $.fn.bootstrapValidator.validators.sedol = {\n        /**\n         * Validate a SEDOL (Stock Exchange Daily Official List)\n         * Examples:\n         * - Valid: 0263494, B0WNLY7\n         *\n         * @see http://en.wikipedia.org/wiki/SEDOL\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            value = value.toUpperCase();\n            if (!/^[0-9A-Z]{7}$/.test(value)) {\n                return false;\n            }\n\n            var sum    = 0,\n                weight = [1, 3, 1, 7, 3, 9, 1],\n                length = value.length;\n            for (var i = 0; i < length - 1; i++) {\n\t            sum += weight[i] * parseInt(value.charAt(i), 36);\n\t        }\n\t        sum = (10 - sum % 10) % 10;\n            return sum + '' === value.charAt(length - 1);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.siren = $.extend($.fn.bootstrapValidator.i18n.siren || {}, {\n        'default': 'Please enter a valid SIREN number'\n    });\n\n\t$.fn.bootstrapValidator.validators.siren = {\n\t\t/**\n\t\t * Check if a string is a siren number\n\t\t *\n\t\t * @param {BootstrapValidator} validator The validator plugin instance\n\t\t * @param {jQuery} $field Field element\n\t\t * @param {Object} options Consist of key:\n         * - message: The invalid message\n\t\t * @returns {Boolean}\n\t\t */\n\t\tvalidate: function(validator, $field, options) {\n\t\t\tvar value = $field.val();\n\t\t\tif (value === '') {\n\t\t\t\treturn true;\n\t\t\t}\n\n            if (!/^\\d{9}$/.test(value)) {\n                return false;\n            }\n            return $.fn.bootstrapValidator.helpers.luhn(value);\n\t\t}\n\t};\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.siret = $.extend($.fn.bootstrapValidator.i18n.siret || {}, {\n        'default': 'Please enter a valid SIRET number'\n    });\n\n\t$.fn.bootstrapValidator.validators.siret = {\n        /**\n         * Check if a string is a siret number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n\t\tvalidate: function(validator, $field, options) {\n\t\t\tvar value = $field.val();\n\t\t\tif (value === '') {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tvar sum    = 0,\n                length = value.length,\n                tmp;\n\t\t\tfor (var i = 0; i < length; i++) {\n                tmp = parseInt(value.charAt(i), 10);\n\t\t\t\tif ((i % 2) === 0) {\n\t\t\t\t\ttmp = tmp * 2;\n\t\t\t\t\tif (tmp > 9) {\n\t\t\t\t\t\ttmp -= 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsum += tmp;\n\t\t\t}\n\t\t\treturn (sum % 10 === 0);\n\t\t}\n\t};\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.step = $.extend($.fn.bootstrapValidator.i18n.step || {}, {\n        'default': 'Please enter a valid step of %s'\n    });\n\n    $.fn.bootstrapValidator.validators.step = {\n        html5Attributes: {\n            message: 'message',\n            base: 'baseValue',\n            step: 'step'\n        },\n\n        /**\n         * Return true if the input value is valid step one\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Can consist of the following keys:\n         * - baseValue: The base value\n         * - step: The step\n         * - message: The invalid message\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            options = $.extend({}, { baseValue: 0, step: 1 }, options);\n            value   = parseFloat(value);\n            if (!$.isNumeric(value)) {\n                return false;\n            }\n\n            var round = function(x, precision) {\n                    var m = Math.pow(10, precision);\n                    x = x * m;\n                    var sign   = (x > 0) | -(x < 0),\n                        isHalf = (x % 1 === 0.5 * sign);\n                    if (isHalf) {\n                        return (Math.floor(x) + (sign > 0)) / m;\n                    } else {\n                        return Math.round(x) / m;\n                    }\n                },\n                floatMod = function(x, y) {\n                    if (y === 0.0) {\n                        return 1.0;\n                    }\n                    var dotX      = (x + '').split('.'),\n                        dotY      = (y + '').split('.'),\n                        precision = ((dotX.length === 1) ? 0 : dotX[1].length) + ((dotY.length === 1) ? 0 : dotY[1].length);\n                    return round(x - y * Math.floor(x / y), precision);\n                };\n\n            var mod = floatMod(value - options.baseValue, options.step);\n            return {\n                valid: mod === 0.0 || mod === options.step,\n                message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.step['default'], [options.step])\n            };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.stringCase = $.extend($.fn.bootstrapValidator.i18n.stringCase || {}, {\n        'default': 'Please enter only lowercase characters',\n        upper: 'Please enter only uppercase characters'\n    });\n\n    $.fn.bootstrapValidator.validators.stringCase = {\n        html5Attributes: {\n            message: 'message',\n            'case': 'case'\n        },\n\n        /**\n         * Check if a string is a lower or upper case one\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - case: Can be 'lower' (default) or 'upper'\n         * @returns {Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var stringCase = (options['case'] || 'lower').toLowerCase();\n            return {\n                valid: ('upper' === stringCase) ? value === value.toUpperCase() : value === value.toLowerCase(),\n                message: options.message || (('upper' === stringCase) ? $.fn.bootstrapValidator.i18n.stringCase.upper : $.fn.bootstrapValidator.i18n.stringCase['default'])\n            };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.stringLength = $.extend($.fn.bootstrapValidator.i18n.stringLength || {}, {\n        'default': 'Please enter a value with valid length',\n        less: 'Please enter less than %s characters',\n        more: 'Please enter more than %s characters',\n        between: 'Please enter value between %s and %s characters long'\n    });\n\n    $.fn.bootstrapValidator.validators.stringLength = {\n        html5Attributes: {\n            message: 'message',\n            min: 'min',\n            max: 'max'\n        },\n\n        enableByHtml5: function($field) {\n            var maxLength = $field.attr('maxlength');\n            if (maxLength) {\n                return {\n                    max: parseInt(maxLength, 10)\n                };\n            }\n\n            return false;\n        },\n\n        /**\n         * Check if the length of element value is less or more than given number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consists of following keys:\n         * - min\n         * - max\n         * At least one of two keys is required\n         * The min, max keys define the number which the field value compares to. min, max can be\n         *      - A number\n         *      - Name of field which its value defines the number\n         *      - Name of callback function that returns the number\n         *      - A callback function that returns the number\n         *\n         * - message: The invalid message\n         * @returns {Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var min     = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),\n                max     = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),\n                length  = value.length,\n                isValid = true,\n                message = options.message || $.fn.bootstrapValidator.i18n.stringLength['default'];\n\n            if ((min && length < parseInt(min, 10)) || (max && length > parseInt(max, 10))) {\n                isValid = false;\n            }\n\n            switch (true) {\n                case (!!min && !!max):\n                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.stringLength.between, [parseInt(min, 10), parseInt(max, 10)]);\n                    break;\n\n                case (!!min):\n                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.stringLength.more, parseInt(min, 10));\n                    break;\n\n                case (!!max):\n                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.stringLength.less, parseInt(max, 10));\n                    break;\n\n                default:\n                    break;\n            }\n\n            return { valid: isValid, message: message };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.uri = $.extend($.fn.bootstrapValidator.i18n.uri || {}, {\n        'default': 'Please enter a valid URI'\n    });\n\n    $.fn.bootstrapValidator.validators.uri = {\n        html5Attributes: {\n            message: 'message',\n            allowlocal: 'allowLocal'\n        },\n\n        enableByHtml5: function($field) {\n            return ('url' === $field.attr('type'));\n        },\n\n        /**\n         * Return true if the input value is a valid URL\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options\n         * - message: The error message\n         * - allowLocal: Allow the private and local network IP. Default to false\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // Credit to https://gist.github.com/dperini/729294\n            //\n            // Regular Expression for URL validation\n            //\n            // Author: Diego Perini\n            // Updated: 2010/12/05\n            //\n            // the regular expression composed & commented\n            // could be easily tweaked for RFC compliance,\n            // it was expressly modified to fit & satisfy\n            // these test for an URL shortener:\n            //\n            //   http://mathiasbynens.be/demo/url-regex\n            //\n            // Notes on possible differences from a standard/generic validation:\n            //\n            // - utf-8 char class take in consideration the full Unicode range\n            // - TLDs have been made mandatory so single names like \"localhost\" fails\n            // - protocols have been restricted to ftp, http and https only as requested\n            //\n            // Changes:\n            //\n            // - IP address dotted notation validation, range: 1.0.0.0 - 223.255.255.255\n            //   first and last IP address of each class is considered invalid\n            //   (since they are broadcast/network addresses)\n            //\n            // - Added exclusion of private, reserved and/or local networks ranges\n            //\n            var allowLocal = options.allowLocal === true || options.allowLocal === 'true',\n                urlExp     = new RegExp(\n                    \"^\" +\n                    // protocol identifier\n                    \"(?:(?:https?|ftp)://)\" +\n                    // user:pass authentication\n                    \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n                    \"(?:\" +\n                    // IP address exclusion\n                    // private & local networks\n                    (allowLocal\n                        ? ''\n                        : (\"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n                           \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n                           \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\")) +\n                    // IP address dotted notation octets\n                    // excludes loopback network 0.0.0.0\n                    // excludes reserved space >= 224.0.0.0\n                    // excludes network & broadcast addresses\n                    // (first & last IP address of each class)\n                    \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n                    \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n                    \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n                    \"|\" +\n                    // host name\n                    \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n                    // domain name\n                    \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]+-?)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n                    // TLD identifier\n                    \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\" +\n                    \")\" +\n                    // port number\n                    \"(?::\\\\d{2,5})?\" +\n                    // resource path\n                    \"(?:/[^\\\\s]*)?\" +\n                    \"$\", \"i\"\n                );\n\n            return urlExp.test(value);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.uuid = $.extend($.fn.bootstrapValidator.i18n.uuid || {}, {\n        'default': 'Please enter a valid UUID number',\n        version: 'Please enter a valid UUID version %s number'\n    });\n\n    $.fn.bootstrapValidator.validators.uuid = {\n        html5Attributes: {\n            message: 'message',\n            version: 'version'\n        },\n\n        /**\n         * Return true if and only if the input value is a valid UUID string\n         *\n         * @see http://en.wikipedia.org/wiki/Universally_unique_identifier\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - version: Can be 3, 4, 5, null\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // See the format at http://en.wikipedia.org/wiki/Universally_unique_identifier#Variants_and_versions\n            var patterns = {\n                    '3': /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,\n                    '4': /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n                    '5': /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,\n                    all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i\n                },\n                version = options.version ? (options.version + '') : 'all';\n            return {\n                valid: (null === patterns[version]) ? true : patterns[version].test(value),\n                message: options.version\n                            ? $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.uuid.version, options.version)\n                            : (options.message || $.fn.bootstrapValidator.i18n.uuid['default'])\n            };\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.vat = $.extend($.fn.bootstrapValidator.i18n.vat || {}, {\n        'default': 'Please enter a valid VAT number',\n        countryNotSupported: 'The country code %s is not supported',\n        country: 'Please enter a valid %s VAT number',\n        countries: {\n            AT: 'Austrian',\n            BE: 'Belgian',\n            BG: 'Bulgarian',\n            CH: 'Swiss',\n            CY: 'Cypriot',\n            CZ: 'Czech',\n            DE: 'German',\n            DK: 'Danish',\n            EE: 'Estonian',\n            ES: 'Spanish',\n            FI: 'Finnish',\n            FR: 'French',\n            GB: 'United Kingdom',\n            GR: 'Greek',\n            EL: 'Greek',\n            HU: 'Hungarian',\n            HR: 'Croatian',\n            IE: 'Irish',\n            IT: 'Italian',\n            LT: 'Lithuanian',\n            LU: 'Luxembourg',\n            LV: 'Latvian',\n            MT: 'Maltese',\n            NL: 'Dutch',\n            NO: 'Norwegian',\n            PL: 'Polish',\n            PT: 'Portuguese',\n            RO: 'Romanian',\n            RU: 'Russian',\n            RS: 'Serbian',\n            SE: 'Swedish',\n            SI: 'Slovenian',\n            SK: 'Slovak'\n        }\n    });\n\n    $.fn.bootstrapValidator.validators.vat = {\n        html5Attributes: {\n            message: 'message',\n            country: 'country'\n        },\n\n        // Supported country codes\n        COUNTRY_CODES: [\n            'AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'EL', 'HU', 'IE', 'IT',\n            'LV', 'LT', 'LU', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RU', 'RS', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB'\n        ],\n\n        /**\n         * Validate an European VAT number\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - country: The ISO 3166-1 country code. It can be\n         *      - One of country code defined in COUNTRY_CODES\n         *      - Name of field which its value defines the country code\n         *      - Name of callback function that returns the country code\n         *      - A callback function that returns the country code\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            var country = options.country;\n            if (!country) {\n                country = value.substr(0, 2);\n            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n                // Determine the country code\n                country = validator.getDynamicOption($field, country);\n            }\n\n            if ($.inArray(country, this.COUNTRY_CODES) === -1) {\n                return {\n                    valid: false,\n                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.vat.countryNotSupported, country)\n                };\n            }\n\n            var method  = ['_', country.toLowerCase()].join('');\n            return this[method](value)\n                ? true\n                : {\n                    valid: false,\n                    message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.vat.country, $.fn.bootstrapValidator.i18n.vat.countries[country.toUpperCase()])\n                };\n        },\n\n        // VAT validators\n\n        /**\n         * Validate Austrian VAT number\n         * Example:\n         * - Valid: ATU13585627\n         * - Invalid: ATU13585626\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _at: function(value) {\n            if (!/^ATU[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(3);\n            var sum    = 0,\n                weight = [1, 2, 1, 2, 1, 2, 1],\n                temp   = 0;\n\n            for (var i = 0; i < 7; i++) {\n                temp = parseInt(value.charAt(i), 10) * weight[i];\n                if (temp > 9) {\n                    temp = Math.floor(temp / 10) + temp % 10;\n                }\n                sum += temp;\n            }\n\n            sum = 10 - (sum + 4) % 10;\n            if (sum === 10) {\n                sum = 0;\n            }\n\n            return (sum + '' === value.substr(7, 1));\n        },\n\n        /**\n         * Validate Belgian VAT number\n         * Example:\n         * - Valid: BE0428759497\n         * - Invalid: BE431150351\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _be: function(value) {\n            if (!/^BE[0]{0,1}[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            if (value.length === 9) {\n                value = '0' + value;\n            }\n\n            if (value.substr(1, 1) === '0') {\n                return false;\n            }\n\n            var sum = parseInt(value.substr(0, 8), 10) + parseInt(value.substr(8, 2), 10);\n            return (sum % 97 === 0);\n        },\n\n        /**\n         * Validate Bulgarian VAT number\n         * Example:\n         * - Valid: BG175074752,\n         * BG7523169263, BG8032056031,\n         * BG7542011030,\n         * BG7111042925\n         * - Invalid: BG175074753, BG7552A10004, BG7111042922\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _bg: function(value) {\n            if (!/^BG[0-9]{9,10}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum = 0, i = 0;\n\n            // Legal entities\n            if (value.length === 9) {\n                for (i = 0; i < 8; i++) {\n                    sum += parseInt(value.charAt(i), 10) * (i + 1);\n                }\n                sum = sum % 11;\n                if (sum === 10) {\n                    sum = 0;\n                    for (i = 0; i < 8; i++) {\n                        sum += parseInt(value.charAt(i), 10) * (i + 3);\n                    }\n                }\n                sum = sum % 10;\n                return (sum + '' === value.substr(8));\n            }\n            // Physical persons, foreigners and others\n            else if (value.length === 10) {\n                // Validate Bulgarian national identification numbers\n                var egn = function(value) {\n                        // Check the birth date\n                        var year  = parseInt(value.substr(0, 2), 10) + 1900,\n                            month = parseInt(value.substr(2, 2), 10),\n                            day   = parseInt(value.substr(4, 2), 10);\n                        if (month > 40) {\n                            year += 100;\n                            month -= 40;\n                        } else if (month > 20) {\n                            year -= 100;\n                            month -= 20;\n                        }\n\n                        if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                            return false;\n                        }\n\n                        var sum    = 0,\n                            weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];\n                        for (var i = 0; i < 9; i++) {\n                            sum += parseInt(value.charAt(i), 10) * weight[i];\n                        }\n                        sum = (sum % 11) % 10;\n                        return (sum + '' === value.substr(9, 1));\n                    },\n                    // Validate Bulgarian personal number of a foreigner\n                    pnf = function(value) {\n                        var sum    = 0,\n                            weight = [21, 19, 17, 13, 11, 9, 7, 3, 1];\n                        for (var i = 0; i < 9; i++) {\n                            sum += parseInt(value.charAt(i), 10) * weight[i];\n                        }\n                        sum = sum % 10;\n                        return (sum + '' === value.substr(9, 1));\n                    },\n                    // Finally, consider it as a VAT number\n                    vat = function(value) {\n                        var sum    = 0,\n                            weight = [4, 3, 2, 7, 6, 5, 4, 3, 2];\n                        for (var i = 0; i < 9; i++) {\n                            sum += parseInt(value.charAt(i), 10) * weight[i];\n                        }\n                        sum = 11 - sum % 11;\n                        if (sum === 10) {\n                            return false;\n                        }\n                        if (sum === 11) {\n                            sum = 0;\n                        }\n                        return (sum + '' === value.substr(9, 1));\n                    };\n                return (egn(value) || pnf(value) || vat(value));\n            }\n\n            return false;\n        },\n\n        /**\n         * Validate Swiss VAT number\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _ch: function(value) {\n            if (!/^CHE[0-9]{9}(MWST)?$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(3);\n            var sum    = 0,\n                weight = [5, 4, 3, 2, 7, 6, 5, 4];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            sum = 11 - sum % 11;\n            if (sum === 10) {\n                return false;\n            }\n            if (sum === 11) {\n                sum = 0;\n            }\n\n            return (sum + '' === value.substr(8, 1));\n        },\n\n        /**\n         * Validate Cypriot VAT number\n         * Examples:\n         * - Valid: CY10259033P\n         * - Invalid: CY10259033Z\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _cy: function(value) {\n            if (!/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n\n            // Do not allow to start with \"12\"\n            if (value.substr(0, 2) === '12') {\n                return false;\n            }\n\n            // Extract the next digit and multiply by the counter.\n            var sum         = 0,\n                translation = {\n                    '0': 1,  '1': 0,  '2': 5,  '3': 7,  '4': 9,\n                    '5': 13, '6': 15, '7': 17, '8': 19, '9': 21\n                };\n            for (var i = 0; i < 8; i++) {\n                var temp = parseInt(value.charAt(i), 10);\n                if (i % 2 === 0) {\n                    temp = translation[temp + ''];\n                }\n                sum += temp;\n            }\n\n            sum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[sum % 26];\n            return (sum + '' === value.substr(8, 1));\n        },\n\n        /**\n         * Validate Czech Republic VAT number\n         * Can be:\n         * i) Legal entities (8 digit numbers)\n         * ii) Individuals with a RC (the 9 or 10 digit Czech birth number)\n         * iii) Individuals without a RC (9 digit numbers beginning with 6)\n         *\n         * Examples:\n         * - Valid: i) CZ25123891; ii) CZ7103192745, CZ991231123; iii) CZ640903926\n         * - Invalid: i) CZ25123890; ii) CZ1103492745, CZ590312123\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _cz: function(value) {\n            if (!/^CZ[0-9]{8,10}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n\n            var sum = 0,\n                i   = 0;\n            if (value.length === 8) {\n                // Do not allow to start with '9'\n                if (value.charAt(0) + '' === '9') {\n                    return false;\n                }\n\n                sum = 0;\n                for (i = 0; i < 7; i++) {\n                    sum += parseInt(value.charAt(i), 10) * (8 - i);\n                }\n                sum = 11 - sum % 11;\n                if (sum === 10) {\n                    sum = 0;\n                }\n                if (sum === 11) {\n                    sum = 1;\n                }\n\n                return (sum + '' === value.substr(7, 1));\n            } else if (value.length === 9 && (value.charAt(0) + '' === '6')) {\n                sum = 0;\n                // Skip the first (which is 6)\n                for (i = 0; i < 7; i++) {\n                    sum += parseInt(value.charAt(i + 1), 10) * (8 - i);\n                }\n                sum = 11 - sum % 11;\n                if (sum === 10) {\n                    sum = 0;\n                }\n                if (sum === 11) {\n                    sum = 1;\n                }\n                sum = [8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 10][sum - 1];\n                return (sum + '' === value.substr(8, 1));\n            } else if (value.length === 9 || value.length === 10) {\n                // Validate Czech birth number (Rodné číslo), which is also national identifier\n                var year  = 1900 + parseInt(value.substr(0, 2), 10),\n                    month = parseInt(value.substr(2, 2), 10) % 50 % 20,\n                    day   = parseInt(value.substr(4, 2), 10);\n                if (value.length === 9) {\n                    if (year >= 1980) {\n                        year -= 100;\n                    }\n                    if (year > 1953) {\n                        return false;\n                    }\n                } else if (year < 1954) {\n                    year += 100;\n                }\n\n                if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                    return false;\n                }\n\n                // Check that the birth date is not in the future\n                if (value.length === 10) {\n                    var check = parseInt(value.substr(0, 9), 10) % 11;\n                    if (year < 1985) {\n                        check = check % 10;\n                    }\n                    return (check + '' === value.substr(9, 1));\n                }\n\n                return true;\n            }\n\n            return false;\n        },\n\n        /**\n         * Validate German VAT number\n         * Examples:\n         * - Valid: DE136695976\n         * - Invalid: DE136695978\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _de: function(value) {\n            if (!/^DE[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            return $.fn.bootstrapValidator.helpers.mod11And10(value);\n        },\n\n        /**\n         * Validate Danish VAT number\n         * Example:\n         * - Valid: DK13585628\n         * - Invalid: DK13585627\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _dk: function(value) {\n            if (!/^DK[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [2, 7, 6, 5, 4, 3, 2, 1];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            return (sum % 11 === 0);\n        },\n\n        /**\n         * Validate Estonian VAT number\n         * Examples:\n         * - Valid: EE100931558, EE100594102\n         * - Invalid: EE100594103\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _ee: function(value) {\n            if (!/^EE[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [3, 7, 1, 3, 7, 1, 3, 7, 1];\n\n            for (var i = 0; i < 9; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            return (sum % 10 === 0);\n        },\n\n        /**\n         * Validate Spanish VAT number (NIF - Número de Identificación Fiscal)\n         * Can be:\n         * i) DNI (Documento nacional de identidad), for Spaniards\n         * ii) NIE (Número de Identificación de Extranjeros), for foreigners\n         * iii) CIF (Certificado de Identificación Fiscal), for legal entities and others\n         *\n         * Examples:\n         * - Valid: i) ES54362315K; ii) ESX2482300W, ESX5253868R; iii) ESM1234567L, ESJ99216582, ESB58378431, ESB64717838\n         * - Invalid: i) ES54362315Z; ii) ESX2482300A; iii) ESJ99216583\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _es: function(value) {\n            if (!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var dni = function(value) {\n                    var check = parseInt(value.substr(0, 8), 10);\n                    check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n                    return (check + '' === value.substr(8, 1));\n                },\n                nie = function(value) {\n                    var check = ['XYZ'.indexOf(value.charAt(0)), value.substr(1)].join('');\n                    check = parseInt(check, 10);\n                    check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n                    return (check + '' === value.substr(8, 1));\n                },\n                cif = function(value) {\n                    var first = value.charAt(0), check;\n                    if ('KLM'.indexOf(first) !== -1) {\n                        // K: Spanish younger than 14 year old\n                        // L: Spanish living outside Spain without DNI\n                        // M: Granted the tax to foreigners who have no NIE\n                        check = parseInt(value.substr(1, 8), 10);\n                        check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];\n                        return (check + '' === value.substr(8, 1));\n                    } else if ('ABCDEFGHJNPQRSUVW'.indexOf(first) !== -1) {\n                        var sum    = 0,\n                            weight = [2, 1, 2, 1, 2, 1, 2],\n                            temp   = 0;\n\n                        for (var i = 0; i < 7; i++) {\n                            temp = parseInt(value.charAt(i + 1), 10) * weight[i];\n                            if (temp > 9) {\n                                temp = Math.floor(temp / 10) + temp % 10;\n                            }\n                            sum += temp;\n                        }\n                        sum = 10 - sum % 10;\n                        return (sum + '' === value.substr(8, 1) || 'JABCDEFGHI'[sum] === value.substr(8, 1));\n                    }\n\n                    return false;\n                };\n\n            var first = value.charAt(0);\n            if (/^[0-9]$/.test(first)) {\n                return dni(value);\n            } else if (/^[XYZ]$/.test(first)) {\n                return nie(value);\n            } else {\n                return cif(value);\n            }\n        },\n\n        /**\n         * Validate Finnish VAT number\n         * Examples:\n         * - Valid: FI20774740\n         * - Invalid: FI20774741\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _fi: function(value) {\n            if (!/^FI[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [7, 9, 10, 5, 8, 4, 2, 1];\n\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            return (sum % 11 === 0);\n        },\n\n        /**\n         * Validate French VAT number (TVA - taxe sur la valeur ajoutée)\n         * It's constructed by a SIREN number, prefixed by two characters.\n         *\n         * Examples:\n         * - Valid: FR40303265045, FR23334175221, FRK7399859412, FR4Z123456782\n         * - Invalid: FR84323140391\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _fr: function(value) {\n            if (!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n\n\t\t\tif (!$.fn.bootstrapValidator.helpers.luhn(value.substr(2))) {\n                return false;\n            }\n\n            if (/^[0-9]{2}$/.test(value.substr(0, 2))) {\n                // First two characters are digits\n                return value.substr(0, 2) === (parseInt(value.substr(2) + '12', 10) % 97 + '');\n            } else {\n                // The first characters cann't be O and I\n                var alphabet = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ',\n                    check;\n                // First one is digit\n                if (/^[0-9]{1}$/.test(value.charAt(0))) {\n                    check = alphabet.indexOf(value.charAt(0)) * 24 + alphabet.indexOf(value.charAt(1)) - 10;\n                } else {\n                    check = alphabet.indexOf(value.charAt(0)) * 34 + alphabet.indexOf(value.charAt(1)) - 100;\n                }\n                return ((parseInt(value.substr(2), 10) + 1 + Math.floor(check / 11)) % 11) === (check % 11);\n            }\n        },\n\n        /**\n         * Validate United Kingdom VAT number\n         * Example:\n         * - Valid: GB980780684\n         * - Invalid: GB802311781\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _gb: function(value) {\n            if (!/^GB[0-9]{9}$/.test(value)             /* Standard */\n                && !/^GB[0-9]{12}$/.test(value)         /* Branches */\n                && !/^GBGD[0-9]{3}$/.test(value)        /* Government department */\n                && !/^GBHA[0-9]{3}$/.test(value)        /* Health authority */\n                && !/^GB(GD|HA)8888[0-9]{5}$/.test(value))\n            {\n                return false;\n            }\n\n            value = value.substr(2);\n            var length = value.length;\n            if (length === 5) {\n                var firstTwo  = value.substr(0, 2),\n                    lastThree = parseInt(value.substr(2), 10);\n                return ('GD' === firstTwo && lastThree < 500) || ('HA' === firstTwo && lastThree >= 500);\n            } else if (length === 11 && ('GD8888' === value.substr(0, 6) || 'HA8888' === value.substr(0, 6))) {\n                if (('GD' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) >= 500)\n                    || ('HA' === value.substr(0, 2) && parseInt(value.substr(6, 3), 10) < 500))\n                {\n                    return false;\n                }\n                return (parseInt(value.substr(6, 3), 10) % 97 === parseInt(value.substr(9, 2), 10));\n            } else if (length === 9 || length === 12) {\n                var sum    = 0,\n                    weight = [8, 7, 6, 5, 4, 3, 2, 10, 1];\n                for (var i = 0; i < 9; i++) {\n                    sum += parseInt(value.charAt(i), 10) * weight[i];\n                }\n                sum = sum % 97;\n\n                if (parseInt(value.substr(0, 3), 10) >= 100) {\n                    return (sum === 0 || sum === 42 || sum === 55);\n                } else {\n                    return (sum === 0);\n                }\n            }\n\n            return true;\n        },\n\n        /**\n         * Validate Greek VAT number\n         * Examples:\n         * - Valid: GR023456780, EL094259216\n         * - Invalid: EL123456781\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _gr: function(value) {\n            if (!/^GR[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            if (value.length === 8) {\n                value = '0' + value;\n            }\n\n            var sum    = 0,\n                weight = [256, 128, 64, 32, 16, 8, 4, 2];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = (sum % 11) % 10;\n\n            return (sum + '' === value.substr(8, 1));\n        },\n\n        // EL is traditionally prefix of Greek VAT numbers\n        _el: function(value) {\n            if (!/^EL[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = 'GR' + value.substr(2);\n            return this._gr(value);\n        },\n\n        /**\n         * Validate Hungarian VAT number\n         * Examples:\n         * - Valid: HU12892312\n         * - Invalid: HU12892313\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _hu: function(value) {\n            if (!/^HU[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [9, 7, 3, 1, 9, 7, 3, 1];\n\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            return (sum % 10 === 0);\n        },\n\n        /**\n         * Validate Croatian VAT number\n         * Examples:\n         * - Valid: HR33392005961\n         * - Invalid: HR33392005962\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _hr: function(value) {\n            if (!/^HR[0-9]{11}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            return $.fn.bootstrapValidator.helpers.mod11And10(value);\n        },\n\n        /**\n         * Validate Irish VAT number\n         * Examples:\n         * - Valid: IE6433435F, IE6433435OA, IE8D79739I\n         * - Invalid: IE8D79738J\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _ie: function(value) {\n            if (!/^IE[0-9]{1}[0-9A-Z\\*\\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var getCheckDigit = function(value) {\n                while (value.length < 7) {\n                    value = '0' + value;\n                }\n                var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',\n                    sum      = 0;\n                for (var i = 0; i < 7; i++) {\n                    sum += parseInt(value.charAt(i), 10) * (8 - i);\n                }\n                sum += 9 * alphabet.indexOf(value.substr(7));\n                return alphabet[sum % 23];\n            };\n\n            // The first 7 characters are digits\n            if (/^[0-9]+$/.test(value.substr(0, 7))) {\n                // New system\n                return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');\n            } else if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ+*'.indexOf(value.charAt(1)) !== -1) {\n                // Old system\n                return value.charAt(7) === getCheckDigit(value.substr(2, 5) + value.substr(0, 1) + '');\n            }\n\n            return true;\n        },\n\n        /**\n         * Validate Italian VAT number, which consists of 11 digits.\n         * - First 7 digits are a company identifier\n         * - Next 3 are the province of residence\n         * - The last one is a check digit\n         *\n         * Examples:\n         * - Valid: IT00743110157\n         * - Invalid: IT00743110158\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _it: function(value) {\n            if (!/^IT[0-9]{11}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            if (parseInt(value.substr(0, 7), 10) === 0) {\n                return false;\n            }\n\n            var lastThree = parseInt(value.substr(7, 3), 10);\n            if ((lastThree < 1) || (lastThree > 201) && lastThree !== 999 && lastThree !== 888) {\n                return false;\n            }\n\n            return $.fn.bootstrapValidator.helpers.luhn(value);\n        },\n\n        /**\n         * Validate Lithuanian VAT number\n         * It can be:\n         * - 9 digits, for legal entities\n         * - 12 digits, for temporarily registered taxpayers\n         *\n         * Examples:\n         * - Valid: LT119511515, LT100001919017, LT100004801610\n         * - Invalid: LT100001919018\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _lt: function(value) {\n            if (!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var length = value.length,\n                sum    = 0,\n                i;\n            for (i = 0; i < length - 1; i++) {\n                sum += parseInt(value.charAt(i), 10) * (1 + i % 9);\n            }\n            var check = sum % 11;\n            if (check === 10) {\n                sum = 0;\n                for (i = 0; i < length - 1; i++) {\n                    sum += parseInt(value.charAt(i), 10) * (1 + (i + 2) % 9);\n                }\n            }\n            check = check % 11 % 10;\n            return (check + '' === value.charAt(length - 1));\n        },\n\n        /**\n         * Validate Luxembourg VAT number\n         * Examples:\n         * - Valid: LU15027442\n         * - Invalid: LU15027443\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _lu: function(value) {\n            if (!/^LU[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            return ((parseInt(value.substr(0, 6), 10) % 89) + '' === value.substr(6, 2));\n        },\n\n        /**\n         * Validate Latvian VAT number\n         * Examples:\n         * - Valid: LV40003521600, LV16117519997\n         * - Invalid: LV40003521601, LV16137519997\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _lv: function(value) {\n            if (!/^LV[0-9]{11}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var first  = parseInt(value.charAt(0), 10),\n                sum    = 0,\n                weight = [],\n                i,\n                length = value.length;\n            if (first > 3) {\n                // Legal entity\n                sum    = 0;\n                weight = [9, 1, 4, 8, 3, 10, 2, 5, 7, 6, 1];\n                for (i = 0; i < length; i++) {\n                    sum += parseInt(value.charAt(i), 10) * weight[i];\n                }\n                sum = sum % 11;\n                return (sum === 3);\n            } else {\n                // Check birth date\n                var day   = parseInt(value.substr(0, 2), 10),\n                    month = parseInt(value.substr(2, 2), 10),\n                    year  = parseInt(value.substr(4, 2), 10);\n                year = year + 1800 + parseInt(value.charAt(6), 10) * 100;\n\n                if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {\n                    return false;\n                }\n\n                // Check personal code\n                sum    = 0;\n                weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];\n                for (i = 0; i < length - 1; i++) {\n                    sum += parseInt(value.charAt(i), 10) * weight[i];\n                }\n                sum = (sum + 1) % 11 % 10;\n                return (sum + '' === value.charAt(length - 1));\n            }\n        },\n\n        /**\n         * Validate Maltese VAT number\n         * Examples:\n         * - Valid: MT11679112\n         * - Invalid: MT11679113\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _mt: function(value) {\n            if (!/^MT[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [3, 4, 6, 7, 8, 9, 10, 1];\n\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            return (sum % 37 === 0);\n        },\n\n        /**\n         * Validate Dutch VAT number\n         * Examples:\n         * - Valid: NL004495445B01\n         * - Invalid: NL123456789B90\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _nl: function(value) {\n            if (!/^NL[0-9]{9}B[0-9]{2}$/.test(value)) {\n               return false;\n            }\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [9, 8, 7, 6, 5, 4, 3, 2];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            sum = sum % 11;\n            if (sum > 9) {\n                sum = 0;\n            }\n            return (sum + '' === value.substr(8, 1));\n        },\n\n        /**\n         * Validate Norwegian VAT number\n         *\n         * @see http://www.brreg.no/english/coordination/number.html\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _no: function(value) {\n            if (!/^NO[0-9]{9}$/.test(value)) {\n               return false;\n            }\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [3, 2, 7, 6, 5, 4, 3, 2];\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            sum = 11 - sum % 11;\n            if (sum === 11) {\n                sum = 0;\n            }\n            return (sum + '' === value.substr(8, 1));\n        },\n\n        /**\n         * Validate Polish VAT number\n         * Examples:\n         * - Valid: PL8567346215\n         * - Invalid: PL8567346216\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _pl: function(value) {\n            if (!/^PL[0-9]{10}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [6, 5, 7, 2, 3, 4, 5, 6, 7, -1];\n\n            for (var i = 0; i < 10; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            return (sum % 11 === 0);\n        },\n\n        /**\n         * Validate Portuguese VAT number\n         * Examples:\n         * - Valid: PT501964843\n         * - Invalid: PT501964842\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _pt: function(value) {\n            if (!/^PT[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [9, 8, 7, 6, 5, 4, 3, 2];\n\n            for (var i = 0; i < 8; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = 11 - sum % 11;\n            if (sum > 9) {\n                sum = 0;\n            }\n            return (sum + '' === value.substr(8, 1));\n        },\n\n        /**\n         * Validate Romanian VAT number\n         * Examples:\n         * - Valid: RO18547290\n         * - Invalid: RO18547291\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _ro: function(value) {\n            if (!/^RO[1-9][0-9]{1,9}$/.test(value)) {\n                return false;\n            }\n            value = value.substr(2);\n\n            var length = value.length,\n                weight = [7, 5, 3, 2, 1, 7, 5, 3, 2].slice(10 - length),\n                sum    = 0;\n            for (var i = 0; i < length - 1; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n\n            sum = (10 * sum) % 11 % 10;\n            return (sum + '' === value.substr(length - 1, 1));\n        },\n\n        /**\n         * Validate Russian VAT number (Taxpayer Identification Number - INN)\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _ru: function(value) {\n            if (!/^RU([0-9]{9}|[0-9]{12})$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var i = 0;\n            if (value.length === 10) {\n                var sum    = 0,\n                    weight = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0];\n                for (i = 0; i < 10; i++) {\n                    sum += parseInt(value.charAt(i), 10) * weight[i];\n                }\n                sum = sum % 11;\n                if (sum > 9) {\n                    sum = sum % 10;\n                }\n\n                return (sum + '' === value.substr(9, 1));\n            } else if (value.length === 12) {\n                var sum1    = 0,\n                    weight1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0],\n                    sum2    = 0,\n                    weight2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];\n\n                for (i = 0; i < 11; i++) {\n                    sum1 += parseInt(value.charAt(i), 10) * weight1[i];\n                    sum2 += parseInt(value.charAt(i), 10) * weight2[i];\n                }\n                sum1 = sum1 % 11;\n                if (sum1 > 9) {\n                    sum1 = sum1 % 10;\n                }\n                sum2 = sum2 % 11;\n                if (sum2 > 9) {\n                    sum2 = sum2 % 10;\n                }\n\n                return (sum1 + '' === value.substr(10, 1) && sum2 + '' === value.substr(11, 1));\n            }\n\n            return false;\n        },\n\n        /**\n         * Validate Serbian VAT number\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _rs: function(value) {\n            if (!/^RS[0-9]{9}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum  = 10,\n                temp = 0;\n            for (var i = 0; i < 8; i++) {\n                temp = (parseInt(value.charAt(i), 10) + sum) % 10;\n                if (temp === 0) {\n                    temp = 10;\n                }\n                sum = (2 * temp) % 11;\n            }\n\n            return ((sum + parseInt(value.substr(8, 1), 10)) % 10 === 1);\n        },\n\n        /**\n         * Validate Swedish VAT number\n         * Examples:\n         * - Valid: SE123456789701\n         * - Invalid: SE123456789101\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _se: function(value) {\n            if (!/^SE[0-9]{10}01$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2, 10);\n            return $.fn.bootstrapValidator.helpers.luhn(value);\n        },\n\n        /**\n         * Validate Slovenian VAT number\n         * Examples:\n         * - Valid: SI50223054\n         * - Invalid: SI50223055\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _si: function(value) {\n            if (!/^SI[0-9]{8}$/.test(value)) {\n                return false;\n            }\n\n            value = value.substr(2);\n            var sum    = 0,\n                weight = [8, 7, 6, 5, 4, 3, 2];\n\n            for (var i = 0; i < 7; i++) {\n                sum += parseInt(value.charAt(i), 10) * weight[i];\n            }\n            sum = 11 - sum % 11;\n            if (sum === 10) {\n                sum = 0;\n            }\n            return (sum + '' === value.substr(7, 1));\n        },\n\n        /**\n         * Validate Slovak VAT number\n         * Examples:\n         * - Valid: SK2022749619\n         * - Invalid: SK2022749618\n         *\n         * @param {String} value VAT number\n         * @returns {Boolean}\n         */\n        _sk: function(value) {\n            if (!/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(value)) {\n                return false;\n            }\n\n            return (parseInt(value.substr(2), 10) % 11 === 0);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.vin = $.extend($.fn.bootstrapValidator.i18n.vin || {}, {\n        'default': 'Please enter a valid VIN number'\n    });\n\n    $.fn.bootstrapValidator.validators.vin = {\n        /**\n         * Validate an US VIN (Vehicle Identification Number)\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * @returns {Boolean}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '') {\n                return true;\n            }\n\n            // Don't accept I, O, Q characters\n            if (!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(value)) {\n                return false;\n            }\n\n            value = value.toUpperCase();\n            var chars   = {\n                    A: 1,   B: 2,   C: 3,   D: 4,   E: 5,   F: 6,   G: 7,   H: 8,\n                    J: 1,   K: 2,   L: 3,   M: 4,   N: 5,           P: 7,           R: 9,\n                            S: 2,   T: 3,   U: 4,   V: 5,   W: 6,   X: 7,   Y: 8,   Z: 9,\n                    '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '0': 0\n                },\n                weights = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2],\n                sum     = 0,\n                length  = value.length;\n            for (var i = 0; i < length; i++) {\n                sum += chars[value.charAt(i) + ''] * weights[i];\n            }\n\n            var reminder = sum % 11;\n            if (reminder === 10) {\n                reminder = 'X';\n            }\n\n            return (reminder + '') === value.charAt(8);\n        }\n    };\n}(window.jQuery));\n;(function($) {\n    $.fn.bootstrapValidator.i18n.zipCode = $.extend($.fn.bootstrapValidator.i18n.zipCode || {}, {\n        'default': 'Please enter a valid zip code',\n        countryNotSupported: 'The country code %s is not supported',\n        country: 'Please enter a valid %s',\n        countries: {\n            'CA': 'Canadian postal code',\n            'DK': 'Danish postal code',\n            'GB': 'United Kingdom postal code',\n            'IT': 'Italian postal code',\n            'NL': 'Dutch postal code',\n            'SE': 'Swiss postal code',\n            'SG': 'Singapore postal code',\n            'US': 'US zip code'\n        }\n    });\n\n    $.fn.bootstrapValidator.validators.zipCode = {\n        html5Attributes: {\n            message: 'message',\n            country: 'country'\n        },\n\n        COUNTRY_CODES: ['CA', 'DK', 'GB', 'IT', 'NL', 'SE', 'SG', 'US'],\n\n        /**\n         * Return true if and only if the input value is a valid country zip code\n         *\n         * @param {BootstrapValidator} validator The validator plugin instance\n         * @param {jQuery} $field Field element\n         * @param {Object} options Consist of key:\n         * - message: The invalid message\n         * - country: The country\n         *\n         * The country can be defined by:\n         * - An ISO 3166 country code\n         * Currently it supports the following countries:\n         *      - US (United States)\n         *      - CA (Canada)\n         *      - DK (Denmark)\n         *      - GB (United Kingdom)\n         *      - IT (Italy)\n         *      - NL (Netherlands)\n         *      - SE (Sweden)\n         *      - SG (Singapore)\n         *\n         * - Name of field which its value defines the country code\n         * - Name of callback function that returns the country code\n         * - A callback function that returns the country code\n         *\n         * callback: function(value, validator, $field) {\n         *      // value is the value of field\n         *      // validator is the BootstrapValidator instance\n         *      // $field is jQuery element representing the field\n         * }\n         *\n         * @returns {Boolean|Object}\n         */\n        validate: function(validator, $field, options) {\n            var value = $field.val();\n            if (value === '' || !options.country) {\n                return true;\n            }\n\n            var country = options.country;\n            if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {\n                // Try to determine the country\n                country = validator.getDynamicOption($field, country);\n            }\n\n            if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {\n                return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.zipCode.countryNotSupported, country) };\n            }\n\n            var isValid = false;\n            country = country.toUpperCase();\n            switch (country) {\n                case 'CA':\n                    isValid = /^(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}\\s?[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}[0-9]{1}$/i.test(value);\n                    break;\n\n                case 'DK':\n                    isValid = /^(DK(-|\\s)?)?\\d{4}$/i.test(value);\n                    break;\n\n                case 'GB':\n                    isValid = this._gb(value);\n                    break;\n\n                // http://en.wikipedia.org/wiki/List_of_postal_codes_in_Italy\n                case 'IT':\n                    isValid = /^(I-|IT-)?\\d{5}$/i.test(value);\n                    break;\n\n                // http://en.wikipedia.org/wiki/Postal_codes_in_the_Netherlands\n                case 'NL':\n                    isValid = /^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i.test(value);\n                    break;\n\n                case 'SE':\n                    isValid = /^(S-)?\\d{3}\\s?\\d{2}$/i.test(value);\n                    break;\n\n                case 'SG':\n                    isValid = /^([0][1-9]|[1-6][0-9]|[7]([0-3]|[5-9])|[8][0-2])(\\d{4})$/i.test(value);\n                    break;\n\n                case 'US':\n                /* falls through */\n                default:\n                    isValid = /^\\d{4,5}([\\-]?\\d{4})?$/.test(value);\n                    break;\n            }\n\n            return {\n                valid: isValid,\n                message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.zipCode.country, $.fn.bootstrapValidator.i18n.zipCode.countries[country])\n            };\n        },\n\n        /**\n         * Validate United Kingdom postcode\n         * Examples:\n         * - Standard: EC1A 1BB, W1A 1HQ, M1 1AA, B33 8TH, CR2 6XH, DN55 1PT\n         * - Special cases:\n         * AI-2640, ASCN 1ZZ, GIR 0AA\n         *\n         * @see http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom\n         * @param {String} value The postcode\n         * @returns {Boolean}\n         */\n        _gb: function(value) {\n            var firstChar  = '[ABCDEFGHIJKLMNOPRSTUWYZ]',     // Does not accept QVX\n                secondChar = '[ABCDEFGHKLMNOPQRSTUVWXY]',     // Does not accept IJZ\n                thirdChar  = '[ABCDEFGHJKPMNRSTUVWXY]',\n                fourthChar = '[ABEHMNPRVWXY]',\n                fifthChar  = '[ABDEFGHJLNPQRSTUWXYZ]',\n                regexps    = [\n                    // AN NAA, ANN NAA, AAN NAA, AANN NAA format\n                    new RegExp('^(' + firstChar + '{1}' + secondChar + '?[0-9]{1,2})(\\\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),\n                    // ANA NAA\n                    new RegExp('^(' + firstChar + '{1}[0-9]{1}' + thirdChar + '{1})(\\\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),\n                    // AANA NAA\n                    new RegExp('^(' + firstChar + '{1}' + secondChar + '{1}?[0-9]{1}' + fourthChar + '{1})(\\\\s*)([0-9]{1}' + fifthChar + '{2})$', 'i'),\n\n                    new RegExp('^(BF1)(\\\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$', 'i'),        // BFPO postcodes\n                    /^(GIR)(\\s*)(0AA)$/i,                       // Special postcode GIR 0AA\n                    /^(BFPO)(\\s*)([0-9]{1,4})$/i,               // Standard BFPO numbers\n                    /^(BFPO)(\\s*)(c\\/o\\s*[0-9]{1,3})$/i,        // c/o BFPO numbers\n                    /^([A-Z]{4})(\\s*)(1ZZ)$/i,                  // Overseas Territories\n                    /^(AI-2640)$/i                              // Anguilla\n                ];\n            for (var i = 0; i < regexps.length; i++) {\n                if (regexps[i].test(value)) {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    };\n}(window.jQuery));\n"
  },
  {
    "path": "server/static/lib/jquery.mloading.js",
    "content": "/* Author：mingyuhisoft@163.com\n * Github:https://github.com/imingyu/jquery.mloading\n * Npm:npm install jquery.mloading.js\n * Date：2016-7-4\n */\n\n;(function (root, factory) {\n    'use strict';\n\n    if (typeof module === 'object' && typeof module.exports === 'object') {\n        factory(require('jquery'),root);\n    } if(typeof define ===\"function\"){\n        if(define.cmd){\n            define(function(require, exports, module){\n                var $ = require(\"jquery\");\n                factory($,root);\n            });\n        }else{\n            define([\"jquery\"],function($){\n                factory($,root);\n            });\n        }\n    }else {\n        factory(root.jQuery,root);\n    }\n} (typeof window !==\"undefined\" ? window : this, function ($, root, undefined) {\n    'use strict';\n    if(!$){\n        $ = root.jQuery || null;\n    }\n    if(!$){\n        throw new TypeError(\"必须引入jquery库方可正常使用！\");\n    }\n\n    var arraySlice = Array.prototype.slice,\n        comparison=function (obj1,obj2) {\n            var result=true;\n            for(var pro in obj1){\n                if(obj1[pro] !== obj2[obj1]){\n                    result=true;\n                    break;\n                }\n            }\n            return result;\n        }\n\n    function MLoading(dom,options) {\n        options=options||{};\n        this.dom=dom;\n        this.options=$.extend(true,{},MLoading.defaultOptions,options);\n        this.curtain=null;\n        this.render().show();\n    }\n    MLoading.prototype={\n        constructor:MLoading,\n        initElement:function () {\n            var dom=this.dom,\n                ops=this.options;\n            var curtainElement=dom.children(\".mloading\"),\n                bodyElement = curtainElement.children('.mloading-body'),\n                barElement = bodyElement.children('.mloading-bar'),\n                iconElement = barElement.children('.mloading-icon'),\n                textElement = barElement.find(\".mloading-text\");\n            if (curtainElement.length == 0) {\n                curtainElement = $('<div class=\"mloading\"></div>');\n                dom.append(curtainElement);\n            }\n            if (bodyElement.length == 0) {\n                bodyElement = $('<div class=\"mloading-body\"></div>');\n                curtainElement.append(bodyElement);\n            }\n            if (barElement.length == 0) {\n                barElement = $('<div class=\"mloading-bar\"></div>');\n                bodyElement.append(barElement);\n            }\n            if (iconElement.length == 0) {\n                var _iconElement=document.createElement(ops.iconTag);\n                iconElement = $(_iconElement);\n                iconElement.addClass(\"mloading-icon\");\n                barElement.append(iconElement);\n            }\n            if (textElement.length == 0) {\n                textElement = $('<span class=\"mloading-text\"></span>');\n                barElement.append(textElement);\n            }\n\n            this.curtainElement=curtainElement;\n            this.bodyElement = bodyElement;\n            this.barElement = barElement;\n            this.iconElement = iconElement;\n            this.textElement = textElement;\n            return this;\n        },\n        render:function () {\n            var dom=this.dom,\n                ops=this.options;\n            this.initElement();\n            if(dom.is(\"html\") || dom.is(\"body\")){\n                this.curtainElement.addClass(\"mloading-full\");\n            }else{\n                this.curtainElement.removeClass(\"mloading-full\");\n\n                if(!dom.hasClass(\"mloading-container\")){\n                    dom.addClass(\"mloading-container\");\n                }\n            }\n            if(ops.mask){\n                this.curtainElement.addClass(\"mloading-mask\");\n            }else{\n                this.curtainElement.removeClass(\"mloading-mask\");\n            }\n            if(ops.content!=\"\" && typeof ops.content!=\"undefined\"){\n                if(ops.html){\n                    this.bodyElement.html(ops.content);\n                }else{\n                    this.bodyElement.text(ops.content);\n                }\n            }else{\n                this.iconElement.attr(\"src\",ops.icon);\n                if(ops.html){\n                    this.textElement.html(ops.text);\n                }else{\n                    this.textElement.text(ops.text);\n                }\n            }\n\n            return this;\n        },\n        setOptions:function (options) {\n            options=options||{};\n            var oldOptions = this.options;\n            this.options = $.extend(true,{},this.options,options);\n            if(!comparison(oldOptions,this.options)) this.render();\n        },\n        show:function () {\n            var dom=this.dom,\n                ops=this.options,\n                barElement=this.barElement;\n            this.curtainElement.addClass(\"active\");\n            barElement.css({\n                \"marginTop\":\"-\"+barElement.outerHeight()/2+\"px\",\n                \"marginLeft\":\"-\"+barElement.outerWidth()/2+\"px\"\n            });\n\n            return this;\n        },\n        hide:function () {\n            var dom=this.dom,\n                ops=this.options;\n            this.curtainElement.removeClass(\"active\");\n            if(!dom.is(\"html\") && !dom.is(\"body\")){\n                dom.removeClass(\"mloading-container\");\n            }\n            return this;\n        },\n        destroy:function () {\n            var dom=this.dom,\n                ops=this.options;\n            this.curtainElement.remove();\n            if(!dom.is(\"html\") && !dom.is(\"body\")){\n                dom.removeClass(\"mloading-container\");\n            }\n            dom.removeData(MLoading.dataKey);\n            return this;\n        }\n    };\n    MLoading.dataKey=\"MLoading\";\n    MLoading.defaultOptions = {\n        text:\"加载中...\",\n        iconTag:\"img\",\n        icon:\"data:image/gif;base64,R0lGODlhDwAPAKUAAEQ+PKSmpHx6fNTW1FxaXOzu7ExOTIyOjGRmZMTCxPz6/ERGROTi5Pz29JyanGxubMzKzIyKjGReXPT29FxWVGxmZExGROzq7ERCRLy6vISChNze3FxeXPTy9FROTJSSlMTGxPz+/OTm5JyenNTOzGxqbExKTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBgAhACwAAAAADwAPAAAGd8CQcEgsChuTZMNIDFgsC1Nn9GEwDwDAoqMBWEDFiweA2YoiZevwA9BkDAUhW0MkADYhiEJYwJj2QhYGTBwAE0MUGGp5IR1+RBEAEUMVDg4AAkQMJhgfFyEIWRgDRSALABKgWQ+HRQwaCCEVC7R0TEITHbmtt0xBACH5BAkGACYALAAAAAAPAA8AhUQ+PKSmpHRydNTW1FxWVOzu7MTCxIyKjExKTOTi5LSytHx+fPz6/ERGROTe3GxqbNTS1JyWlFRSVKympNze3FxeXPT29MzKzFROTOzq7ISGhERCRHx6fNza3FxaXPTy9MTGxJSSlExOTOTm5LS2tISChPz+/ExGRJyenKyqrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ6QJNQeIkUhsjkp+EhMZLITKgBAGigQgiiCtiAKJdkBgNYgDYLhmDjQIbKwgfF9C4hPYC5KSMsbBBIJyJYFQAWQwQbI0J8Jh8nDUgHAAcmDA+LKAAcSAkIEhYTAAEoGxsdSSAKIyJcGyRYJiQbVRwDsVkPXrhDDCQBSUEAIfkECQYAEAAsAAAAAA8ADwCFRD48pKKkdHZ01NLUXFpc7OrsTE5MlJKU9Pb03N7cREZExMbEhIKEbGpsXFZUVFZU/P78tLa0fH583NrcZGJk9PL0VE5MnJ6c/Pb05ObkTEZEREJErKqsfHp81NbUXF5c7O7slJaU5OLkzMrMjIaEdG5sVFJU/Pr8TEpMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABndAiHA4DICISCIllBQWQgSNY6NJJAcoAMCw0XaQBQtAYj0ANgcE0SwZlgSe04hI2FiFAyEFRdQYmh8AakIOJhgQHhVCFQoaRAsVGSQWihAXAF9EHFkNEBUXGxsTSBxaGx9dGxFJGKgKAAoSEydNIwoFg01DF7oQQQAh+QQJBgAYACwAAAAADwAPAIVEPjykoqR0cnTU0tRUUlSMiozs6uxMSkx8fnzc3txcXlyUlpT09vRcWlxMRkS0trR8enzc2txcVlSUkpRUTkyMhoTk5uScnpz8/vxEQkR8dnTU1tRUVlSMjoz08vRMTkyEgoTk4uRkYmSclpT8+vy8urwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGc0CMcEgsGo9Gw6LhkHRCmICFODgAAJ8M4FDJTIUGCgCRwIQKV+9wMiaWtIAvRqOACiMKwucjJzFIJEN+gEQiHAQcJUMeBROCBFcLRBcAEESQAB0GGB4XGRkbghwCnxkiWhkPRRMMCSAfABkIoUhCDLW4Q0EAIfkECQYAGQAsAAAAAA8ADwCFRD48pKKkdHJ01NLU7OrsXFZUjIqMvLq8TEpM3N7c9Pb0lJaUxMbErK6sfH58bGpsVFJUTEZE3Nrc9PL0XF5clJKUxMLEVE5M5Obk/P78nJ6ctLa0hIaEREJE1NbU7O7sXFpcjI6MvL68TE5M5OLk/Pr8nJqczM7MtLK0hIKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnPAjHBILBqPRsICFCmESMcBAgAYdQAIi9HzSCUyJEOnAx0GBqUSsQJwYFAZyTiFGZZEgHGlJKACQBIZEwJXVR8iYwANE0MTAVMNGSISHAAhRSUYC2pCJFMhH4IaEAdGDGMdFFcdG0cJKSNYDoFIQgqctblBADs=\",\n        html:false,\n        content:\"\",//设置content后，text和icon设置将无效\n        mask:true//是否显示遮罩（半透明背景）\n    };\n\n    $.fn.mLoading=function (options) {\n        var ops={},\n            funName=\"\",\n            funArgs=[];\n        if(typeof options===\"object\"){\n            ops = options;\n        }else if(typeof options ===\"string\"){\n            funName=options;\n            funArgs = arraySlice.call(arguments).splice(0,1);\n        }\n        return this.each(function (i,element) {\n            var dom = $(element),\n                plsInc=dom.data(MLoading.dataKey);\n            if(!plsInc){\n                plsInc=new MLoading(dom,ops);\n            }\n\n            if(funName){\n                var fun = plsInc[funName];\n                if(typeof fun===\"function\"){\n                    fun.apply(plsInc,funArgs);\n                }\n            }\n        });\n    }\n}));"
  },
  {
    "path": "server/static/lib/jquery.whencallsequentially.js",
    "content": "/**\n * @author Martins Balodis\n *\n * An alternative version of $.when which can be used to execute asynchronous\n * calls sequentially one after another.\n *\n * @returns $.Deferred().promise()\n */\n$.whenCallSequentially = function (functionCalls) {\n\n\tvar deferredResonse = $.Deferred();\n\tvar resultData = new Array();\n\n\t// nothing to do\n\tif (functionCalls.length === 0) {\n\t\treturn deferredResonse.resolve(resultData).promise();\n\t}\n\n\tvar currentDeferred = functionCalls.shift()();\n\t// execute synchronous calls synchronously\n\twhile (currentDeferred.state() === 'resolved') {\n\t\tcurrentDeferred.done(function (data) {\n\t\t\tresultData.push(data);\n\t\t});\n\t\tif (functionCalls.length === 0) {\n\t\t\treturn deferredResonse.resolve(resultData).promise();\n\t\t}\n\t\tcurrentDeferred = functionCalls.shift()();\n\t}\n\n\t// handle async calls\n\tvar interval = setInterval(function () {\n\t\t// handle mixed sync calls\n\t\twhile (currentDeferred.state() === 'resolved') {\n\t\t\tcurrentDeferred.done(function (data) {\n\t\t\t\tresultData.push(data);\n\t\t\t});\n\t\t\tif (functionCalls.length === 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tdeferredResonse.resolve(resultData);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcurrentDeferred = functionCalls.shift()();\n\t\t}\n\t}, 10);\n\n\treturn deferredResonse.promise();\n};\n"
  },
  {
    "path": "server/static/lib/sugar-1.4.1.js",
    "content": "/*\n *  Sugar Library v1.4.1\n *\n *  Freely distributable and licensed under the MIT-style license.\n *  Copyright (c) 2013 Andrew Plummer\n *  http://sugarjs.com/\n *\n * ---------------------------- */\n\n// hotfix\nglobal = undefined;\n\n(function(){function aa(a){return function(){return a}}\nvar m=Object,p=Array,q=RegExp,r=Date,s=String,t=Number,u=Math,ba=\"undefined\"!==typeof global?global:this,v=m.prototype.toString,da=m.prototype.hasOwnProperty,ea=m.defineProperty&&m.defineProperties,fa=\"function\"===typeof q(),ga=!(\"0\"in new s(\"a\")),ia={},ja=/^\\[object Date|Array|String|Number|RegExp|Boolean|Arguments\\]$/,w=\"Boolean Number String Array Date RegExp Function\".split(\" \"),la=ka(\"boolean\",w[0]),y=ka(\"number\",w[1]),z=ka(\"string\",w[2]),A=ma(w[3]),C=ma(w[4]),D=ma(w[5]),F=ma(w[6]);\nfunction ma(a){var b=\"Array\"===a&&p.isArray||function(b,d){return(d||v.call(b))===\"[object \"+a+\"]\"};return ia[a]=b}function ka(a,b){function c(c){return G(c)?v.call(c)===\"[object \"+b+\"]\":typeof c===a}return ia[b]=c}\nfunction na(a){a.SugarMethods||(oa(a,\"SugarMethods\",{}),H(a,!1,!0,{extend:function(b,c,d){H(a,!1!==d,c,b)},sugarRestore:function(){return pa(this,a,arguments,function(a,c,d){oa(a,c,d.method)})},sugarRevert:function(){return pa(this,a,arguments,function(a,c,d){d.existed?oa(a,c,d.original):delete a[c]})}}))}function H(a,b,c,d){var e=b?a.prototype:a;na(a);I(d,function(d,f){var h=e[d],l=J(e,d);F(c)&&h&&(f=qa(h,f,c));!1===c&&h||oa(e,d,f);a.SugarMethods[d]={method:f,existed:l,original:h,instance:b}})}\nfunction K(a,b,c,d,e){var g={};d=z(d)?d.split(\",\"):d;d.forEach(function(a,b){e(g,a,b)});H(a,b,c,g)}function pa(a,b,c,d){var e=0===c.length,g=L(c),f=!1;I(b.SugarMethods,function(b,c){if(e||-1!==g.indexOf(b))f=!0,d(c.instance?a.prototype:a,b,c)});return f}function qa(a,b,c){return function(d){return c.apply(this,arguments)?b.apply(this,arguments):a.apply(this,arguments)}}function oa(a,b,c){ea?m.defineProperty(a,b,{value:c,configurable:!0,enumerable:!1,writable:!0}):a[b]=c}\nfunction L(a,b,c){var d=[];c=c||0;var e;for(e=a.length;c<e;c++)d.push(a[c]),b&&b.call(a,a[c],c);return d}function sa(a,b,c){var d=a[c||0];A(d)&&(a=d,c=0);L(a,b,c)}function ta(a){if(!a||!a.call)throw new TypeError(\"Callback is not callable\");}function M(a){return void 0!==a}function N(a){return void 0===a}function J(a,b){return!!a&&da.call(a,b)}function G(a){return!!a&&(\"object\"===typeof a||fa&&D(a))}function ua(a){var b=typeof a;return null==a||\"string\"===b||\"number\"===b||\"boolean\"===b}\nfunction va(a,b){b=b||v.call(a);try{if(a&&a.constructor&&!J(a,\"constructor\")&&!J(a.constructor.prototype,\"isPrototypeOf\"))return!1}catch(c){return!1}return!!a&&\"[object Object]\"===b&&\"hasOwnProperty\"in a}function I(a,b){for(var c in a)if(J(a,c)&&!1===b.call(a,c,a[c],a))break}function wa(a,b){for(var c=0;c<a;c++)b(c)}function xa(a,b){I(b,function(c){a[c]=b[c]});return a}function ya(a){ua(a)&&(a=m(a));if(ga&&z(a))for(var b=a,c=0,d;d=b.charAt(c);)b[c++]=d;return a}function O(a){xa(this,ya(a))}\nO.prototype.constructor=m;var P=u.abs,za=u.pow,Aa=u.ceil,Q=u.floor,R=u.round,Ca=u.min,S=u.max;function Da(a,b,c){var d=za(10,P(b||0));c=c||R;0>b&&(d=1/d);return c(a*d)/d}var Ea=48,Fa=57,Ga=65296,Ha=65305,Ia=\".\",Ja=\"\",Ka={},La;function Ma(){return\"\\t\\n\\x0B\\f\\r \\u00a0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u2028\\u2029\\u3000\\ufeff\"}function Na(a,b){var c=\"\";for(a=a.toString();0<b;)if(b&1&&(c+=a),b>>=1)a+=a;return c}\nfunction Oa(a,b){var c,d;c=a.replace(La,function(a){a=Ka[a];a===Ia&&(d=!0);return a});return d?parseFloat(c):parseInt(c,b||10)}function T(a,b,c,d){d=P(a).toString(d||10);d=Na(\"0\",b-d.replace(/\\.\\d+/,\"\").length)+d;if(c||0>a)d=(0>a?\"-\":\"+\")+d;return d}function Pa(a){if(11<=a&&13>=a)return\"th\";switch(a%10){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\";default:return\"th\"}}\nfunction Qa(a,b){function c(a,c){if(a||-1<b.indexOf(c))d+=c}var d=\"\";b=b||\"\";c(a.multiline,\"m\");c(a.ignoreCase,\"i\");c(a.global,\"g\");c(a.u,\"y\");return d}function Ra(a){z(a)||(a=s(a));return a.replace(/([\\\\/\\'*+?|()\\[\\]{}.^$])/g,\"\\\\$1\")}function U(a,b){return a[\"get\"+(a._utc?\"UTC\":\"\")+b]()}function Sa(a,b,c){return a[\"set\"+(a._utc&&\"ISOWeek\"!=b?\"UTC\":\"\")+b](c)}\nfunction Ta(a,b){var c=typeof a,d,e,g,f,h,l,n;if(\"string\"===c)return a;g=v.call(a);d=va(a,g);e=A(a,g);if(null!=a&&d||e){b||(b=[]);if(1<b.length)for(l=b.length;l--;)if(b[l]===a)return\"CYC\";b.push(a);d=a.valueOf()+s(a.constructor);f=e?a:m.keys(a).sort();l=0;for(n=f.length;l<n;l++)h=e?l:f[l],d+=h+Ta(a[h],b);b.pop()}else d=-Infinity===1/a?\"-0\":s(a&&a.valueOf?a.valueOf():a);return c+g+d}function Ua(a,b){return a===b?0!==a||1/a===1/b:Va(a)&&Va(b)?Ta(a)===Ta(b):!1}\nfunction Va(a){var b=v.call(a);return ja.test(b)||va(a,b)}function Wa(a,b,c){var d,e=a.length,g=b.length,f=!1!==b[g-1];if(!(g>(f?1:2)))return Xa(a,e,b[0],f,c);d=[];L(b,function(b){if(la(b))return!1;d.push(Xa(a,e,b,f,c))});return d}function Xa(a,b,c,d,e){d&&(c%=b,0>c&&(c=b+c));return e?a.charAt(c):a[c]}function Ya(a,b){K(b,!0,!1,a,function(a,b){a[b+(\"equal\"===b?\"s\":\"\")]=function(){return m[b].apply(null,[this].concat(L(arguments)))}})}na(m);I(w,function(a,b){na(ba[b])});var Za,$a;\nfor($a=0;9>=$a;$a++)Za=s.fromCharCode($a+Ga),Ja+=Za,Ka[Za]=s.fromCharCode($a+Ea);Ka[\",\"]=\"\";Ka[\"\\uff0e\"]=Ia;Ka[Ia]=Ia;La=q(\"[\"+Ja+\"\\uff0e,\"+Ia+\"]\",\"g\");\n\"use strict\";H(m,!1,!1,{keys:function(a){var b=[];if(!G(a)&&!D(a)&&!F(a))throw new TypeError(\"Object required\");I(a,function(a){b.push(a)});return b}});\nfunction ab(a,b,c,d){var e=a.length,g=-1==d,f=g?e-1:0;c=isNaN(c)?f:parseInt(c>>0);0>c&&(c=e+c);if(!g&&0>c||g&&c>=e)c=f;for(;g&&0<=c||!g&&c<e;){if(a[c]===b)return c;c+=d}return-1}function bb(a,b,c,d){var e=a.length,g=0,f=M(c);ta(b);if(0!=e||f)f||(c=a[d?e-1:g],g++);else throw new TypeError(\"Reduce called on empty array with no initial value\");for(;g<e;)f=d?e-g-1:g,f in a&&(c=b(c,a[f],f,a)),g++;return c}function cb(a){if(0===a.length)throw new TypeError(\"First argument must be defined\");}H(p,!1,!1,{isArray:function(a){return A(a)}});\nH(p,!0,!1,{every:function(a,b){var c=this.length,d=0;for(cb(arguments);d<c;){if(d in this&&!a.call(b,this[d],d,this))return!1;d++}return!0},some:function(a,b){var c=this.length,d=0;for(cb(arguments);d<c;){if(d in this&&a.call(b,this[d],d,this))return!0;d++}return!1},map:function(a,b){b=arguments[1];var c=this.length,d=0,e=Array(c);for(cb(arguments);d<c;)d in this&&(e[d]=a.call(b,this[d],d,this)),d++;return e},filter:function(a){var b=arguments[1],c=this.length,d=0,e=[];for(cb(arguments);d<c;)d in\nthis&&a.call(b,this[d],d,this)&&e.push(this[d]),d++;return e},indexOf:function(a,b){return z(this)?this.indexOf(a,b):ab(this,a,b,1)},lastIndexOf:function(a,b){return z(this)?this.lastIndexOf(a,b):ab(this,a,b,-1)},forEach:function(a,b){var c=this.length,d=0;for(ta(a);d<c;)d in this&&a.call(b,this[d],d,this),d++},reduce:function(a,b){return bb(this,a,b)},reduceRight:function(a,b){return bb(this,a,b,!0)}});\nH(Function,!0,!1,{bind:function(a){var b=this,c=L(arguments,null,1),d;if(!F(this))throw new TypeError(\"Function.prototype.bind called on a non-function\");d=function(){return b.apply(b.prototype&&this instanceof b?this:a,c.concat(L(arguments)))};d.prototype=this.prototype;return d}});H(r,!1,!1,{now:function(){return(new r).getTime()}});\n(function(){var a=Ma().match(/^\\s+$/);try{s.prototype.trim.call([1])}catch(b){a=!1}H(s,!0,!a,{trim:function(){return this.toString().trimLeft().trimRight()},trimLeft:function(){return this.replace(q(\"^[\"+Ma()+\"]+\"),\"\")},trimRight:function(){return this.replace(q(\"[\"+Ma()+\"]+$\"),\"\")}})})();\n(function(){var a=new r(r.UTC(1999,11,31)),a=a.toISOString&&\"1999-12-31T00:00:00.000Z\"===a.toISOString();K(r,!0,!a,\"toISOString,toJSON\",function(a,c){a[c]=function(){return T(this.getUTCFullYear(),4)+\"-\"+T(this.getUTCMonth()+1,2)+\"-\"+T(this.getUTCDate(),2)+\"T\"+T(this.getUTCHours(),2)+\":\"+T(this.getUTCMinutes(),2)+\":\"+T(this.getUTCSeconds(),2)+\".\"+T(this.getUTCMilliseconds(),3)+\"Z\"}})})();\n\"use strict\";function db(a){a=q(a);return function(b){return a.test(b)}}\nfunction eb(a){var b=a.getTime();return function(a){return!(!a||!a.getTime)&&a.getTime()===b}}function fb(a){return function(b,c,d){return b===a||a.call(this,b,c,d)}}function gb(a){return function(b,c,d){return b===a||a.call(d,c,b,d)}}function hb(a,b){var c={};return function(d,e,g){var f;if(!G(d))return!1;for(f in a)if(c[f]=c[f]||ib(a[f],b),!1===c[f].call(g,d[f],e,g))return!1;return!0}}function jb(a){return function(b){return b===a||Ua(b,a)}}\nfunction ib(a,b){if(!ua(a)){if(D(a))return db(a);if(C(a))return eb(a);if(F(a))return b?gb(a):fb(a);if(va(a))return hb(a,b)}return jb(a)}function kb(a,b,c,d){return b?b.apply?b.apply(c,d||[]):F(a[b])?a[b].call(a):a[b]:a}function V(a,b,c,d){var e=+a.length;0>c&&(c=a.length+c);c=isNaN(c)?0:c;for(!0===d&&(e+=c);c<e;){d=c%a.length;if(!(d in a)){lb(a,b,c);break}if(!1===b.call(a,a[d],d,a))break;c++}}\nfunction lb(a,b,c){var d=[],e;for(e in a)e in a&&(e>>>0==e&&4294967295!=e)&&e>=c&&d.push(parseInt(e));d.sort().each(function(c){return b.call(a,a[c],c,a)})}function mb(a,b,c,d,e,g){var f,h,l;0<a.length&&(l=ib(b),V(a,function(b,c){if(l.call(g,b,c,a))return f=b,h=c,!1},c,d));return e?h:f}function nb(a,b){var c=[],d={},e;V(a,function(g,f){e=b?kb(g,b,a,[g,f,a]):g;ob(d,e)||c.push(g)});return c}\nfunction pb(a,b,c){var d=[],e={};b.each(function(a){ob(e,a)});a.each(function(a){var b=Ta(a),h=!Va(a);if(qb(e,b,a,h)!==c){var l=0;if(h)for(b=e[b];l<b.length;)b[l]===a?b.splice(l,1):l+=1;else delete e[b];d.push(a)}});return d}function rb(a,b,c){b=b||Infinity;c=c||0;var d=[];V(a,function(a){A(a)&&c<b?d=d.concat(rb(a,b,c+1)):d.push(a)});return d}function sb(a){var b=[];L(a,function(a){b=b.concat(a)});return b}function qb(a,b,c,d){var e=b in a;d&&(a[b]||(a[b]=[]),e=-1!==a[b].indexOf(c));return e}\nfunction ob(a,b){var c=Ta(b),d=!Va(b),e=qb(a,c,b,d);d?a[c].push(b):a[c]=b;return e}function tb(a,b,c,d){var e,g,f,h=[],l=\"max\"===c,n=\"min\"===c,x=p.isArray(a);for(e in a)if(a.hasOwnProperty(e)){c=a[e];f=kb(c,b,a,x?[c,parseInt(e),a]:[]);if(N(f))throw new TypeError(\"Cannot compare with undefined\");if(f===g)h.push(c);else if(N(g)||l&&f>g||n&&f<g)h=[c],g=f}x||(h=rb(h,1));return d?h:h[0]}\nfunction ub(a,b){var c,d,e,g,f=0,h=0;c=p[xb];d=p[yb];var l=p[zb],n=p[Ab],x=p[Bb];a=Cb(a,c,d);b=Cb(b,c,d);do c=a.charAt(f),e=l[c]||c,c=b.charAt(f),g=l[c]||c,c=e?n.indexOf(e):null,d=g?n.indexOf(g):null,-1===c||-1===d?(c=a.charCodeAt(f)||null,d=b.charCodeAt(f)||null,x&&((c>=Ea&&c<=Fa||c>=Ga&&c<=Ha)&&(d>=Ea&&d<=Fa||d>=Ga&&d<=Ha))&&(c=Oa(a.slice(f)),d=Oa(b.slice(f)))):(e=e!==a.charAt(f),g=g!==b.charAt(f),e!==g&&0===h&&(h=e-g)),f+=1;while(null!=c&&null!=d&&c===d);return c===d?h:c-d}\nfunction Cb(a,b,c){z(a)||(a=s(a));c&&(a=a.toLowerCase());b&&(a=a.replace(b,\"\"));return a}var Ab=\"AlphanumericSortOrder\",xb=\"AlphanumericSortIgnore\",yb=\"AlphanumericSortIgnoreCase\",zb=\"AlphanumericSortEquivalents\",Bb=\"AlphanumericSortNatural\";H(p,!1,!0,{create:function(){var a=[];L(arguments,function(b){if(!ua(b)&&\"length\"in b&&(\"[object Arguments]\"===v.call(b)||b.callee)||!ua(b)&&\"length\"in b&&!z(b)&&!va(b))b=p.prototype.slice.call(b,0);a=a.concat(b)});return a}});\nH(p,!0,!1,{find:function(a,b){ta(a);return mb(this,a,0,!1,!1,b)},findIndex:function(a,b){var c;ta(a);c=mb(this,a,0,!1,!0,b);return N(c)?-1:c}});\nH(p,!0,!0,{findFrom:function(a,b,c){return mb(this,a,b,c)},findIndexFrom:function(a,b,c){b=mb(this,a,b,c,!0);return N(b)?-1:b},findAll:function(a,b,c){var d=[],e;0<this.length&&(e=ib(a),V(this,function(a,b,c){e(a,b,c)&&d.push(a)},b,c));return d},count:function(a){return N(a)?this.length:this.findAll(a).length},removeAt:function(a,b){if(N(a))return this;N(b)&&(b=a);this.splice(a,b-a+1);return this},include:function(a,b){return this.clone().add(a,b)},exclude:function(){return p.prototype.remove.apply(this.clone(),\narguments)},clone:function(){return xa([],this)},unique:function(a){return nb(this,a)},flatten:function(a){return rb(this,a)},union:function(){return nb(this.concat(sb(arguments)))},intersect:function(){return pb(this,sb(arguments),!1)},subtract:function(a){return pb(this,sb(arguments),!0)},at:function(){return Wa(this,arguments)},first:function(a){if(N(a))return this[0];0>a&&(a=0);return this.slice(0,a)},last:function(a){return N(a)?this[this.length-1]:this.slice(0>this.length-a?0:this.length-a)},\nfrom:function(a){return this.slice(a)},to:function(a){N(a)&&(a=this.length);return this.slice(0,a)},min:function(a,b){return tb(this,a,\"min\",b)},max:function(a,b){return tb(this,a,\"max\",b)},least:function(a,b){return tb(this.groupBy.apply(this,[a]),\"length\",\"min\",b)},most:function(a,b){return tb(this.groupBy.apply(this,[a]),\"length\",\"max\",b)},sum:function(a){a=a?this.map(a):this;return 0<a.length?a.reduce(function(a,c){return a+c}):0},average:function(a){a=a?this.map(a):this;return 0<a.length?a.sum()/\na.length:0},inGroups:function(a,b){var c=1<arguments.length,d=this,e=[],g=Aa(this.length/a);wa(a,function(a){a*=g;var h=d.slice(a,a+g);c&&h.length<g&&wa(g-h.length,function(){h=h.add(b)});e.push(h)});return e},inGroupsOf:function(a,b){var c=[],d=this.length,e=this,g;if(0===d||0===a)return e;N(a)&&(a=1);N(b)&&(b=null);wa(Aa(d/a),function(d){for(g=e.slice(a*d,a*d+a);g.length<a;)g.push(b);c.push(g)});return c},isEmpty:function(){return 0==this.compact().length},sortBy:function(a,b){var c=this.clone();\nc.sort(function(d,e){var g,f;g=kb(d,a,c,[d]);f=kb(e,a,c,[e]);return(z(g)&&z(f)?ub(g,f):g<f?-1:g>f?1:0)*(b?-1:1)});return c},randomize:function(){for(var a=this.concat(),b=a.length,c,d;b;)c=u.random()*b|0,d=a[--b],a[b]=a[c],a[c]=d;return a},zip:function(){var a=L(arguments);return this.map(function(b,c){return[b].concat(a.map(function(a){return c in a?a[c]:null}))})},sample:function(a){var b=this.randomize();return 0<arguments.length?b.slice(0,a):b[0]},each:function(a,b,c){V(this,a,b,c);return this},\nadd:function(a,b){if(!y(t(b))||isNaN(b))b=this.length;p.prototype.splice.apply(this,[b,0].concat(a));return this},remove:function(){var a=this;L(arguments,function(b){var c=0;for(b=ib(b);c<a.length;)b(a[c],c,a)?a.splice(c,1):c++});return a},compact:function(a){var b=[];V(this,function(c){A(c)?b.push(c.compact()):a&&c?b.push(c):a||(null==c||c.valueOf()!==c.valueOf())||b.push(c)});return b},groupBy:function(a,b){var c=this,d={},e;V(c,function(b,f){e=kb(b,a,c,[b,f,c]);d[e]||(d[e]=[]);d[e].push(b)});\nb&&I(d,b);return d},none:function(){return!this.any.apply(this,arguments)}});H(p,!0,!0,{all:p.prototype.every,any:p.prototype.some,insert:p.prototype.add});function Db(a,b){K(m,!1,!0,a,function(a,d){a[d]=function(a,c,f){var h=m.keys(ya(a)),l;b||(l=ib(c,!0));f=p.prototype[d].call(h,function(d){var f=a[d];return b?kb(f,c,a,[d,f,a]):l(f,d,a)},f);A(f)&&(f=f.reduce(function(b,c){b[c]=a[c];return b},{}));return f}});Ya(a,O)}\nH(m,!1,!0,{map:function(a,b){var c={},d,e;for(d in a)J(a,d)&&(e=a[d],c[d]=kb(e,b,a,[d,e,a]));return c},reduce:function(a){var b=m.keys(ya(a)).map(function(b){return a[b]});return b.reduce.apply(b,L(arguments,null,1))},each:function(a,b){ta(b);I(a,b);return a},size:function(a){return m.keys(ya(a)).length}});var Eb=\"any all none count find findAll isEmpty\".split(\" \"),Fb=\"sum average min max least most\".split(\" \"),Gb=[\"map\",\"reduce\",\"size\"],Hb=Eb.concat(Fb).concat(Gb);\n(function(){function a(){var a=arguments;return 0<a.length&&!F(a[0])}var b=p.prototype.map;K(p,!0,a,\"every,all,some,filter,any,none,find,findIndex\",function(a,b){var e=p.prototype[b];a[b]=function(a){var b=ib(a);return e.call(this,function(a,c){return b(a,c,this)})}});H(p,!0,a,{map:function(a){return b.call(this,function(b,e){return kb(b,a,this,[b,e,this])})}})})();\n(function(){p[Ab]=\"A\\u00c1\\u00c0\\u00c2\\u00c3\\u0104BC\\u0106\\u010c\\u00c7D\\u010e\\u00d0E\\u00c9\\u00c8\\u011a\\u00ca\\u00cb\\u0118FG\\u011eH\\u0131I\\u00cd\\u00cc\\u0130\\u00ce\\u00cfJKL\\u0141MN\\u0143\\u0147\\u00d1O\\u00d3\\u00d2\\u00d4PQR\\u0158S\\u015a\\u0160\\u015eT\\u0164U\\u00da\\u00d9\\u016e\\u00db\\u00dcVWXY\\u00ddZ\\u0179\\u017b\\u017d\\u00de\\u00c6\\u0152\\u00d8\\u00d5\\u00c5\\u00c4\\u00d6\".split(\"\").map(function(a){return a+a.toLowerCase()}).join(\"\");var a={};V(\"A\\u00c1\\u00c0\\u00c2\\u00c3\\u00c4 C\\u00c7 E\\u00c9\\u00c8\\u00ca\\u00cb I\\u00cd\\u00cc\\u0130\\u00ce\\u00cf O\\u00d3\\u00d2\\u00d4\\u00d5\\u00d6 S\\u00df U\\u00da\\u00d9\\u00db\\u00dc\".split(\" \"),\nfunction(b){var c=b.charAt(0);V(b.slice(1).split(\"\"),function(b){a[b]=c;a[b.toLowerCase()]=c.toLowerCase()})});p[Bb]=!0;p[yb]=!0;p[zb]=a})();Db(Eb);Db(Fb,!0);Ya(Gb,O);p.AlphanumericSort=ub;\n\"use strict\";\nvar W,Ib,Jb=\"ampm hour minute second ampm utc offset_sign offset_hours offset_minutes ampm\".split(\" \"),Kb=\"({t})?\\\\s*(\\\\d{1,2}(?:[,.]\\\\d+)?)(?:{h}([0-5]\\\\d(?:[,.]\\\\d+)?)?{m}(?::?([0-5]\\\\d(?:[,.]\\\\d+)?){s})?\\\\s*(?:({t})|(Z)|(?:([+-])(\\\\d{2,2})(?::?(\\\\d{2,2}))?)?)?|\\\\s*({t}))\",Lb={},Mb,Nb,Ob,Pb=[],Qb={},X={yyyy:function(a){return U(a,\"FullYear\")},yy:function(a){return U(a,\"FullYear\")%100},ord:function(a){a=U(a,\"Date\");return a+Pa(a)},tz:function(a){return a.getUTCOffset()},isotz:function(a){return a.getUTCOffset(!0)},\nZ:function(a){return a.getUTCOffset()},ZZ:function(a){return a.getUTCOffset().replace(/(\\d{2})$/,\":$1\")}},Rb=[{name:\"year\",method:\"FullYear\",k:!0,b:function(a){return 864E5*(365+(a?a.isLeapYear()?1:0:0.25))}},{name:\"month\",error:0.919,method:\"Month\",k:!0,b:function(a,b){var c=30.4375,d;a&&(d=a.daysInMonth(),b<=d.days()&&(c=d));return 864E5*c}},{name:\"week\",method:\"ISOWeek\",b:aa(6048E5)},{name:\"day\",error:0.958,method:\"Date\",k:!0,b:aa(864E5)},{name:\"hour\",method:\"Hours\",b:aa(36E5)},{name:\"minute\",\nmethod:\"Minutes\",b:aa(6E4)},{name:\"second\",method:\"Seconds\",b:aa(1E3)},{name:\"millisecond\",method:\"Milliseconds\",b:aa(1)}],Sb={};function Tb(a){xa(this,a);this.g=Pb.concat()}\nTb.prototype={getMonth:function(a){return y(a)?a-1:this.months.indexOf(a)%12},getWeekday:function(a){return this.weekdays.indexOf(a)%7},addFormat:function(a,b,c,d,e){var g=c||[],f=this,h;a=a.replace(/\\s+/g,\"[,. ]*\");a=a.replace(/\\{([^,]+?)\\}/g,function(a,b){var d,e,h,B=b.match(/\\?$/);h=b.match(/^(\\d+)\\??$/);var k=b.match(/(\\d)(?:-(\\d))?/),E=b.replace(/[^a-z]+$/,\"\");h?d=f.tokens[h[1]]:f[E]?d=f[E]:f[E+\"s\"]&&(d=f[E+\"s\"],k&&(e=[],d.forEach(function(a,b){var c=b%(f.units?8:d.length);c>=k[1]&&c<=(k[2]||\nk[1])&&e.push(a)}),d=e),d=Ub(d));h?h=\"(?:\"+d+\")\":(c||g.push(E),h=\"(\"+d+\")\");B&&(h+=\"?\");return h});b?(b=Vb(f,e),e=[\"t\",\"[\\\\s\\\\u3000]\"].concat(f.timeMarker),h=a.match(/\\\\d\\{\\d,\\d\\}\\)+\\??$/),Wb(f,\"(?:\"+b+\")[,\\\\s\\\\u3000]+?\"+a,Jb.concat(g),d),Wb(f,a+\"(?:[,\\\\s]*(?:\"+e.join(\"|\")+(h?\"+\":\"*\")+\")\"+b+\")?\",g.concat(Jb),d)):Wb(f,a,g,d)}};\nfunction Xb(a,b,c){var d,e,g=b[0],f=b[1],h=b[2];b=a[c]||a.relative;if(F(b))return b.call(a,g,f,h,c);e=a.units[8*(a.plural&&1<g?1:0)+f]||a.units[f];a.capitalizeUnit&&(e=Yb(e));d=a.modifiers.filter(function(a){return\"sign\"==a.name&&a.value==(0<h?1:-1)})[0];return b.replace(/\\{(.*?)\\}/g,function(a,b){switch(b){case \"num\":return g;case \"unit\":return e;case \"sign\":return d.src}})}function Zb(a,b){b=b||a.code;return\"en\"===b||\"en-US\"===b?!0:a.variant}\nfunction $b(a,b){return b.replace(q(a.num,\"g\"),function(b){return ac(a,b)||\"\"})}function ac(a,b){var c;return y(b)?b:b&&-1!==(c=a.numbers.indexOf(b))?(c+1)%10:1}function Y(a,b){var c;z(a)||(a=\"\");c=Sb[a]||Sb[a.slice(0,2)];if(!1===b&&!c)throw new TypeError(\"Invalid locale.\");return c||Ib}\nfunction bc(a,b){function c(a){var b=h[a];z(b)?h[a]=b.split(\",\"):b||(h[a]=[])}function d(a,b){a=a.split(\"+\").map(function(a){return a.replace(/(.+):(.+)$/,function(a,b,c){return c.split(\"|\").map(function(a){return b+a}).join(\"|\")})}).join(\"|\");a.split(\"|\").forEach(b)}function e(a,b,c){var e=[];h[a].forEach(function(a,f){b&&(a+=\"+\"+a.slice(0,3));d(a,function(a,b){e[b*c+f]=a.toLowerCase()})});h[a]=e}function g(a,b,c){a=\"\\\\d{\"+a+\",\"+b+\"}\";c&&(a+=\"|(?:\"+Ub(h.numbers)+\")+\");return a}function f(a,b){h[a]=\nh[a]||b}var h,l;h=new Tb(b);c(\"modifiers\");\"months weekdays units numbers articles tokens timeMarker ampm timeSuffixes dateParse timeParse\".split(\" \").forEach(c);l=!h.monthSuffix;e(\"months\",l,12);e(\"weekdays\",l,7);e(\"units\",!1,8);e(\"numbers\",!1,10);f(\"code\",a);f(\"date\",g(1,2,h.digitDate));f(\"year\",\"'\\\\d{2}|\"+g(4,4));f(\"num\",function(){var a=[\"-?\\\\d+\"].concat(h.articles);h.numbers&&(a=a.concat(h.numbers));return Ub(a)}());(function(){var a=[];h.i={};h.modifiers.push({name:\"day\",src:\"yesterday\",value:-1});\nh.modifiers.push({name:\"day\",src:\"today\",value:0});h.modifiers.push({name:\"day\",src:\"tomorrow\",value:1});h.modifiers.forEach(function(b){var c=b.name;d(b.src,function(d){var e=h[c];h.i[d]=b;a.push({name:c,src:d,value:b.value});h[c]=e?e+\"|\"+d:d})});h.day+=\"|\"+Ub(h.weekdays);h.modifiers=a})();h.monthSuffix&&(h.month=g(1,2),h.months=\"1 2 3 4 5 6 7 8 9 10 11 12\".split(\" \").map(function(a){return a+h.monthSuffix}));h.full_month=g(1,2)+\"|\"+Ub(h.months);0<h.timeSuffixes.length&&h.addFormat(Vb(h),!1,Jb);\nh.addFormat(\"{day}\",!0);h.addFormat(\"{month}\"+(h.monthSuffix||\"\"));h.addFormat(\"{year}\"+(h.yearSuffix||\"\"));h.timeParse.forEach(function(a){h.addFormat(a,!0)});h.dateParse.forEach(function(a){h.addFormat(a)});return Sb[a]=h}function Wb(a,b,c,d){a.g.unshift({r:d,locale:a,q:q(\"^\"+b+\"$\",\"i\"),to:c})}function Yb(a){return a.slice(0,1).toUpperCase()+a.slice(1)}function Ub(a){return a.filter(function(a){return!!a}).join(\"|\")}function cc(){var a=r.SugarNewDate;return a?a():new r}\nfunction dc(a,b){var c;if(G(a[0]))return a;if(y(a[0])&&!y(a[1]))return[a[0]];if(z(a[0])&&b)return[ec(a[0]),a[1]];c={};Nb.forEach(function(b,e){c[b.name]=a[e]});return[c]}function ec(a){var b,c={};if(a=a.match(/^(\\d+)?\\s?(\\w+?)s?$/i))N(b)&&(b=parseInt(a[1])||1),c[a[2].toLowerCase()]=b;return c}function fc(a,b,c){var d;N(c)&&(c=Ob.length);for(b=b||0;b<c&&(d=Ob[b],!1!==a(d.name,d,b));b++);}\nfunction gc(a,b){var c={},d,e;b.forEach(function(b,f){d=a[f+1];N(d)||\"\"===d||(\"year\"===b&&(c.t=d.replace(/'/,\"\")),e=parseFloat(d.replace(/'/,\"\").replace(/,/,\".\")),c[b]=isNaN(e)?d.toLowerCase():e)});return c}function hc(a){a=a.trim().replace(/^just (?=now)|\\.+$/i,\"\");return ic(a)}\nfunction ic(a){return a.replace(Mb,function(a,c,d){var e=0,g=1,f,h;if(c)return a;d.split(\"\").reverse().forEach(function(a){a=Lb[a];var b=9<a;b?(f&&(e+=g),g*=a/(h||1),h=a):(!1===f&&(g*=10),e+=g*a);f=b});f&&(e+=g);return e})}\nfunction jc(a,b,c,d){function e(a){vb.push(a)}function g(){vb.forEach(function(a){a.call()})}function f(){var a=n.getWeekday();n.setWeekday(7*(k.num-1)+(a>Ba?Ba+7:Ba))}function h(){var a=B.i[k.edge];fc(function(a){if(M(k[a]))return E=a,!1},4);if(\"year\"===E)k.e=\"month\";else if(\"month\"===E||\"week\"===E)k.e=\"day\";n[(0>a.value?\"endOf\":\"beginningOf\")+Yb(E)]();-2===a.value&&n.reset()}function l(){var a;fc(function(b,c,d){\"day\"===b&&(b=\"date\");if(M(k[b])){if(d>=wb)return n.setTime(NaN),!1;a=a||{};a[b]=k[b];\ndelete k[b]}});a&&e(function(){n.set(a,!0)})}var n,x,ha,vb,B,k,E,wb,Ba,ra,ca;n=cc();vb=[];n.utc(d);C(a)?n.utc(a.isUTC()).setTime(a.getTime()):y(a)?n.setTime(a):G(a)?(n.set(a,!0),k=a):z(a)&&(ha=Y(b),a=hc(a),ha&&I(ha.o?[ha.o].concat(ha.g):ha.g,function(c,d){var g=a.match(d.q);if(g){B=d.locale;k=gc(g,d.to);B.o=d;k.utc&&n.utc();if(k.timestamp)return k=k.timestamp,!1;d.r&&(!z(k.month)&&(z(k.date)||Zb(ha,b)))&&(ca=k.month,k.month=k.date,k.date=ca);k.year&&2===k.t.length&&(k.year=100*R(U(cc(),\"FullYear\")/\n100)-100*R(k.year/100)+k.year);k.month&&(k.month=B.getMonth(k.month),k.shift&&!k.unit&&(k.unit=B.units[7]));k.weekday&&k.date?delete k.weekday:k.weekday&&(k.weekday=B.getWeekday(k.weekday),k.shift&&!k.unit&&(k.unit=B.units[5]));k.day&&(ca=B.i[k.day])?(k.day=ca.value,n.reset(),x=!0):k.day&&-1<(Ba=B.getWeekday(k.day))&&(delete k.day,k.num&&k.month?(e(f),k.day=1):k.weekday=Ba);k.date&&!y(k.date)&&(k.date=$b(B,k.date));k.ampm&&k.ampm===B.ampm[1]&&12>k.hour?k.hour+=12:k.ampm===B.ampm[0]&&12===k.hour&&\n(k.hour=0);if(\"offset_hours\"in k||\"offset_minutes\"in k)n.utc(),k.offset_minutes=k.offset_minutes||0,k.offset_minutes+=60*k.offset_hours,\"-\"===k.offset_sign&&(k.offset_minutes*=-1),k.minute-=k.offset_minutes;k.unit&&(x=!0,ra=ac(B,k.num),wb=B.units.indexOf(k.unit)%8,E=W.units[wb],l(),k.shift&&(ra*=(ca=B.i[k.shift])?ca.value:0),k.sign&&(ca=B.i[k.sign])&&(ra*=ca.value),M(k.weekday)&&(n.set({weekday:k.weekday},!0),delete k.weekday),k[E]=(k[E]||0)+ra);k.edge&&e(h);\"-\"===k.year_sign&&(k.year*=-1);fc(function(a,\nb,c){b=k[a];var d=b%1;d&&(k[Ob[c-1].name]=R(d*(\"second\"===a?1E3:60)),k[a]=Q(b))},1,4);return!1}}),k?x?n.advance(k):(n._utc&&n.reset(),kc(n,k,!0,!1,c)):(\"now\"!==a&&(n=new r(a)),d&&n.addMinutes(-n.getTimezoneOffset())),g(),n.utc(!1));return{c:n,set:k}}function lc(a){var b,c=P(a),d=c,e=0;fc(function(a,f,h){b=Q(Da(c/f.b(),1));1<=b&&(d=b,e=h)},1);return[d,e,a]}\nfunction mc(a){var b=lc(a.millisecondsFromNow());if(6===b[1]||5===b[1]&&4===b[0]&&a.daysFromNow()>=cc().daysInMonth())b[0]=P(a.monthsFromNow()),b[1]=6;return b}function nc(a,b,c){function d(a,c){var d=U(a,\"Month\");return Y(c).months[d+12*b]}Z(a,d,c);Z(Yb(a),d,c,1)}function Z(a,b,c,d){X[a]=function(a,g){var f=b(a,g);c&&(f=f.slice(0,c));d&&(f=f.slice(0,d).toUpperCase()+f.slice(d));return f}}\nfunction oc(a,b,c){X[a]=b;X[a+a]=function(a,c){return T(b(a,c),2)};c&&(X[a+a+a]=function(a,c){return T(b(a,c),3)},X[a+a+a+a]=function(a,c){return T(b(a,c),4)})}function pc(a){var b=a.match(/(\\{\\w+\\})|[^{}]+/g);Qb[a]=b.map(function(a){a.replace(/\\{(\\w+)\\}/,function(b,e){a=X[e]||e;return e});return a})}\nfunction qc(a,b,c,d){var e;if(!a.isValid())return\"Invalid Date\";Date[b]?b=Date[b]:F(b)&&(e=mc(a),b=b.apply(a,e.concat(Y(d))));if(!b&&c)return e=e||mc(a),0===e[1]&&(e[1]=1,e[0]=1),a=Y(d),Xb(a,e,0<e[2]?\"future\":\"past\");b=b||\"long\";if(\"short\"===b||\"long\"===b||\"full\"===b)b=Y(d)[b];Qb[b]||pc(b);var g,f;e=\"\";b=Qb[b];g=0;for(c=b.length;g<c;g++)f=b[g],e+=F(f)?f(a,d):f;return e}\nfunction rc(a,b,c,d,e){var g,f,h,l=0,n=0,x=0;g=jc(b,c,null,e);0<d&&(n=x=d,f=!0);if(!g.c.isValid())return!1;if(g.set&&g.set.e){Rb.forEach(function(b){b.name===g.set.e&&(l=b.b(g.c,a-g.c)-1)});b=Yb(g.set.e);if(g.set.edge||g.set.shift)g.c[\"beginningOf\"+b]();\"month\"===g.set.e&&(h=g.c.clone()[\"endOf\"+b]().getTime());!f&&(g.set.sign&&\"millisecond\"!=g.set.e)&&(n=50,x=-50)}f=a.getTime();b=g.c.getTime();h=sc(a,b,h||b+l);return f>=b-n&&f<=h+x}\nfunction sc(a,b,c){b=new r(b);a=(new r(c)).utc(a.isUTC());23!==U(a,\"Hours\")&&(b=b.getTimezoneOffset(),a=a.getTimezoneOffset(),b!==a&&(c+=(a-b).minutes()));return c}\nfunction kc(a,b,c,d,e){function g(a){return M(b[a])?b[a]:b[a+\"s\"]}function f(a){return M(g(a))}var h;if(y(b)&&d)b={milliseconds:b};else if(y(b))return a.setTime(b),a;M(b.date)&&(b.day=b.date);fc(function(d,e,g){var l=\"day\"===d;if(f(d)||l&&f(\"weekday\"))return b.e=d,h=+g,!1;!c||(\"week\"===d||l&&f(\"week\"))||Sa(a,e.method,l?1:0)});Rb.forEach(function(c){var e=c.name;c=c.method;var h;h=g(e);N(h)||(d?(\"week\"===e&&(h=(b.day||0)+7*h,c=\"Date\"),h=h*d+U(a,c)):\"month\"===e&&f(\"day\")&&Sa(a,\"Date\",15),Sa(a,c,h),\nd&&\"month\"===e&&(e=h,0>e&&(e=e%12+12),e%12!=U(a,\"Month\")&&Sa(a,\"Date\",0)))});d||(f(\"day\")||!f(\"weekday\"))||a.setWeekday(g(\"weekday\"));var l;a:{switch(e){case -1:l=a>cc();break a;case 1:l=a<cc();break a}l=void 0}l&&fc(function(b,c){if((c.k||\"week\"===b&&f(\"weekday\"))&&!(f(b)||\"day\"===b&&f(\"weekday\")))return a[c.j](e),!1},h+1);return a}\nfunction Vb(a,b){var c=Kb,d={h:0,m:1,s:2},e;a=a||W;return c.replace(/{([a-z])}/g,function(c,f){var h=[],l=\"h\"===f,n=l&&!b;if(\"t\"===f)return a.ampm.join(\"|\");l&&h.push(\":\");(e=a.timeSuffixes[d[f]])&&h.push(e+\"\\\\s*\");return 0===h.length?\"\":\"(?:\"+h.join(\"|\")+\")\"+(n?\"\":\"?\")})}function tc(a,b,c){var d,e;y(a[1])?d=dc(a)[0]:(d=a[0],e=a[1]);return jc(d,e,b,c).c}\nH(r,!1,!0,{create:function(){return tc(arguments)},past:function(){return tc(arguments,-1)},future:function(){return tc(arguments,1)},addLocale:function(a,b){return bc(a,b)},setLocale:function(a){var b=Y(a,!1);Ib=b;a&&a!=b.code&&(b.code=a);return b},getLocale:function(a){return a?Y(a,!1):Ib},addFormat:function(a,b,c){Wb(Y(c),a,b)}});\nH(r,!0,!0,{set:function(){var a=dc(arguments);return kc(this,a[0],a[1])},setWeekday:function(a){if(!N(a))return Sa(this,\"Date\",U(this,\"Date\")+a-U(this,\"Day\"))},setISOWeek:function(a){var b=U(this,\"Day\")||7;if(!N(a))return this.set({month:0,date:4}),this.set({weekday:1}),1<a&&this.addWeeks(a-1),1!==b&&this.advance({days:b-1}),this.getTime()},getISOWeek:function(){var a;a=this.clone();var b=U(a,\"Day\")||7;a.addDays(4-b).reset();return 1+Q(a.daysSince(a.clone().beginningOfYear())/7)},beginningOfISOWeek:function(){var a=\nthis.getDay();0===a?a=-6:1!==a&&(a=1);this.setWeekday(a);return this.reset()},endOfISOWeek:function(){0!==this.getDay()&&this.setWeekday(7);return this.endOfDay()},getUTCOffset:function(a){var b=this._utc?0:this.getTimezoneOffset(),c=!0===a?\":\":\"\";return!b&&a?\"Z\":T(Q(-b/60),2,!0)+c+T(P(b%60),2)},utc:function(a){oa(this,\"_utc\",!0===a||0===arguments.length);return this},isUTC:function(){return!!this._utc||0===this.getTimezoneOffset()},advance:function(){var a=dc(arguments,!0);return kc(this,a[0],a[1],\n1)},rewind:function(){var a=dc(arguments,!0);return kc(this,a[0],a[1],-1)},isValid:function(){return!isNaN(this.getTime())},isAfter:function(a,b){return this.getTime()>r.create(a).getTime()-(b||0)},isBefore:function(a,b){return this.getTime()<r.create(a).getTime()+(b||0)},isBetween:function(a,b,c){var d=this.getTime();a=r.create(a).getTime();var e=r.create(b).getTime();b=Ca(a,e);a=S(a,e);c=c||0;return b-c<d&&a+c>d},isLeapYear:function(){var a=U(this,\"FullYear\");return 0===a%4&&0!==a%100||0===a%400},\ndaysInMonth:function(){return 32-U(new r(U(this,\"FullYear\"),U(this,\"Month\"),32),\"Date\")},format:function(a,b){return qc(this,a,!1,b)},relative:function(a,b){z(a)&&(b=a,a=null);return qc(this,a,!0,b)},is:function(a,b,c){var d,e;if(this.isValid()){if(z(a))switch(a=a.trim().toLowerCase(),e=this.clone().utc(c),!0){case \"future\"===a:return this.getTime()>cc().getTime();case \"past\"===a:return this.getTime()<cc().getTime();case \"weekday\"===a:return 0<U(e,\"Day\")&&6>U(e,\"Day\");case \"weekend\"===a:return 0===\nU(e,\"Day\")||6===U(e,\"Day\");case -1<(d=W.weekdays.indexOf(a)%7):return U(e,\"Day\")===d;case -1<(d=W.months.indexOf(a)%12):return U(e,\"Month\")===d}return rc(this,a,null,b,c)}},reset:function(a){var b={},c;a=a||\"hours\";\"date\"===a&&(a=\"days\");c=Rb.some(function(b){return a===b.name||a===b.name+\"s\"});b[a]=a.match(/^days?/)?1:0;return c?this.set(b,!0):this},clone:function(){var a=new r(this.getTime());a.utc(!!this._utc);return a}});\nH(r,!0,!0,{iso:function(){return this.toISOString()},getWeekday:r.prototype.getDay,getUTCWeekday:r.prototype.getUTCDay});function uc(a,b){function c(){return R(this*b)}function d(){return tc(arguments)[a.j](this)}function e(){return tc(arguments)[a.j](-this)}var g=a.name,f={};f[g]=c;f[g+\"s\"]=c;f[g+\"Before\"]=e;f[g+\"sBefore\"]=e;f[g+\"Ago\"]=e;f[g+\"sAgo\"]=e;f[g+\"After\"]=d;f[g+\"sAfter\"]=d;f[g+\"FromNow\"]=d;f[g+\"sFromNow\"]=d;t.extend(f)}H(t,!0,!0,{duration:function(a){a=Y(a);return Xb(a,lc(this),\"duration\")}});\nW=Ib=r.addLocale(\"en\",{plural:!0,timeMarker:\"at\",ampm:\"am,pm\",months:\"January,February,March,April,May,June,July,August,September,October,November,December\",weekdays:\"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday\",units:\"millisecond:|s,second:|s,minute:|s,hour:|s,day:|s,week:|s,month:|s,year:|s\",numbers:\"one,two,three,four,five,six,seven,eight,nine,ten\",articles:\"a,an,the\",tokens:\"the,st|nd|rd|th,of\",\"short\":\"{Month} {d}, {yyyy}\",\"long\":\"{Month} {d}, {yyyy} {h}:{mm}{tt}\",full:\"{Weekday} {Month} {d}, {yyyy} {h}:{mm}:{ss}{tt}\",\npast:\"{num} {unit} {sign}\",future:\"{num} {unit} {sign}\",duration:\"{num} {unit}\",modifiers:[{name:\"sign\",src:\"ago|before\",value:-1},{name:\"sign\",src:\"from now|after|from|in|later\",value:1},{name:\"edge\",src:\"last day\",value:-2},{name:\"edge\",src:\"end\",value:-1},{name:\"edge\",src:\"first day|beginning\",value:1},{name:\"shift\",src:\"last\",value:-1},{name:\"shift\",src:\"the|this\",value:0},{name:\"shift\",src:\"next\",value:1}],dateParse:[\"{month} {year}\",\"{shift} {unit=5-7}\",\"{0?} {date}{1}\",\"{0?} {edge} of {shift?} {unit=4-7?}{month?}{year?}\"],\ntimeParse:\"{num} {unit} {sign};{sign} {num} {unit};{0} {num}{1} {day} of {month} {year?};{weekday?} {month} {date}{1?} {year?};{date} {month} {year};{date} {month};{shift} {weekday};{shift} week {weekday};{weekday} {2?} {shift} week;{num} {unit=4-5} {sign} {day};{0?} {date}{1} of {month};{0?}{month?} {date?}{1?} of {shift} {unit=6-7}\".split(\";\")});Ob=Rb.concat().reverse();Nb=Rb.concat();Nb.splice(2,1);\nK(r,!0,!0,Rb,function(a,b,c){function d(a){a/=f;var c=a%1,d=b.error||0.999;c&&P(c%1)>d&&(a=R(a));return 0>a?Aa(a):Q(a)}var e=b.name,g=Yb(e),f=b.b(),h,l;b.j=\"add\"+g+\"s\";h=function(a,b){return d(this.getTime()-r.create(a,b).getTime())};l=function(a,b){return d(r.create(a,b).getTime()-this.getTime())};a[e+\"sAgo\"]=l;a[e+\"sUntil\"]=l;a[e+\"sSince\"]=h;a[e+\"sFromNow\"]=h;a[b.j]=function(a,b){var c={};c[e]=a;return this.advance(c,b)};uc(b,f);3>c&&[\"Last\",\"This\",\"Next\"].forEach(function(b){a[\"is\"+b+g]=function(){return rc(this,\nb+\" \"+e,\"en\")}});4>c&&(a[\"beginningOf\"+g]=function(){var a={};switch(e){case \"year\":a.year=U(this,\"FullYear\");break;case \"month\":a.month=U(this,\"Month\");break;case \"day\":a.day=U(this,\"Date\");break;case \"week\":a.weekday=0}return this.set(a,!0)},a[\"endOf\"+g]=function(){var a={hours:23,minutes:59,seconds:59,milliseconds:999};switch(e){case \"year\":a.month=11;a.day=31;break;case \"month\":a.day=this.daysInMonth();break;case \"week\":a.weekday=6}return this.set(a,!0)})});\nW.addFormat(\"([+-])?(\\\\d{4,4})[-.]?{full_month}[-.]?(\\\\d{1,2})?\",!0,[\"year_sign\",\"year\",\"month\",\"date\"],!1,!0);W.addFormat(\"(\\\\d{1,2})[-.\\\\/]{full_month}(?:[-.\\\\/](\\\\d{2,4}))?\",!0,[\"date\",\"month\",\"year\"],!0);W.addFormat(\"{full_month}[-.](\\\\d{4,4})\",!1,[\"month\",\"year\"]);W.addFormat(\"\\\\/Date\\\\((\\\\d+(?:[+-]\\\\d{4,4})?)\\\\)\\\\/\",!1,[\"timestamp\"]);W.addFormat(Vb(W),!1,Jb);Pb=W.g.slice(0,7).reverse();W.g=W.g.slice(7).concat(Pb);oc(\"f\",function(a){return U(a,\"Milliseconds\")},!0);\noc(\"s\",function(a){return U(a,\"Seconds\")});oc(\"m\",function(a){return U(a,\"Minutes\")});oc(\"h\",function(a){return U(a,\"Hours\")%12||12});oc(\"H\",function(a){return U(a,\"Hours\")});oc(\"d\",function(a){return U(a,\"Date\")});oc(\"M\",function(a){return U(a,\"Month\")+1});(function(){function a(a,c){var d=U(a,\"Hours\");return Y(c).ampm[Q(d/12)]||\"\"}Z(\"t\",a,1);Z(\"tt\",a);Z(\"T\",a,1,1);Z(\"TT\",a,null,2)})();\n(function(){function a(a,c){var d=U(a,\"Day\");return Y(c).weekdays[d]}Z(\"dow\",a,3);Z(\"Dow\",a,3,1);Z(\"weekday\",a);Z(\"Weekday\",a,null,1)})();nc(\"mon\",0,3);nc(\"month\",0);nc(\"month2\",1);nc(\"month3\",2);X.ms=X.f;X.milliseconds=X.f;X.seconds=X.s;X.minutes=X.m;X.hours=X.h;X[\"24hr\"]=X.H;X[\"12hr\"]=X.h;X.date=X.d;X.day=X.d;X.year=X.yyyy;K(r,!0,!0,\"short,long,full\",function(a,b){a[b]=function(a){return qc(this,b,!1,a)}});\n\"\\u3007\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\\u5341\\u767e\\u5343\\u4e07\".split(\"\").forEach(function(a,b){9<b&&(b=za(10,b-9));Lb[a]=b});xa(Lb,Ka);Mb=q(\"([\\u671f\\u9031\\u5468])?([\\u3007\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\\u5341\\u767e\\u5343\\u4e07\"+Ja+\"]+)(?!\\u6628)\",\"g\");\n(function(){var a=W.weekdays.slice(0,7),b=W.months.slice(0,12);K(r,!0,!0,\"today yesterday tomorrow weekday weekend future past\".split(\" \").concat(a).concat(b),function(a,b){a[\"is\"+Yb(b)]=function(a){return this.is(b,0,a)}})})();r.utc||(r.utc={create:function(){return tc(arguments,0,!0)},past:function(){return tc(arguments,-1,!0)},future:function(){return tc(arguments,1,!0)}});\nH(r,!1,!0,{RFC1123:\"{Dow}, {dd} {Mon} {yyyy} {HH}:{mm}:{ss} {tz}\",RFC1036:\"{Weekday}, {dd}-{Mon}-{yy} {HH}:{mm}:{ss} {tz}\",ISO8601_DATE:\"{yyyy}-{MM}-{dd}\",ISO8601_DATETIME:\"{yyyy}-{MM}-{dd}T{HH}:{mm}:{ss}.{fff}{isotz}\"});\n\"use strict\";function Range(a,b){this.start=vc(a);this.end=vc(b)}function vc(a){return C(a)?new r(a.getTime()):null==a?a:C(a)?a.getTime():a.valueOf()}function wc(a){a=null==a?a:C(a)?a.getTime():a.valueOf();return!!a||0===a}\nfunction xc(a,b){var c,d,e,g;if(y(b))return new r(a.getTime()+b);c=b[0];d=b[1];e=U(a,d);g=new r(a.getTime());Sa(g,d,e+c);return g}function yc(a,b){return s.fromCharCode(a.charCodeAt(0)+b)}function zc(a,b){return a+b}Range.prototype.toString=function(){return this.isValid()?this.start+\"..\"+this.end:\"Invalid Range\"};\nH(Range,!0,!0,{isValid:function(){return wc(this.start)&&wc(this.end)&&typeof this.start===typeof this.end},span:function(){return this.isValid()?P((z(this.end)?this.end.charCodeAt(0):this.end)-(z(this.start)?this.start.charCodeAt(0):this.start))+1:NaN},contains:function(a){return null==a?!1:a.start&&a.end?a.start>=this.start&&a.start<=this.end&&a.end>=this.start&&a.end<=this.end:a>=this.start&&a<=this.end},every:function(a,b){var c,d=this.start,e=this.end,g=e<d,f=d,h=0,l=[];F(a)&&(b=a,a=null);a=\na||1;y(d)?c=zc:z(d)?c=yc:C(d)&&(c=a,y(c)?a=c:(d=c.toLowerCase().match(/^(\\d+)?\\s?(\\w+?)s?$/i),c=parseInt(d[1])||1,d=d[2].slice(0,1).toUpperCase()+d[2].slice(1),d.match(/hour|minute|second/i)?d+=\"s\":\"Year\"===d?d=\"FullYear\":\"Day\"===d&&(d=\"Date\"),a=[c,d]),c=xc);for(g&&0<a&&(a*=-1);g?f>=e:f<=e;)l.push(f),b&&b(f,h),f=c(f,a),h++;return l},union:function(a){return new Range(this.start<a.start?this.start:a.start,this.end>a.end?this.end:a.end)},intersect:function(a){return a.start>this.end||a.end<this.start?\nnew Range(NaN,NaN):new Range(this.start>a.start?this.start:a.start,this.end<a.end?this.end:a.end)},clone:function(){return new Range(this.start,this.end)},clamp:function(a){var b=this.start,c=this.end,d=c<b?c:b,b=b>c?b:c;return vc(a<d?d:a>b?b:a)}});[t,s,r].forEach(function(a){H(a,!1,!0,{range:function(b,c){a.create&&(b=a.create(b),c=a.create(c));return new Range(b,c)}})});\nH(t,!0,!0,{upto:function(a,b,c){return t.range(this,a).every(c,b)},clamp:function(a,b){return(new Range(a,b)).clamp(this)},cap:function(a){return this.clamp(void 0,a)}});H(t,!0,!0,{downto:t.prototype.upto});H(p,!1,function(a){return a instanceof Range},{create:function(a){return a.every()}});\n\"use strict\";function Ac(a,b,c,d,e){Infinity!==b&&(a.timers||(a.timers=[]),y(b)||(b=1),a.n=!1,a.timers.push(setTimeout(function(){a.n||c.apply(d,e||[])},b)))}\nH(Function,!0,!0,{lazy:function(a,b,c){function d(){g.length<c-(f&&b?1:0)&&g.push([this,arguments]);f||(f=!0,b?h():Ac(d,l,h));return x}var e=this,g=[],f=!1,h,l,n,x;a=a||1;c=c||Infinity;l=Aa(a);n=R(l/a)||1;h=function(){var a=g.length,b;if(0!=a){for(b=S(a-n,0);a>b;)x=Function.prototype.apply.apply(e,g.shift()),a--;Ac(d,l,function(){f=!1;h()})}};return d},throttle:function(a){return this.lazy(a,!0,1)},debounce:function(a){function b(){b.cancel();Ac(b,a,c,this,arguments)}var c=this;return b},delay:function(a){var b=\nL(arguments,null,1);Ac(this,a,this,this,b);return this},every:function(a){function b(){c.apply(c,d);Ac(c,a,b)}var c=this,d=arguments,d=1<d.length?L(d,null,1):[];Ac(c,a,b);return c},cancel:function(){var a=this.timers,b;if(A(a))for(;b=a.shift();)clearTimeout(b);this.n=!0;return this},after:function(a){var b=this,c=0,d=[];if(!y(a))a=1;else if(0===a)return b.call(),b;return function(){var e;d.push(L(arguments));c++;if(c==a)return e=b.call(this,d),c=0,d=[],e}},once:function(){return this.throttle(Infinity,\n!0)},fill:function(){var a=this,b=L(arguments);return function(){var c=L(arguments);b.forEach(function(a,b){(null!=a||b>=c.length)&&c.splice(b,0,a)});return a.apply(this,c)}}});\n\"use strict\";function Bc(a,b,c,d,e,g){var f=a.toFixed(20),h=f.search(/\\./),f=f.search(/[1-9]/),h=h-f;0<h&&(h-=1);e=S(Ca(Q(h/3),!1===e?c.length:e),-d);d=c.charAt(e+d-1);-9>h&&(e=-3,b=P(h)-9,d=c.slice(0,1));c=g?za(2,10*e):za(10,3*e);return Da(a/c,b||0).format()+d.trim()}\nH(t,!1,!0,{random:function(a,b){var c,d;1==arguments.length&&(b=a,a=0);c=Ca(a||0,N(b)?1:b);d=S(a||0,N(b)?1:b)+1;return Q(u.random()*(d-c)+c)}});\nH(t,!0,!0,{log:function(a){return u.log(this)/(a?u.log(a):1)},abbr:function(a){return Bc(this,a,\"kmbt\",0,4)},metric:function(a,b){return Bc(this,a,\"n\\u03bcm kMGTPE\",4,N(b)?1:b)},bytes:function(a,b){return Bc(this,a,\"kMGTPE\",0,N(b)?4:b,!0)+\"B\"},isInteger:function(){return 0==this%1},isOdd:function(){return!isNaN(this)&&!this.isMultipleOf(2)},isEven:function(){return this.isMultipleOf(2)},isMultipleOf:function(a){return 0===this%a},format:function(a,b,c){var d,e,g,f=\"\";N(b)&&(b=\",\");N(c)&&(c=\".\");d=\n(y(a)?Da(this,a||0).toFixed(S(a,0)):this.toString()).replace(/^-/,\"\").split(\".\");e=d[0];g=d[1];for(d=e.length;0<d;d-=3)d<e.length&&(f=b+f),f=e.slice(S(0,d-3),d)+f;g&&(f+=c+Na(\"0\",(a||0)-g.length)+g);return(0>this?\"-\":\"\")+f},hex:function(a){return this.pad(a||1,!1,16)},times:function(a){if(a)for(var b=0;b<this;b++)a.call(this,b);return this.toNumber()},chr:function(){return s.fromCharCode(this)},pad:function(a,b,c){return T(this,a,b,c)},ordinalize:function(){var a=P(this),a=parseInt(a.toString().slice(-2));\nreturn this+Pa(a)},toNumber:function(){return parseFloat(this,10)}});(function(){function a(a){return function(c){return c?Da(this,c,a):a(this)}}H(t,!0,!0,{ceil:a(Aa),round:a(R),floor:a(Q)});K(t,!0,!0,\"abs,pow,sin,asin,cos,acos,tan,atan,exp,pow,sqrt\",function(a,c){a[c]=function(a,b){return u[c](this,a,b)}})})();\n\"use strict\";var Cc=[\"isObject\",\"isNaN\"],Dc=\"keys values select reject each merge clone equal watch tap has toQueryString\".split(\" \");\nfunction Ec(a,b,c,d){var e,g,f;(g=b.match(/^(.+?)(\\[.*\\])$/))?(f=g[1],b=g[2].replace(/^\\[|\\]$/g,\"\").split(\"][\"),b.forEach(function(b){e=!b||b.match(/^\\d+$/);!f&&A(a)&&(f=a.length);J(a,f)||(a[f]=e?[]:{});a=a[f];f=b}),!f&&e&&(f=a.length.toString()),Ec(a,f,c,d)):a[b]=d&&\"true\"===c?!0:d&&\"false\"===c?!1:c}function Fc(a,b){var c;return A(b)||G(b)&&b.toString===v?(c=[],I(b,function(b,e){a&&(b=a+\"[\"+b+\"]\");c.push(Fc(b,e))}),c.join(\"&\")):a?Gc(a)+\"=\"+(C(b)?b.getTime():Gc(b)):\"\"}\nfunction Gc(a){return a||!1===a||0===a?encodeURIComponent(a).replace(/%20/g,\"+\"):\"\"}function Hc(a,b,c){var d,e=a instanceof O?new O:{};I(a,function(a,f){d=!1;sa(b,function(b){(D(b)?b.test(a):G(b)?b[a]===f:a===s(b))&&(d=!0)},1);d===c&&(e[a]=f)});return e}H(m,!1,!0,{watch:function(a,b,c){if(ea){var d=a[b];m.defineProperty(a,b,{enumerable:!0,configurable:!0,get:function(){return d},set:function(e){d=c.call(a,b,d,e)}})}}});\nH(m,!1,function(){return 1<arguments.length},{keys:function(a,b){var c=m.keys(a);c.forEach(function(c){b.call(a,c,a[c])});return c}});\nH(m,!1,!0,{isObject:function(a){return va(a)},isNaN:function(a){return y(a)&&a.valueOf()!==a.valueOf()},equal:function(a,b){return Ua(a,b)},extended:function(a){return new O(a)},merge:function(a,b,c,d){var e,g,f,h,l,n,x;if(a&&\"string\"!==typeof b)for(e in b)if(J(b,e)&&a){h=b[e];l=a[e];n=M(l);g=G(h);f=G(l);x=n&&!1===d?l:h;n&&F(d)&&(x=d.call(b,e,l,h));if(c&&(g||f))if(C(h))x=new r(h.getTime());else if(D(h))x=new q(h.source,Qa(h));else{f||(a[e]=p.isArray(h)?[]:{});m.merge(a[e],h,c,d);continue}a[e]=x}return a},\nvalues:function(a,b){var c=[];I(a,function(d,e){c.push(e);b&&b.call(a,e)});return c},clone:function(a,b){var c;if(!G(a))return a;c=v.call(a);if(C(a,c)&&a.clone)return a.clone();if(C(a,c)||D(a,c))return new a.constructor(a);if(a instanceof O)c=new O;else if(A(a,c))c=[];else if(va(a,c))c={};else throw new TypeError(\"Clone must be a basic data type.\");return m.merge(c,a,b)},fromQueryString:function(a,b){var c=m.extended();a=a&&a.toString?a.toString():\"\";a.replace(/^.*?\\?/,\"\").split(\"&\").forEach(function(a){a=\na.split(\"=\");2===a.length&&Ec(c,a[0],decodeURIComponent(a[1]),b)});return c},toQueryString:function(a,b){return Fc(b,a)},tap:function(a,b){var c=b;F(b)||(c=function(){if(b)a[b]()});c.call(a,a);return a},has:function(a,b){return J(a,b)},select:function(a){return Hc(a,arguments,!0)},reject:function(a){return Hc(a,arguments,!1)}});K(m,!1,!0,w,function(a,b){var c=\"is\"+b;Cc.push(c);a[c]=ia[b]});\nH(m,!1,function(){return 0===arguments.length},{extend:function(){var a=Cc.concat(Dc);\"undefined\"!==typeof Hb&&(a=a.concat(Hb));Ya(a,m)}});Ya(Dc,O);\n\"use strict\";H(q,!1,!0,{escape:function(a){return Ra(a)}});H(q,!0,!0,{getFlags:function(){return Qa(this)},setFlags:function(a){return q(this.source,a)},addFlag:function(a){return this.setFlags(Qa(this,a))},removeFlag:function(a){return this.setFlags(Qa(this).replace(a,\"\"))}});\n\"use strict\";\nfunction Ic(a){a=+a;if(0>a||Infinity===a)throw new RangeError(\"Invalid number\");return a}function Jc(a,b){return Na(M(b)?b:\" \",a)}function Kc(a,b,c,d,e){var g;if(a.length<=b)return a.toString();d=N(d)?\"...\":d;switch(c){case \"left\":return a=e?Lc(a,b,!0):a.slice(a.length-b),d+a;case \"middle\":return c=Aa(b/2),g=Q(b/2),b=e?Lc(a,c):a.slice(0,c),a=e?Lc(a,g,!0):a.slice(a.length-g),b+d+a;default:return b=e?Lc(a,b):a.slice(0,b),b+d}}\nfunction Lc(a,b,c){if(c)return Lc(a.reverse(),b).reverse();c=q(\"(?=[\"+Ma()+\"])\");var d=0;return a.split(c).filter(function(a){d+=a.length;return d<=b}).join(\"\")}function Mc(a,b,c){z(b)&&(b=a.indexOf(b),-1===b&&(b=c?a.length:0));return b}var Nc,Oc;H(s,!0,!1,{repeat:function(a){a=Ic(a);return Na(this,a)}});\nH(s,!0,function(a){return D(a)||2<arguments.length},{startsWith:function(a){var b=arguments,c=b[1],b=b[2],d=this;c&&(d=d.slice(c));N(b)&&(b=!0);c=D(a)?a.source.replace(\"^\",\"\"):Ra(a);return q(\"^\"+c,b?\"\":\"i\").test(d)},endsWith:function(a){var b=arguments,c=b[1],b=b[2],d=this;M(c)&&(d=d.slice(0,c));N(b)&&(b=!0);c=D(a)?a.source.replace(\"$\",\"\"):Ra(a);return q(c+\"$\",b?\"\":\"i\").test(d)}});\nH(s,!0,!0,{escapeRegExp:function(){return Ra(this)},escapeURL:function(a){return a?encodeURIComponent(this):encodeURI(this)},unescapeURL:function(a){return a?decodeURI(this):decodeURIComponent(this)},escapeHTML:function(){return this.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&apos;\").replace(/\\//g,\"&#x2f;\")},unescapeHTML:function(){return this.replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&quot;/g,'\"').replace(/&apos;/g,\"'\").replace(/&#x2f;/g,\n\"/\").replace(/&amp;/g,\"&\")},encodeBase64:function(){return Nc(unescape(encodeURIComponent(this)))},decodeBase64:function(){return decodeURIComponent(escape(Oc(this)))},each:function(a,b){var c,d,e;F(a)?(b=a,a=/[\\s\\S]/g):a?z(a)?a=q(Ra(a),\"gi\"):D(a)&&(a=q(a.source,Qa(a,\"g\"))):a=/[\\s\\S]/g;c=this.match(a)||[];if(b)for(d=0,e=c.length;d<e;d++)c[d]=b.call(this,c[d],d,c)||c[d];return c},shift:function(a){var b=\"\";a=a||0;this.codes(function(c){b+=s.fromCharCode(c+a)});return b},codes:function(a){var b=[],\nc,d;c=0;for(d=this.length;c<d;c++){var e=this.charCodeAt(c);b.push(e);a&&a.call(this,e,c)}return b},chars:function(a){return this.each(a)},words:function(a){return this.trim().each(/\\S+/g,a)},lines:function(a){return this.trim().each(/^.*$/gm,a)},paragraphs:function(a){var b=this.trim().split(/[\\r\\n]{2,}/);return b=b.map(function(b){if(a)var d=a.call(b);return d?d:b})},isBlank:function(){return 0===this.trim().length},has:function(a){return-1!==this.search(D(a)?a:Ra(a))},add:function(a,b){b=N(b)?\nthis.length:b;return this.slice(0,b)+a+this.slice(b)},remove:function(a){return this.replace(a,\"\")},reverse:function(){return this.split(\"\").reverse().join(\"\")},compact:function(){return this.trim().replace(/([\\r\\n\\s\\u3000])+/g,function(a,b){return\"\\u3000\"===b?b:\" \"})},at:function(){return Wa(this,arguments,!0)},from:function(a){return this.slice(Mc(this,a,!0))},to:function(a){N(a)&&(a=this.length);return this.slice(0,Mc(this,a))},dasherize:function(){return this.underscore().replace(/_/g,\"-\")},underscore:function(){return this.replace(/[-\\s]+/g,\n\"_\").replace(s.Inflector&&s.Inflector.acronymRegExp,function(a,b){return(0<b?\"_\":\"\")+a.toLowerCase()}).replace(/([A-Z\\d]+)([A-Z][a-z])/g,\"$1_$2\").replace(/([a-z\\d])([A-Z])/g,\"$1_$2\").toLowerCase()},camelize:function(a){return this.underscore().replace(/(^|_)([^_]+)/g,function(b,c,d,e){b=(b=s.Inflector)&&b.acronyms[d];b=z(b)?b:void 0;e=!1!==a||0<e;return b?e?b:b.toLowerCase():e?d.capitalize():d})},spacify:function(){return this.underscore().replace(/_/g,\" \")},stripTags:function(){var a=this;sa(0<arguments.length?\narguments:[\"\"],function(b){a=a.replace(q(\"</?\"+Ra(b)+\"[^<>]*>\",\"gi\"),\"\")});return a},removeTags:function(){var a=this;sa(0<arguments.length?arguments:[\"\\\\S+\"],function(b){b=q(\"<(\"+b+\")[^<>]*(?:\\\\/>|>.*?<\\\\/\\\\1>)\",\"gi\");a=a.replace(b,\"\")});return a},truncate:function(a,b,c){return Kc(this,a,b,c)},truncateOnWord:function(a,b,c){return Kc(this,a,b,c,!0)},pad:function(a,b){var c,d;a=Ic(a);c=S(0,a-this.length)/2;d=Q(c);c=Aa(c);return Jc(d,b)+this+Jc(c,b)},padLeft:function(a,b){a=Ic(a);return Jc(S(0,a-\nthis.length),b)+this},padRight:function(a,b){a=Ic(a);return this+Jc(S(0,a-this.length),b)},first:function(a){N(a)&&(a=1);return this.substr(0,a)},last:function(a){N(a)&&(a=1);return this.substr(0>this.length-a?0:this.length-a)},toNumber:function(a){return Oa(this,a)},capitalize:function(a){var b;return this.toLowerCase().replace(a?/[^']/g:/^\\S/,function(a){var d=a.toUpperCase(),e;e=b?a:d;b=d!==a;return e})},assign:function(){var a={};sa(arguments,function(b,c){G(b)?xa(a,b):a[c+1]=b});return this.replace(/\\{([^{]+?)\\}/g,\nfunction(b,c){return J(a,c)?a[c]:b})}});H(s,!0,!0,{insert:s.prototype.add});\n(function(a){if(ba.btoa)Nc=ba.btoa,Oc=ba.atob;else{var b=/[^A-Za-z0-9\\+\\/\\=]/g;Nc=function(b){var d=\"\",e,g,f,h,l,n,x=0;do e=b.charCodeAt(x++),g=b.charCodeAt(x++),f=b.charCodeAt(x++),h=e>>2,e=(e&3)<<4|g>>4,l=(g&15)<<2|f>>6,n=f&63,isNaN(g)?l=n=64:isNaN(f)&&(n=64),d=d+a.charAt(h)+a.charAt(e)+a.charAt(l)+a.charAt(n);while(x<b.length);return d};Oc=function(c){var d=\"\",e,g,f,h,l,n=0;if(c.match(b))throw Error(\"String contains invalid base64 characters\");c=c.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do e=a.indexOf(c.charAt(n++)),\ng=a.indexOf(c.charAt(n++)),h=a.indexOf(c.charAt(n++)),l=a.indexOf(c.charAt(n++)),e=e<<2|g>>4,g=(g&15)<<4|h>>2,f=(h&3)<<6|l,d+=s.fromCharCode(e),64!=h&&(d+=s.fromCharCode(g)),64!=l&&(d+=s.fromCharCode(f));while(n<c.length);return d}}})(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\");})();"
  },
  {
    "path": "server/static/lib/tableExport.js",
    "content": "/*\n tableExport.jquery.plugin\n Version 1.9.8\n Copyright (c) 2015-2017 hhurz, https://github.com/hhurz\n Original Work Copyright (c) 2014 Giri Raj\n Licensed under the MIT License\n*/\nvar $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(c,f,u){c instanceof String&&(c=String(c));for(var C=c.length,D=0;D<C;D++){var O=c[D];if(f.call(u,O,D,c))return{i:D,v:O}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||\"function\"==typeof Object.defineProperties?Object.defineProperty:function(c,f,u){c!=Array.prototype&&c!=Object.prototype&&(c[f]=u.value)};\n$jscomp.getGlobal=function(c){return\"undefined\"!=typeof window&&window===c?c:\"undefined\"!=typeof global&&null!=global?global:c};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(c,f,u,C){if(f){u=$jscomp.global;c=c.split(\".\");for(C=0;C<c.length-1;C++){var D=c[C];D in u||(u[D]={});u=u[D]}c=c[c.length-1];C=u[c];f=f(C);f!=C&&null!=f&&$jscomp.defineProperty(u,c,{configurable:!0,writable:!0,value:f})}};\n$jscomp.polyfill(\"Array.prototype.find\",function(c){return c?c:function(c,u){return $jscomp.findInternal(this,c,u).v}},\"es6\",\"es3\");\n(function(c){c.fn.extend({tableExport:function(f){function u(b){var e=[];C(b,\"tbody\").each(function(){e.push.apply(e,D(c(this),a.tbodySelector))});a.tfootSelector.length&&C(b,\"tfoot\").each(function(){e.push.apply(e,D(c(this),a.tfootSelector))});return e}function C(b,e){var a=b.parents(\"table\").length;return b.find(e).filter(function(){return c(this).closest(\"table\").parents(\"table\").length===a})}function D(b,e){return b.find(e).filter(function(){return 0===c(this).find(\"table\").length&&1===c(this).parents(\"table\").length})}\nfunction O(b){var e=[];c(b).find(\"thead\").first().find(\"th\").each(function(b,a){void 0!==c(a).attr(\"data-field\")?e[b]=c(a).attr(\"data-field\"):e[b]=b.toString()});return e}function P(b){var e=\"undefined\"!==typeof b[0].cellIndex,a=\"undefined\"!==typeof b[0].rowIndex,r=e||a?ya(b):b.is(\":visible\"),g=b.data(\"tableexport-display\");e&&\"none\"!=g&&\"always\"!=g&&(b=c(b[0].parentNode),a=\"undefined\"!==typeof b[0].rowIndex,g=b.data(\"tableexport-display\"));a&&\"none\"!=g&&\"always\"!=g&&(g=b.closest(\"table\").data(\"tableexport-display\"));\nreturn\"none\"!==g&&(1==r||\"always\"==g)}function ya(b){var e=[];R&&(e=K.filter(function(){var e=!1;this.nodeType==b[0].nodeType&&(\"undefined\"!==typeof this.rowIndex&&this.rowIndex==b[0].rowIndex?e=!0:\"undefined\"!==typeof this.cellIndex&&this.cellIndex==b[0].cellIndex&&\"undefined\"!==typeof this.parentNode.rowIndex&&\"undefined\"!==typeof b[0].parentNode.rowIndex&&this.parentNode.rowIndex==b[0].parentNode.rowIndex&&(e=!0));return e}));return 0==R||0==e.length}function za(b,e,k){var r=!1;P(b)?0<a.ignoreColumn.length&&\n(-1!=c.inArray(k,a.ignoreColumn)||-1!=c.inArray(k-e,a.ignoreColumn)||Q.length>k&&\"undefined\"!=typeof Q[k]&&-1!=c.inArray(Q[k],a.ignoreColumn))&&(r=!0):r=!0;return r}function B(b,e,k,r,g){if(\"function\"===typeof g){var h=!1;\"function\"===typeof a.onIgnoreRow&&(h=a.onIgnoreRow(c(b),k));if(!1===h&&-1==c.inArray(k,a.ignoreRow)&&-1==c.inArray(k-r,a.ignoreRow)&&P(c(b))){var x=c(b).find(e),q=0;x.each(function(b){var e=c(this),a,h=parseInt(this.getAttribute(\"colspan\")),r=parseInt(this.getAttribute(\"rowspan\"));\nG.forEach(function(b){if(k>=b.s.r&&k<=b.e.r&&q>=b.s.c&&q<=b.e.c)for(a=0;a<=b.e.c-b.s.c;++a)g(null,k,q++)});if(!1===za(e,x.length,b)){if(r||h)h=h||1,G.push({s:{r:k,c:q},e:{r:k+(r||1)-1,c:q+h-1}});g(this,k,q++)}if(h)for(a=0;a<h-1;++a)g(null,k,q++)});G.forEach(function(b){if(k>=b.s.r&&k<=b.e.r&&q>=b.s.c&&q<=b.e.c)for(Y=0;Y<=b.e.c-b.s.c;++Y)g(null,k,q++)})}}}function la(b,e){!0===a.consoleLog&&console.log(b.output());if(\"string\"===a.outputMode)return b.output();if(\"base64\"===a.outputMode)return L(b.output());\nif(\"window\"===a.outputMode)window.URL=window.URL||window.webkitURL,window.open(window.URL.createObjectURL(b.output(\"blob\")));else try{var k=b.output(\"blob\");saveAs(k,a.fileName+\".pdf\")}catch(r){H(a.fileName+\".pdf\",\"data:application/pdf\"+(e?\"\":\";base64\")+\",\",e?b.output(\"blob\"):b.output())}}function ma(b,e,a){var k=0;\"undefined\"!==typeof a&&(k=a.colspan);if(0<=k){for(var g=b.width,c=b.textPos.x,x=e.table.columns.indexOf(e.column),q=1;q<k;q++)g+=e.table.columns[x+q].width;1<k&&(\"right\"===b.styles.halign?\nc=b.textPos.x+g-b.width:\"center\"===b.styles.halign&&(c=b.textPos.x+(g-b.width)/2));b.width=g;b.textPos.x=c;\"undefined\"!==typeof a&&1<a.rowspan&&(b.height*=a.rowspan);if(\"middle\"===b.styles.valign||\"bottom\"===b.styles.valign)a=(\"string\"===typeof b.text?b.text.split(/\\r\\n|\\r|\\n/g):b.text).length||1,2<a&&(b.textPos.y-=(2-1.15)/2*e.row.styles.fontSize*(a-2)/3);return!0}return!1}function na(b,a,k){\"undefined\"!=typeof k.images&&a.each(function(){var a=c(this).children();if(c(this).is(\"img\")){var e=oa(this.src);\nk.images[e]={url:this.src,src:this.src}}\"undefined\"!=typeof a&&0<a.length&&na(b,a,k)})}function Aa(b,a){function e(b){if(b.url){var e=new Image;g=++h;e.crossOrigin=\"Anonymous\";e.onerror=e.onload=function(){if(e.complete&&(0===e.src.indexOf(\"data:image/\")&&(e.width=b.width||e.width||0,e.height=b.height||e.height||0),e.width+e.height)){var k=document.createElement(\"canvas\"),c=k.getContext(\"2d\");k.width=e.width;k.height=e.height;c.drawImage(e,0,0);b.src=k.toDataURL(\"image/jpeg\")}--h||a(g)};e.src=b.url}}\nvar c,g=0,h=0;if(\"undefined\"!=typeof b.images)for(c in b.images)b.images.hasOwnProperty(c)&&e(b.images[c]);(b=h)||(a(g),b=void 0);return b}function pa(b,e,k){e.each(function(){var e=c(this).children(),g=0;if(c(this).is(\"div\")){var h=Z(M(this,\"background-color\"),[255,255,255]),x=Z(M(this,\"border-top-color\"),[0,0,0]),q=aa(this,\"border-top-width\",a.jspdf.unit),d=this.getBoundingClientRect(),f=this.offsetLeft*k.dw;g=this.offsetTop*k.dh;var l=d.width*k.dw;d=d.height*k.dh;k.doc.setDrawColor.apply(void 0,\nx);k.doc.setFillColor.apply(void 0,h);k.doc.setLineWidth(q);k.doc.rect(b.x+f,b.y+g,l,d,q?\"FD\":\"F\")}else if(c(this).is(\"img\")&&\"undefined\"!=typeof k.images&&(h=oa(this.src),h=k.images[h],\"undefined\"!=typeof h)){x=b.width/b.height;q=this.width/this.height;f=b.width;l=b.height;d=19.049976/25.4;q<=x?(l=Math.min(b.height,this.height),f=this.width*l/this.height):q>x&&(f=Math.min(b.width,this.width),l=this.height*f/this.width);f*=d;l*=d;l<b.height&&(g=(b.height-l)/2);try{k.doc.addImage(h.src,b.textPos.x,\nb.y+g,f,l)}catch(Ea){}b.textPos.x+=f}\"undefined\"!=typeof e&&0<e.length&&pa(b,e,k)})}function qa(b,e,a){if(\"function\"===typeof a.onAutotableText)a.onAutotableText(a.doc,b,e);else{var k=b.textPos.x,g=b.textPos.y,h={halign:b.styles.halign,valign:b.styles.valign};if(e.length){for(e=e[0];e.previousSibling;)e=e.previousSibling;for(var x=!1,q=!1;e;){var d=e.innerText||e.textContent||\"\";d=(d.length&&\" \"==d[0]?\" \":\"\")+c.trim(d)+(1<d.length&&\" \"==d[d.length-1]?\" \":\"\");c(e).is(\"br\")&&(k=b.textPos.x,g+=a.doc.internal.getFontSize());\nc(e).is(\"b\")?x=!0:c(e).is(\"i\")&&(q=!0);(x||q)&&a.doc.setFontType(x&&q?\"bolditalic\":x?\"bold\":\"italic\");var f=a.doc.getStringUnitWidth(d)*a.doc.internal.getFontSize();if(f){if(\"linebreak\"===b.styles.overflow&&k>b.textPos.x&&k+f>b.textPos.x+b.width){if(0<=\".,!%*;:=-\".indexOf(d.charAt(0))){var l=d.charAt(0);f=a.doc.getStringUnitWidth(l)*a.doc.internal.getFontSize();k+f<=b.textPos.x+b.width&&(a.doc.autoTableText(l,k,g,h),d=d.substring(1,d.length));f=a.doc.getStringUnitWidth(d)*a.doc.internal.getFontSize()}k=\nb.textPos.x;g+=a.doc.internal.getFontSize()}for(;d.length&&k+f>b.textPos.x+b.width;)d=d.substring(0,d.length-1),f=a.doc.getStringUnitWidth(d)*a.doc.internal.getFontSize();a.doc.autoTableText(d,k,g,h);k+=f}if(x||q)c(e).is(\"b\")?x=!1:c(e).is(\"i\")&&(q=!1),a.doc.setFontType(x||q?x?\"bold\":\"italic\":\"normal\");e=e.nextSibling}b.textPos.x=k;b.textPos.y=g}else a.doc.autoTableText(b.text,b.textPos.x,b.textPos.y,h)}}function ba(b,a,c){return b.replace(new RegExp(a.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g,\"\\\\$1\"),\n\"g\"),c)}function ea(b){b=ba(b||\"0\",a.numbers.html.thousandsSeparator,\"\");b=ba(b,a.numbers.html.decimalMark,\".\");return\"number\"===typeof b||!1!==jQuery.isNumeric(b)?b:!1}function Ba(b){-1<b.indexOf(\"%\")?(b=ea(b.replace(/%/g,\"\")),!1!==b&&(b/=100)):b=!1;return b}function z(b,e,k){var r=\"\";if(null!==b){var g=c(b);if(g[0].hasAttribute(\"data-tableexport-value\"))var h=(h=g.data(\"tableexport-value\"))?h+\"\":\"\";else if(h=g.html(),\"function\"===typeof a.onCellHtmlData)h=a.onCellHtmlData(g,e,k,h);else if(\"\"!=h){var d=\nc.parseHTML(h),f=0,l=0;h=\"\";c.each(d,function(){if(c(this).is(\"input\"))h+=g.find(\"input\").eq(f++).val();else if(c(this).is(\"select\"))h+=g.find(\"select option:selected\").eq(l++).text();else if(\"undefined\"===typeof c(this).html())h+=c(this).text();else if(void 0===jQuery().bootstrapTable||!0!==c(this).hasClass(\"filterControl\")&&0===c(b).parents(\".detail-view\").length)h+=c(this).html()})}if(!0===a.htmlContent)r=c.trim(h);else if(h&&\"\"!=h)if(\"\"!=c(b).data(\"tableexport-cellformat\")){var n=h.replace(/\\n/g,\n\"\\u2028\").replace(/<br\\s*[\\/]?>/gi,\"\\u2060\"),m=c(\"<div/>\").html(n).contents();d=!1;n=\"\";c.each(m.text().split(\"\\u2028\"),function(b,a){0<b&&(n+=\" \");n+=c.trim(a)});c.each(n.split(\"\\u2060\"),function(b,a){0<b&&(r+=\"\\n\");r+=c.trim(a).replace(/\\u00AD/g,\"\")});if(\"json\"==a.type||\"excel\"===a.type&&\"xmlss\"===a.excelFileFormat||!1===a.numbers.output)d=ea(r),!1!==d&&(r=Number(d));else if(a.numbers.html.decimalMark!=a.numbers.output.decimalMark||a.numbers.html.thousandsSeparator!=a.numbers.output.thousandsSeparator)if(d=\nea(r),!1!==d){m=(\"\"+d.substr(0>d?1:0)).split(\".\");1==m.length&&(m[1]=\"\");var p=3<m[0].length?m[0].length%3:0;r=(0>d?\"-\":\"\")+(a.numbers.output.thousandsSeparator?(p?m[0].substr(0,p)+a.numbers.output.thousandsSeparator:\"\")+m[0].substr(p).replace(/(\\d{3})(?=\\d)/g,\"$1\"+a.numbers.output.thousandsSeparator):m[0])+(m[1].length?a.numbers.output.decimalMark+m[1]:\"\")}}else r=h;!0===a.escape&&(r=escape(r));\"function\"===typeof a.onCellData&&(r=a.onCellData(g,e,k,r))}return r}function Ca(b,a,c){return a+\"-\"+c.toLowerCase()}\nfunction Z(b,a){(b=/^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/.exec(b))&&(a=[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]);return a}function ra(b){var a=M(b,\"text-align\"),k=M(b,\"font-weight\"),r=M(b,\"font-style\"),g=\"\";\"start\"==a&&(a=\"rtl\"==M(b,\"direction\")?\"right\":\"left\");700<=k&&(g=\"bold\");\"italic\"==r&&(g+=r);\"\"===g&&(g=\"normal\");a={style:{align:a,bcolor:Z(M(b,\"background-color\"),[255,255,255]),color:Z(M(b,\"color\"),[0,0,0]),fstyle:g},colspan:parseInt(c(b).attr(\"colspan\"))||0,rowspan:parseInt(c(b).attr(\"rowspan\"))||\n0};null!==b&&(b=b.getBoundingClientRect(),a.rect={width:b.width,height:b.height});return a}function M(b,a){try{return window.getComputedStyle?(a=a.replace(/([a-z])([A-Z])/,Ca),window.getComputedStyle(b,null).getPropertyValue(a)):b.currentStyle?b.currentStyle[a]:b.style[a]}catch(k){}return\"\"}function aa(b,a,c){a=M(b,a).match(/\\d+/);if(null!==a){a=a[0];b=b.parentElement;var e=document.createElement(\"div\");e.style.overflow=\"hidden\";e.style.visibility=\"hidden\";b.appendChild(e);e.style.width=100+c;c=100/\ne.offsetWidth;b.removeChild(e);return a*c}return 0}function fa(){if(!(this instanceof fa))return new fa;this.SheetNames=[];this.Sheets={}}function sa(b){for(var a=new ArrayBuffer(b.length),c=new Uint8Array(a),d=0;d!=b.length;++d)c[d]=b.charCodeAt(d)&255;return a}function Da(b){for(var a={},c={s:{c:1E7,r:1E7},e:{c:0,r:0}},d=0;d!=b.length;++d)for(var g=0;g!=b[d].length;++g){c.s.r>d&&(c.s.r=d);c.s.c>g&&(c.s.c=g);c.e.r<d&&(c.e.r=d);c.e.c<g&&(c.e.c=g);var h={v:b[d][g]};if(null!==h.v){var f=XLSX.utils.encode_cell({c:g,\nr:d});if(\"number\"===typeof h.v)h.t=\"n\";else if(\"boolean\"===typeof h.v)h.t=\"b\";else if(h.v instanceof Date){h.t=\"n\";h.z=XLSX.SSF._table[14];var q=h;var l=(Date.parse(h.v)-new Date(Date.UTC(1899,11,30)))/864E5;q.v=l}else h.t=\"s\";a[f]=h}}1E7>c.s.c&&(a[\"!ref\"]=XLSX.utils.encode_range(c));return a}function oa(b){var a=0,c;if(0===b.length)return a;var d=0;for(c=b.length;d<c;d++){var g=b.charCodeAt(d);a=(a<<5)-a+g;a|=0}return a}function H(b,a,c){var e=window.navigator.userAgent;if(!1!==b&&window.navigator.msSaveOrOpenBlob)window.navigator.msSaveOrOpenBlob(new Blob([c]),\nb);else if(!1!==b&&(0<e.indexOf(\"MSIE \")||e.match(/Trident.*rv\\:11\\./))){if(a=document.createElement(\"iframe\"))document.body.appendChild(a),a.setAttribute(\"style\",\"display:none\"),a.contentDocument.open(\"txt/html\",\"replace\"),a.contentDocument.write(c),a.contentDocument.close(),a.focus(),a.contentDocument.execCommand(\"SaveAs\",!0,b),document.body.removeChild(a)}else{var g=document.createElement(\"a\");if(g){var h=null;g.style.display=\"none\";!1!==b?g.download=b:g.target=\"_blank\";\"object\"==typeof c?(window.URL=\nwindow.URL||window.webkitURL,h=window.URL.createObjectURL(c),g.href=h):0<=a.toLowerCase().indexOf(\"base64,\")?g.href=a+L(c):g.href=a+encodeURIComponent(c);document.body.appendChild(g);if(document.createEvent)null===ca&&(ca=document.createEvent(\"MouseEvents\")),ca.initEvent(\"click\",!0,!1),g.dispatchEvent(ca);else if(document.createEventObject)g.fireEvent(\"onclick\");else if(\"function\"==typeof g.onclick)g.onclick();setTimeout(function(){h&&window.URL.revokeObjectURL(h);document.body.removeChild(g)},100)}}}\nfunction L(a){var b,c=\"\",d=0;if(\"string\"===typeof a){a=a.replace(/\\x0d\\x0a/g,\"\\n\");var g=\"\";for(b=0;b<a.length;b++){var h=a.charCodeAt(b);128>h?g+=String.fromCharCode(h):(127<h&&2048>h?g+=String.fromCharCode(h>>6|192):(g+=String.fromCharCode(h>>12|224),g+=String.fromCharCode(h>>6&63|128)),g+=String.fromCharCode(h&63|128))}a=g}for(;d<a.length;){var f=a.charCodeAt(d++);g=a.charCodeAt(d++);b=a.charCodeAt(d++);h=f>>2;f=(f&3)<<4|g>>4;var q=(g&15)<<2|b>>6;var l=b&63;isNaN(g)?q=l=64:isNaN(b)&&(l=64);c=c+\n\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".charAt(h)+\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".charAt(f)+\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".charAt(q)+\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".charAt(l)}return c}var a={consoleLog:!1,csvEnclosure:'\"',csvSeparator:\",\",csvUseBOM:!0,displayTableName:!1,escape:!1,excelFileFormat:\"xlshtml\",excelRTL:!1,excelstyles:[],exportHiddenCells:!1,fileName:\"tableExport\",\nhtmlContent:!1,ignoreColumn:[],ignoreRow:[],jsonScope:\"all\",jspdf:{orientation:\"p\",unit:\"pt\",format:\"a4\",margins:{left:20,right:10,top:10,bottom:10},onDocCreated:null,autotable:{styles:{cellPadding:2,rowHeight:12,fontSize:8,fillColor:255,textColor:50,fontStyle:\"normal\",overflow:\"ellipsize\",halign:\"left\",valign:\"middle\"},headerStyles:{fillColor:[52,73,94],textColor:255,fontStyle:\"bold\",halign:\"center\"},alternateRowStyles:{fillColor:245},tableExport:{doc:null,onAfterAutotable:null,onBeforeAutotable:null,\nonAutotableText:null,onTable:null,outputImages:!0}}},numbers:{html:{decimalMark:\".\",thousandsSeparator:\",\"},output:{decimalMark:\".\",thousandsSeparator:\",\"}},onCellData:null,onCellHtmlData:null,onIgnoreRow:null,onMsoNumberFormat:null,outputMode:\"file\",pdfmake:{enabled:!1,docDefinition:{pageOrientation:\"portrait\",defaultStyle:{font:\"Roboto\"}},fonts:{}},tbodySelector:\"tr\",tfootSelector:\"tr\",theadSelector:\"tr\",tableName:\"Table\",type:\"csv\",worksheetName:\"\"},v=this,ca=null,p=[],t=[],l=0,m=\"\",Q=[],G=[],\nK=[],R=!1;c.extend(!0,a,f);Q=O(v);if(\"csv\"==a.type||\"tsv\"==a.type||\"txt\"==a.type){var I=\"\",U=0;G=[];l=0;var ha=function(b,e,k){b.each(function(){m=\"\";B(this,e,l,k+b.length,function(b,c,e){var g=m,h=\"\";if(null!==b)if(b=z(b,c,e),c=null===b||\"\"===b?\"\":b.toString(),\"tsv\"==a.type)b instanceof Date&&b.toLocaleString(),h=ba(c,\"\\t\",\" \");else if(b instanceof Date)h=a.csvEnclosure+b.toLocaleString()+a.csvEnclosure;else if(h=ba(c,a.csvEnclosure,a.csvEnclosure+a.csvEnclosure),0<=h.indexOf(a.csvSeparator)||/[\\r\\n ]/g.test(h))h=\na.csvEnclosure+h+a.csvEnclosure;m=g+(h+(\"tsv\"==a.type?\"\\t\":a.csvSeparator))});m=c.trim(m).substring(0,m.length-1);0<m.length&&(0<I.length&&(I+=\"\\n\"),I+=m);l++});return b.length};U+=ha(c(v).find(\"thead\").first().find(a.theadSelector),\"th,td\",U);C(c(v),\"tbody\").each(function(){U+=ha(D(c(this),a.tbodySelector),\"td,th\",U)});a.tfootSelector.length&&ha(c(v).find(\"tfoot\").first().find(a.tfootSelector),\"td,th\",U);I+=\"\\n\";!0===a.consoleLog&&console.log(I);if(\"string\"===a.outputMode)return I;if(\"base64\"===\na.outputMode)return L(I);if(\"window\"===a.outputMode){H(!1,\"data:text/\"+(\"csv\"==a.type?\"csv\":\"plain\")+\";charset=utf-8,\",I);return}try{var A=new Blob([I],{type:\"text/\"+(\"csv\"==a.type?\"csv\":\"plain\")+\";charset=utf-8\"});saveAs(A,a.fileName+\".\"+a.type,\"csv\"!=a.type||!1===a.csvUseBOM)}catch(b){H(a.fileName+\".\"+a.type,\"data:text/\"+(\"csv\"==a.type?\"csv\":\"plain\")+\";charset=utf-8,\"+(\"csv\"==a.type&&a.csvUseBOM?\"\\ufeff\":\"\"),I)}}else if(\"sql\"==a.type){l=0;G=[];var w=\"INSERT INTO `\"+a.tableName+\"` (\";p=c(v).find(\"thead\").first().find(a.theadSelector);\np.each(function(){B(this,\"th,td\",l,p.length,function(a,c,k){w+=\"'\"+z(a,c,k)+\"',\"});l++;w=c.trim(w);w=c.trim(w).substring(0,w.length-1)});w+=\") VALUES \";t=u(c(v));c(t).each(function(){m=\"\";B(this,\"td,th\",l,p.length+t.length,function(a,c,k){m+=\"'\"+z(a,c,k)+\"',\"});3<m.length&&(w+=\"(\"+m,w=c.trim(w).substring(0,w.length-1),w+=\"),\");l++});w=c.trim(w).substring(0,w.length-1);w+=\";\";!0===a.consoleLog&&console.log(w);if(\"string\"===a.outputMode)return w;if(\"base64\"===a.outputMode)return L(w);try{A=new Blob([w],\n{type:\"text/plain;charset=utf-8\"}),saveAs(A,a.fileName+\".sql\")}catch(b){H(a.fileName+\".sql\",\"data:application/sql;charset=utf-8,\",w)}}else if(\"json\"==a.type){var S=[];G=[];p=c(v).find(\"thead\").first().find(a.theadSelector);p.each(function(){var a=[];B(this,\"th,td\",l,p.length,function(b,c,d){a.push(z(b,c,d))});S.push(a)});var ia=[];t=u(c(v));c(t).each(function(){var a={},e=0;B(this,\"td,th\",l,p.length+t.length,function(b,c,g){S.length?a[S[S.length-1][e]]=z(b,c,g):a[e]=z(b,c,g);e++});!1===c.isEmptyObject(a)&&\nia.push(a);l++});f=\"\";f=\"head\"==a.jsonScope?JSON.stringify(S):\"data\"==a.jsonScope?JSON.stringify(ia):JSON.stringify({header:S,data:ia});!0===a.consoleLog&&console.log(f);if(\"string\"===a.outputMode)return f;if(\"base64\"===a.outputMode)return L(f);try{A=new Blob([f],{type:\"application/json;charset=utf-8\"}),saveAs(A,a.fileName+\".json\")}catch(b){H(a.fileName+\".json\",\"data:application/json;charset=utf-8;base64,\",f)}}else if(\"xml\"===a.type){l=0;G=[];var J='<?xml version=\"1.0\" encoding=\"utf-8\"?>';J+=\"<tabledata><fields>\";\np=c(v).find(\"thead\").first().find(a.theadSelector);p.each(function(){B(this,\"th,td\",l,p.length,function(a,c,d){J+=\"<field>\"+z(a,c,d)+\"</field>\"});l++});J+=\"</fields><data>\";var ta=1;t=u(c(v));c(t).each(function(){var a=1;m=\"\";B(this,\"td,th\",l,p.length+t.length,function(b,c,d){m+=\"<column-\"+a+\">\"+z(b,c,d)+\"</column-\"+a+\">\";a++});0<m.length&&\"<column-1></column-1>\"!=m&&(J+='<row id=\"'+ta+'\">'+m+\"</row>\",ta++);l++});J+=\"</data></tabledata>\";!0===a.consoleLog&&console.log(J);if(\"string\"===a.outputMode)return J;\nif(\"base64\"===a.outputMode)return L(J);try{A=new Blob([J],{type:\"application/xml;charset=utf-8\"}),saveAs(A,a.fileName+\".xml\")}catch(b){H(a.fileName+\".xml\",\"data:application/xml;charset=utf-8;base64,\",J)}}else if(\"excel\"===a.type&&\"xmlss\"===a.excelFileFormat){var ja=[],F=[];c(v).filter(function(){return P(c(this))}).each(function(){function b(a,b,e){var g=[];c(a).each(function(){var b=0,h=0;m=\"\";B(this,\"td,th\",l,e+a.length,function(a,e,d){if(null!==a){var k=\"\";e=z(a,e,d);d=\"String\";if(!1!==jQuery.isNumeric(e))d=\n\"Number\";else{var f=Ba(e);!1!==f&&(e=f,d=\"Number\",k+=' ss:StyleID=\"pct1\"')}\"Number\"!==d&&(e=e.replace(/\\n/g,\"<br>\"));f=parseInt(a.getAttribute(\"colspan\"));a=parseInt(a.getAttribute(\"rowspan\"));g.forEach(function(a){if(l>=a.s.r&&l<=a.e.r&&h>=a.s.c&&h<=a.e.c)for(var c=0;c<=a.e.c-a.s.c;++c)h++,b++});if(a||f)a=a||1,f=f||1,g.push({s:{r:l,c:h},e:{r:l+a-1,c:h+f-1}});1<f&&(k+=' ss:MergeAcross=\"'+(f-1)+'\"',h+=f-1);1<a&&(k+=' ss:MergeDown=\"'+(a-1)+'\" ss:StyleID=\"rsp1\"');0<b&&(k+=' ss:Index=\"'+(h+1)+'\"',b=0);\nm+=\"<Cell\"+k+'><Data ss:Type=\"'+d+'\">'+c(\"<div />\").text(e).html()+\"</Data></Cell>\\r\";h++}});0<m.length&&(E+='<Row ss:AutoFitHeight=\"0\">\\r'+m+\"</Row>\\r\");l++});return a.length}var e=c(this),d=\"\";\"string\"===typeof a.worksheetName&&a.worksheetName.length?d=a.worksheetName+\" \"+(F.length+1):\"undefined\"!==typeof a.worksheetName[F.length]&&(d=a.worksheetName[F.length]);d.length||(d=e.find(\"caption\").text()||\"\");d.length||(d=\"Table \"+(F.length+1));d=d.replace(/[\\\\\\/[\\]*:?'\"]/g,\"\").substring(0,31).trim();\nF.push(c(\"<div />\").text(d).html());!1===a.exportHiddenCells&&(K=e.find(\"tr, th, td\").filter(\":hidden\"),R=0<K.length);l=0;Q=O(this);E=\"<Table>\\r\";d=0;d+=b(e.find(\"thead\").first().find(a.theadSelector),\"th,td\",d);b(u(e),\"td,th\",d);E+=\"</Table>\\r\";ja.push(E);!0===a.consoleLog&&console.log(E)});f={};for(var y={},n,N,T=0,Y=F.length;T<Y;T++)n=F[T],N=f[n],N=f[n]=null==N?1:N+1,2==N&&(F[y[n]]=F[y[n]].substring(0,29)+\"-1\"),1<f[n]?F[T]=F[T].substring(0,29)+\"-\"+f[n]:y[n]=T;f='<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\r<?mso-application progid=\"Excel.Sheet\"?>\\r<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\\r xmlns:o=\"urn:schemas-microsoft-com:office:office\"\\r xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\\r xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\\r xmlns:html=\"http://www.w3.org/TR/REC-html40\">\\r<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">\\r  <Created>'+\n(new Date).toISOString()+'</Created>\\r</DocumentProperties>\\r<OfficeDocumentSettings xmlns=\"urn:schemas-microsoft-com:office:office\">\\r  <AllowPNG/>\\r</OfficeDocumentSettings>\\r<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\\r  <WindowHeight>9000</WindowHeight>\\r  <WindowWidth>13860</WindowWidth>\\r  <WindowTopX>0</WindowTopX>\\r  <WindowTopY>0</WindowTopY>\\r  <ProtectStructure>False</ProtectStructure>\\r  <ProtectWindows>False</ProtectWindows>\\r</ExcelWorkbook>\\r<Styles>\\r  <Style ss:ID=\"Default\" ss:Name=\"Normal\">\\r    <Alignment ss:Vertical=\"Bottom\"/>\\r    <Borders/>\\r    <Font/>\\r    <Interior/>\\r    <NumberFormat/>\\r    <Protection/>\\r  </Style>\\r  <Style ss:ID=\"rsp1\">\\r    <Alignment ss:Vertical=\"Center\"/>\\r  </Style>\\r  <Style ss:ID=\"pct1\">\\r    <NumberFormat ss:Format=\"Percent\"/>\\r  </Style>\\r</Styles>\\r';\nfor(y=0;y<ja.length;y++)f+='<Worksheet ss:Name=\"'+F[y]+'\" ss:RightToLeft=\"'+(a.excelRTL?\"1\":\"0\")+'\">\\r'+ja[y],f=a.excelRTL?f+'<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">\\r<DisplayRightToLeft/>\\r</WorksheetOptions>\\r':f+'<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\"/>\\r',f+=\"</Worksheet>\\r\";f+=\"</Workbook>\\r\";!0===a.consoleLog&&console.log(f);if(\"string\"===a.outputMode)return f;if(\"base64\"===a.outputMode)return L(f);try{A=new Blob([f],{type:\"application/xml;charset=utf-8\"}),\nsaveAs(A,a.fileName+\".xml\")}catch(b){H(a.fileName+\".xml\",\"data:application/xml;charset=utf-8;base64,\",f)}}else if(\"excel\"==a.type||\"xls\"==a.type||\"word\"==a.type||\"doc\"==a.type){f=\"excel\"==a.type||\"xls\"==a.type?\"excel\":\"word\";y=\"excel\"==f?\"xls\":\"doc\";n='xmlns:x=\"urn:schemas-microsoft-com:office:'+f+'\"';var E=\"\",V=\"\";c(v).filter(function(){return P(c(this))}).each(function(){var b=c(this);\"\"===V&&(V=a.worksheetName||b.find(\"caption\").text()||\"Table\",V=V.replace(/[\\\\\\/[\\]*:?'\"]/g,\"\").substring(0,31).trim());\n!1===a.exportHiddenCells&&(K=b.find(\"tr, th, td\").filter(\":hidden\"),R=0<K.length);l=0;G=[];Q=O(this);E+=\"<table><thead>\";p=b.find(\"thead\").first().find(a.theadSelector);p.each(function(){m=\"\";B(this,\"th,td\",l,p.length,function(b,d,f){if(null!==b){var e=\"\";m+=\"<th\";for(var h in a.excelstyles)if(a.excelstyles.hasOwnProperty(h)){var k=c(b).css(a.excelstyles[h]);\"\"!==k&&\"0px none rgb(0, 0, 0)\"!=k&&\"rgba(0, 0, 0, 0)\"!=k&&(e+=\"\"===e?'style=\"':\";\",e+=a.excelstyles[h]+\":\"+k)}\"\"!==e&&(m+=\" \"+e+'\"');c(b).is(\"[colspan]\")&&\n(m+=' colspan=\"'+c(b).attr(\"colspan\")+'\"');c(b).is(\"[rowspan]\")&&(m+=' rowspan=\"'+c(b).attr(\"rowspan\")+'\"');m+=\">\"+z(b,d,f)+\"</th>\"}});0<m.length&&(E+=\"<tr>\"+m+\"</tr>\");l++});E+=\"</thead><tbody>\";t=u(b);c(t).each(function(){var b=c(this);m=\"\";B(this,\"td,th\",l,p.length+t.length,function(e,d,g){if(null!==e){var h=z(e,d,g),k=\"\",f=c(e).data(\"tableexport-msonumberformat\");\"undefined\"==typeof f&&\"function\"===typeof a.onMsoNumberFormat&&(f=a.onMsoNumberFormat(e,d,g));\"undefined\"!=typeof f&&\"\"!==f&&(k=\"style=\\\"mso-number-format:'\"+\nf+\"'\");for(var l in a.excelstyles)a.excelstyles.hasOwnProperty(l)&&(f=c(e).css(a.excelstyles[l]),\"\"===f&&(f=b.css(a.excelstyles[l])),\"\"!==f&&\"0px none rgb(0, 0, 0)\"!=f&&\"rgba(0, 0, 0, 0)\"!=f&&(k+=\"\"===k?'style=\"':\";\",k+=a.excelstyles[l]+\":\"+f));m+=\"<td\";\"\"!==k&&(m+=\" \"+k+'\"');c(e).is(\"[colspan]\")&&(m+=' colspan=\"'+c(e).attr(\"colspan\")+'\"');c(e).is(\"[rowspan]\")&&(m+=' rowspan=\"'+c(e).attr(\"rowspan\")+'\"');\"string\"===typeof h&&\"\"!=h&&(h=h.replace(/\\n/g,\"<br>\"));m+=\">\"+h+\"</td>\"}});0<m.length&&(E+=\"<tr>\"+\nm+\"</tr>\");l++});a.displayTableName&&(E+=\"<tr><td></td></tr><tr><td></td></tr><tr><td>\"+z(c(\"<p>\"+a.tableName+\"</p>\"))+\"</td></tr>\");E+=\"</tbody></table>\";!0===a.consoleLog&&console.log(E)});n='<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" '+n+' xmlns=\"http://www.w3.org/TR/REC-html40\">'+('<meta http-equiv=\"content-type\" content=\"application/vnd.ms-'+f+'; charset=UTF-8\">')+\"<head>\";\"excel\"===f&&(n+=\"\\x3c!--[if gte mso 9]>\",n+=\"<xml>\",n+=\"<x:ExcelWorkbook>\",n+=\"<x:ExcelWorksheets>\",n+=\"<x:ExcelWorksheet>\",\nn+=\"<x:Name>\",n+=V,n+=\"</x:Name>\",n+=\"<x:WorksheetOptions>\",n+=\"<x:DisplayGridlines/>\",a.excelRTL&&(n+=\"<x:DisplayRightToLeft/>\"),n+=\"</x:WorksheetOptions>\",n+=\"</x:ExcelWorksheet>\",n+=\"</x:ExcelWorksheets>\",n+=\"</x:ExcelWorkbook>\",n+=\"</xml>\",n+=\"<![endif]--\\x3e\");n+=\"<style>br {mso-data-placement:same-cell;}</style>\";n+=\"</head>\";n+=\"<body>\";n+=E;n+=\"</body>\";n+=\"</html>\";!0===a.consoleLog&&console.log(n);if(\"string\"===a.outputMode)return n;if(\"base64\"===a.outputMode)return L(n);try{A=new Blob([n],\n{type:\"application/vnd.ms-\"+a.type}),saveAs(A,a.fileName+\".\"+y)}catch(b){H(a.fileName+\".\"+y,\"data:application/vnd.ms-\"+f+\";base64,\",n)}}else if(\"xlsx\"==a.type){var ua=[],ka=[];l=0;t=c(v).find(\"thead\").first().find(a.theadSelector);t.push.apply(t,u(c(v)));c(t).each(function(){var b=[];B(this,\"th,td\",l,t.length,function(c,d,f){if(\"undefined\"!==typeof c&&null!==c){f=z(c,d,f);d=parseInt(c.getAttribute(\"colspan\"));c=parseInt(c.getAttribute(\"rowspan\"));ka.forEach(function(a){if(l>=a.s.r&&l<=a.e.r&&b.length>=\na.s.c&&b.length<=a.e.c)for(var c=0;c<=a.e.c-a.s.c;++c)b.push(null)});if(c||d)d=d||1,ka.push({s:{r:l,c:b.length},e:{r:l+(c||1)-1,c:b.length+d-1}});\"function\"!==typeof a.onCellData&&\"\"!==f&&f==+f&&(f=+f);b.push(\"\"!==f?f:null);if(d)for(c=0;c<d-1;++c)b.push(null)}});ua.push(b);l++});f=new fa;y=Da(ua);y[\"!merges\"]=ka;f.SheetNames.push(a.worksheetName);f.Sheets[a.worksheetName]=y;f=XLSX.write(f,{bookType:a.type,bookSST:!1,type:\"binary\"});try{A=new Blob([sa(f)],{type:\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8\"}),\nsaveAs(A,a.fileName+\".\"+a.type)}catch(b){H(a.fileName+\".\"+a.type,\"data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8,\",sa(f))}}else if(\"png\"==a.type)html2canvas(c(v)[0]).then(function(b){b=b.toDataURL();for(var c=atob(b.substring(22)),d=new ArrayBuffer(c.length),f=new Uint8Array(d),g=0;g<c.length;g++)f[g]=c.charCodeAt(g);!0===a.consoleLog&&console.log(c);if(\"string\"===a.outputMode)return c;if(\"base64\"===a.outputMode)return L(b);if(\"window\"===a.outputMode)window.open(b);\nelse try{A=new Blob([d],{type:\"image/png\"}),saveAs(A,a.fileName+\".png\")}catch(h){H(a.fileName+\".png\",\"data:image/png,\",A)}});else if(\"pdf\"==a.type)if(!0===a.pdfmake.enabled){f=[];var va=[];l=0;G=[];y=function(a,d,f){var b=0;c(a).each(function(){var a=[];B(this,d,l,f,function(b,c,d){if(\"undefined\"!==typeof b&&null!==b){var e=parseInt(b.getAttribute(\"colspan\")),g=parseInt(b.getAttribute(\"rowspan\"));b=z(b,c,d)||\" \";1<e||1<g?a.push({colSpan:e||1,rowSpan:g||1,text:b}):a.push(b)}else a.push(\" \")});a.length&&\nva.push(a);b<a.length&&(b=a.length);l++});return b};p=c(this).find(\"thead\").first().find(a.theadSelector);n=y(p,\"th,td\",p.length);for(N=f.length;N<n;N++)f.push(\"*\");t=u(c(this));y(t,\"th,td\",p.length+t.length);f={content:[{table:{headerRows:p.length,widths:f,body:va}}]};c.extend(!0,f,a.pdfmake.docDefinition);pdfMake.fonts={Roboto:{normal:\"Roboto-Regular.ttf\",bold:\"Roboto-Medium.ttf\",italics:\"Roboto-Italic.ttf\",bolditalics:\"Roboto-MediumItalic.ttf\"}};c.extend(!0,pdfMake.fonts,a.pdfmake.fonts);pdfMake.createPdf(f).getBuffer(function(b){try{var c=\nnew Blob([b],{type:\"application/pdf\"});saveAs(c,a.fileName+\".pdf\")}catch(k){H(a.fileName+\".pdf\",\"data:application/pdf;base64,\",b)}})}else if(!1===a.jspdf.autotable){f={dim:{w:aa(c(v).first().get(0),\"width\",\"mm\"),h:aa(c(v).first().get(0),\"height\",\"mm\")},pagesplit:!1};var wa=new jsPDF(a.jspdf.orientation,a.jspdf.unit,a.jspdf.format);wa.addHTML(c(v).first(),a.jspdf.margins.left,a.jspdf.margins.top,f,function(){la(wa,!1)})}else{var d=a.jspdf.autotable.tableExport;if(\"string\"===typeof a.jspdf.format&&\n\"bestfit\"===a.jspdf.format.toLowerCase()){var W={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89]},da=\"\",X=\"\",xa=0;c(v).each(function(){if(P(c(this))){var a=aa(c(this).get(0),\"width\",\"pt\");if(a>xa){a>W.a0[0]&&(da=\"a0\",X=\"l\");for(var d in W)W.hasOwnProperty(d)&&W[d][1]>a&&(da=d,X=\"l\",W[d][0]>a&&(X=\"p\"));xa=a}}});a.jspdf.format=\"\"===da?\"a4\":da;a.jspdf.orientation=\"\"===X?\"w\":X}if(null==d.doc&&(d.doc=new jsPDF(a.jspdf.orientation,a.jspdf.unit,a.jspdf.format),\n\"function\"===typeof a.jspdf.onDocCreated))a.jspdf.onDocCreated(d.doc);!0===d.outputImages&&(d.images={});\"undefined\"!=typeof d.images&&(c(v).filter(function(){return P(c(this))}).each(function(){var b=0;G=[];!1===a.exportHiddenCells&&(K=c(this).find(\"tr, th, td\").filter(\":hidden\"),R=0<K.length);p=c(this).find(\"thead\").find(a.theadSelector);t=u(c(this));c(t).each(function(){B(this,\"td,th\",p.length+b,p.length+t.length,function(a){if(\"undefined\"!==typeof a&&null!==a){var b=c(a).children();\"undefined\"!=\ntypeof b&&0<b.length&&na(a,b,d)}});b++})}),p=[],t=[]);Aa(d,function(){c(v).filter(function(){return P(c(this))}).each(function(){var b;l=0;G=[];!1===a.exportHiddenCells&&(K=c(this).find(\"tr, th, td\").filter(\":hidden\"),R=0<K.length);Q=O(this);d.columns=[];d.rows=[];d.rowoptions={};if(\"function\"===typeof d.onTable&&!1===d.onTable(c(this),a))return!0;a.jspdf.autotable.tableExport=null;var e=c.extend(!0,{},a.jspdf.autotable);a.jspdf.autotable.tableExport=d;e.margin={};c.extend(!0,e.margin,a.jspdf.margins);\ne.tableExport=d;\"function\"!==typeof e.beforePageContent&&(e.beforePageContent=function(a){1==a.pageCount&&a.table.rows.concat(a.table.headerRow).forEach(function(b){0<b.height&&(b.height+=(2-1.15)/2*b.styles.fontSize,a.table.height+=(2-1.15)/2*b.styles.fontSize)})});\"function\"!==typeof e.createdHeaderCell&&(e.createdHeaderCell=function(a,b){a.styles=c.extend({},b.row.styles);if(\"undefined\"!=typeof d.columns[b.column.dataKey]){var g=d.columns[b.column.dataKey];if(\"undefined\"!=typeof g.rect){a.contentWidth=\ng.rect.width;if(\"undefined\"==typeof d.heightRatio||0===d.heightRatio){var f=b.row.raw[b.column.dataKey].rowspan?b.row.raw[b.column.dataKey].rect.height/b.row.raw[b.column.dataKey].rowspan:b.row.raw[b.column.dataKey].rect.height;d.heightRatio=a.styles.rowHeight/f}f=b.row.raw[b.column.dataKey].rect.height*d.heightRatio;f>a.styles.rowHeight&&(a.styles.rowHeight=f)}\"undefined\"!=typeof g.style&&!0!==g.style.hidden&&(a.styles.halign=g.style.align,\"inherit\"===e.styles.fillColor&&(a.styles.fillColor=g.style.bcolor),\n\"inherit\"===e.styles.textColor&&(a.styles.textColor=g.style.color),\"inherit\"===e.styles.fontStyle&&(a.styles.fontStyle=g.style.fstyle))}});\"function\"!==typeof e.createdCell&&(e.createdCell=function(a,b){b=d.rowoptions[b.row.index+\":\"+b.column.dataKey];\"undefined\"!=typeof b&&\"undefined\"!=typeof b.style&&!0!==b.style.hidden&&(a.styles.halign=b.style.align,\"inherit\"===e.styles.fillColor&&(a.styles.fillColor=b.style.bcolor),\"inherit\"===e.styles.textColor&&(a.styles.textColor=b.style.color),\"inherit\"===\ne.styles.fontStyle&&(a.styles.fontStyle=b.style.fstyle))});\"function\"!==typeof e.drawHeaderCell&&(e.drawHeaderCell=function(a,b){var c=d.columns[b.column.dataKey];return(!0!==c.style.hasOwnProperty(\"hidden\")||!0!==c.style.hidden)&&0<=c.rowIndex?ma(a,b,c):!1});\"function\"!==typeof e.drawCell&&(e.drawCell=function(a,b){var c=d.rowoptions[b.row.index+\":\"+b.column.dataKey];if(ma(a,b,c))if(d.doc.rect(a.x,a.y,a.width,a.height,a.styles.fillStyle),\"undefined\"!=typeof c&&\"undefined\"!=typeof c.kids&&0<c.kids.length){b=\na.height/c.rect.height;if(b>d.dh||\"undefined\"==typeof d.dh)d.dh=b;d.dw=a.width/c.rect.width;b=a.textPos.y;pa(a,c.kids,d);a.textPos.y=b;qa(a,c.kids,d)}else qa(a,{},d);return!1});d.headerrows=[];p=c(this).find(\"thead\").find(a.theadSelector);p.each(function(){b=0;d.headerrows[l]=[];B(this,\"th,td\",l,p.length,function(a,c,e){var f=ra(a);f.title=z(a,c,e);f.key=b++;f.rowIndex=l;d.headerrows[l].push(f)});l++});if(0<l)for(var f=l-1;0<=f;)c.each(d.headerrows[f],function(){var a=this;0<f&&null===this.rect&&\n(a=d.headerrows[f-1][this.key]);null!==a&&0<=a.rowIndex&&(!0!==a.style.hasOwnProperty(\"hidden\")||!0!==a.style.hidden)&&d.columns.push(a)}),f=0<d.columns.length?-1:f-1;var m=0;t=[];t=u(c(this));c(t).each(function(){var a=[];b=0;B(this,\"td,th\",l,p.length+t.length,function(e,f,g){if(\"undefined\"===typeof d.columns[b]){var h={title:\"\",key:b,style:{hidden:!0}};d.columns.push(h)}\"undefined\"!==typeof e&&null!==e?(h=ra(e),h.kids=c(e).children()):(h=c.extend(!0,{},d.rowoptions[m+\":\"+(b-1)]),h.colspan=-1);d.rowoptions[m+\n\":\"+b++]=h;a.push(z(e,f,g))});a.length&&(d.rows.push(a),m++);l++});if(\"function\"===typeof d.onBeforeAutotable)d.onBeforeAutotable(c(this),d.columns,d.rows,e);d.doc.autoTable(d.columns,d.rows,e);if(\"function\"===typeof d.onAfterAutotable)d.onAfterAutotable(c(this),e);a.jspdf.autotable.startY=d.doc.autoTableEndPosY()+e.margin.top});la(d.doc,\"undefined\"!=typeof d.images&&!1===jQuery.isEmptyObject(d.images));\"undefined\"!=typeof d.headerrows&&(d.headerrows.length=0);\"undefined\"!=typeof d.columns&&(d.columns.length=\n0);\"undefined\"!=typeof d.rows&&(d.rows.length=0);delete d.doc;d.doc=null})}return this}})})(jQuery);"
  },
  {
    "path": "server/static/scripts/App.js",
    "content": "$(function () {\n\n\t// init bootstrap alerts\n\t$(\".alert\").alert();\n\n\tvar store = new StoreDevtools();\n\tnew SitemapController({\n\t\tstore: store,\n\t\ttemplateDir: 'views/'\n\t});\n});"
  },
  {
    "path": "server/static/scripts/BackgroundScript.js",
    "content": "/**\n * ContentScript that can be called from anywhere within the extension\n */\nvar BackgroundScript = {\n\n\tdummy: function() {\n\n\t\treturn $.Deferred().resolve(\"dummy\").promise();\n\t},\n\n\t/**\n\t * Returns the id of the tab that is visible to user\n\t * @returns $.Deferred() integer\n\t */\n\tgetActiveTabId: function() {\n\n\t\tvar deferredResponse = $.Deferred();\n\n\t\t// chrome.tabs.query({\n\t\t// \tactive: true,\n\t\t// \tcurrentWindow: true\n\t\t// }, function (tabs) {\n        //\n\t\t// \tif (tabs.length < 1) {\n\t\t// \t\t// @TODO must be running within popup. maybe find another active window?\n\t\t// \t\tdeferredResponse.reject(\"couldn't find the active tab\");\n\t\t// \t}\n\t\t// \telse {\n\t\t// \t\tvar tabId = tabs[0].id;\n\t\t// \t\tdeferredResponse.resolve(tabId);\n\t\t// \t}\n\t\t// });\n\t\treturn deferredResponse.promise();\n\t},\n\n\tincrementDailyStat: function(request) {\n\n\t\tvar stats = window.stats;\n\t\treturn stats.incrementDailyStat(request.key, request.increment);\n\t},\n\n\tsetDailyStat: function(request) {\n\n\t\tvar stats = window.stats;\n\t\treturn stats.setDailyStat(request.key, request.value);\n\t},\n\n\tupdateExtensionIsBeingUsed: function() {\n\n\t\tvar stats = window.stats;\n\t\tstats.updateExtensionIsBeingUsed();\n\t\treturn $.Deferred().resolve().promise();\n\t},\n\n\t/**\n\t * Execute a function within the active tab within content script\n\t * @param request.fn\tfunction to call\n\t * @param request.request\trequest that will be passed to the function\n\t */\n\texecuteContentScript: function(request) {\n\n\t\tvar reqToContentScript = {\n\t\t\tcontentScriptCall: true,\n\t\t\tfn: request.fn,\n\t\t\trequest: request.request\n\t\t};\n\t\tvar deferredResponse = $.Deferred();\n\t\t// var deferredActiveTabId = this.getActiveTabId();\n\t\t// deferredActiveTabId.done(function(tabId) {\n\t\t// \tchrome.tabs.sendMessage(tabId, reqToContentScript, function(response) {\n\t\t// \t\tdeferredResponse.resolve(response);\n\t\t// \t});\n\t\t// });\n        //\n\t\treturn deferredResponse;\n\t}\n};\n\n/**\n * @param location\tconfigure from where the content script is being accessed (ContentScript, BackgroundPage, DevTools)\n * @returns BackgroundScript\n */\nvar getBackgroundScript = function(location) {\n\n\t// Handle calls from different places\n\tif(location === \"BackgroundScript\") {\n\t\treturn BackgroundScript;\n\t}\n\telse if(location === \"DevTools\" || location === \"ContentScript\") {\n\n\t\t// if called within background script proxy calls to content script\n\t\tvar backgroundScript = {};\n\n\t\tObject.keys(BackgroundScript).forEach(function(attr) {\n\t\t\tif(typeof BackgroundScript[attr] === 'function') {\n\t\t\t\tbackgroundScript[attr] = function(request) {\n\n\t\t\t\t\tvar reqToBackgroundScript = {\n\t\t\t\t\t\tbackgroundScriptCall: true,\n\t\t\t\t\t\tfn: attr,\n\t\t\t\t\t\trequest: request\n\t\t\t\t\t};\n\n\t\t\t\t\tvar deferredResponse = $.Deferred();\n\n\t\t\t\t\t// chrome.runtime.sendMessage(reqToBackgroundScript, function(response) {\n\t\t\t\t\t// \tdeferredResponse.resolve(response);\n\t\t\t\t\t// });\n\n\t\t\t\t\treturn deferredResponse;\n\t\t\t\t};\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundScript[attr] = BackgroundScript[attr];\n\t\t\t}\n\t\t});\n\n\t\treturn backgroundScript;\n\t}\n\telse {\n\t\tthrow \"Invalid BackgroundScript initialization - \" + location;\n\t}\n};"
  },
  {
    "path": "server/static/scripts/ChromePopupBrowser.js",
    "content": "var ChromePopupBrowser = function (options) {\n\n\tthis.pageLoadDelay = options.pageLoadDelay;\n\n\t// @TODO somehow handle the closed window\n};\n\nChromePopupBrowser.prototype = {\n\n\t_initPopupWindow: function (callback, scope) {\n\n\t\tvar browser = this;\n\t\tif (this.window !== undefined) {\n\t\t\tconsole.log(JSON.stringify(this.window));\n\t\t\t// check if tab exists\n\t\t\tchrome.tabs.get(this.tab.id, function (tab) {\n\t\t\t\tif (!tab) {\n\t\t\t\t\tthrow \"Scraping window closed\";\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t\tcallback.call(scope);\n\t\t\treturn;\n\t\t}\n\n\t\tchrome.windows.create({'type': 'popup', width: 1042, height: 768, focused: true, url: 'chrome://newtab'}, function (window) {\n\t\t\tbrowser.window = window;\n\t\t\tbrowser.tab = window.tabs[0];\n\n\n\t\t\tcallback.call(scope);\n\t\t});\n\t},\n\n\tloadUrl: function (url, callback) {\n\n\t\tvar tab = this.tab;\n\n\t\tvar tabLoadListener = function (tabId, changeInfo, tab) {\n\t\t\tif(tabId === this.tab.id) {\n\t\t\t\tif (changeInfo.status === 'complete') {\n\n\t\t\t\t\t// @TODO check url ? maybe it would be bad because some sites might use redirects\n\n\t\t\t\t\t// remove event listener\n\t\t\t\t\tchrome.tabs.onUpdated.removeListener(tabLoadListener);\n\n\t\t\t\t\t// callback tab is loaded after page load delay\n\t\t\t\t\tsetTimeout(callback, this.pageLoadDelay);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this);\n\t\tchrome.tabs.onUpdated.addListener(tabLoadListener);\n\n\t\tchrome.tabs.update(tab.id, {url: url});\n\t},\n\n\tclose: function () {\n\t\tchrome.windows.remove(this.window.id);\n\t},\n\n\tfetchData: function (url, sitemap, parentSelectorId, callback, scope) {\n\n\t\tvar browser = this;\n\n\t\tthis._initPopupWindow(function () {\n\t\t\tvar tab = browser.tab;\n\n\t\t\tbrowser.loadUrl(url, function () {\n\n\t\t\t\tvar message = {\n\t\t\t\t\textractData: true,\n\t\t\t\t\tsitemap: JSON.parse(JSON.stringify(sitemap)),\n\t\t\t\t\tparentSelectorId: parentSelectorId\n\t\t\t\t};\n\n\t\t\t\tchrome.tabs.sendMessage(tab.id, message, function (data) {\n\t\t\t\t\tconsole.log(\"extracted data from web page\", data);\n\t\t\t\t\tcallback.call(scope, data);\n\t\t\t\t});\n\t\t\t}.bind(this));\n\t\t}, this);\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Config.js",
    "content": "var Config = function () {\n\n};\n\nConfig.prototype = {\n\n\tsitemapDb: '<use loadConfiguration()>',\n\tdataDb: '<use loadConfiguration()>',\n\n\tdefaults: {\n\t\tstorageType: \"local\",\n\t\t// this is where sitemap documents are stored\n\t\tsitemapDb: \"scraper-sitemaps\",\n\t\t// this is where scraped data is stored.\n\t\t// empty for local storage\n\t\tdataDb: \"\"\n\t},\n\n\t/**\n\t * Loads configuration from chrome extension sync storage\n\t */\n\tloadConfiguration: function (callback) {\n\n\t\tchrome.storage.sync.get(['sitemapDb', 'dataDb', 'storageType'], function (items) {\n\n\t\t\tthis.storageType = items.storageType || this.defaults.storageType;\n\t\t\tif (this.storageType === 'local') {\n\t\t\t\tthis.sitemapDb = this.defaults.sitemapDb;\n\t\t\t\tthis.dataDb = this.defaults.dataDb;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.sitemapDb = items.sitemapDb || this.defaults.sitemapDb;\n\t\t\t\tthis.dataDb = items.dataDb || this.defaults.dataDb;\n\t\t\t}\n\n\t\t\tcallback();\n\t\t}.bind(this));\n\t},\n\n\t/**\n\t * Saves configuration to chrome extension sync storage\n\t * @param {type} items\n\t * @param {type} callback\n\t * @returns {undefined}\n\t */\n\tupdateConfiguration: function (items, callback) {\n\t\tchrome.storage.sync.set(items, callback);\n\t}\n};"
  },
  {
    "path": "server/static/scripts/ContentScript.js",
    "content": "/**\n * ContentScript that can be called from anywhere within the extension\n */\nvar ContentScript = {\n\t/**\n\t * Fetch\n\t * @param request.CSSSelector\tCSS选择器的字符串\n\t * @returns $.Deferred()\n\t */\n\tgetHTML: function(request) {\n\t\tvar deferredHTML = $.Deferred();\n\t\tvar html = $(request.CSSSelector).clone().wrap('<p>').parent().html();\n\t\tdeferredHTML.resolve(html);\n\t\treturn deferredHTML.promise();\n\t},\n\n\t/**\n\t * 删除当前选择器内容\n\t * @returns $.Deferred()\n\t */\n\tremoveCurrentContentSelector: function() {\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar contentSelector = window.cs;\n\t\tif(contentSelector === undefined) {\n\t\t\tdeferredResponse.resolve();\n\t\t} else {\n\t\t\tcontentSelector.removeGUI();\n\t\t\twindow.cs = undefined;\n\t\t\tdeferredResponse.resolve();\n\t\t}\n\t\treturn deferredResponse.promise();\n\t},\n\n\t/**\n\t * 在iframe页面内选择元素\n\t * @param request.parentCSSSelector\n\t * @param request.allowedElements\n\t */\n\tselectSelector: function(request) {\n\t\t// Deferred对象\n\t\tvar deferredResponse = $.Deferred();\n\t\t// 初始化当前选择器\n\t\tthis.removeCurrentContentSelector().done(function() {\n\t\t\t// ContentSelector选择器对象(使用iframe中对象)\n\t\t\t// var contentSelector = new ContentSelector({\n\t\t\tvar contentSelector = new window.collect.ContentSelector({\n\t\t\t\tparentCSSSelector: request.parentCSSSelector,\n\t\t\t\tallowedElements: request.allowedElements,\n\t\t\t\tselectorType: request.selectorType\n\t\t\t});\n\t\t\twindow.cs = contentSelector;\n\t\t\t// 初始化css选择器\n\t\t\tvar deferredCSSSelector = contentSelector.getCSSSelector();\n\t\t\t// 当前选择\n\t\t\tdeferredCSSSelector\n\t\t\t// 初始化当前选择器对象\n\t\t\t.done(function(response) {\n\t\t\t\tthis.removeCurrentContentSelector().done(function(){\n\t\t\t\t\tdeferredResponse.resolve(response);\n\t\t\t\t\twindow.cs = undefined;\n\t\t\t\t}.bind(this));\n\t\t\t}.bind(this))\n\t\t\t// 失败方法\n\t\t\t.fail(function(message) {\n\t\t\t\tdeferredResponse.reject(message);\n\t\t\t\twindow.cs = undefined;\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\n\t\treturn deferredResponse.promise();\n\t},\n\n\t/**\n\t * 选择器-显示元素\n\t * @param request.parentCSSSelector\n\t * @param request.elementCSSSelector\n\t */\n\tpreviewSelector: function(request) {\n\t\tvar deferredResponse = $.Deferred();\n\t\tthis.removeCurrentContentSelector().done(function () {\n\t\t\t// var contentSelector = new ContentSelector({\n\t\t\tvar contentSelector = new window.collect.ContentSelector({\n\t\t\t\tparentCSSSelector: request.parentCSSSelector\n\t\t\t});\n\t\t\twindow.cs = contentSelector;\n\t\t\tvar deferredSelectorPreview = contentSelector.previewSelector(request.elementCSSSelector);\n\t\t\tdeferredSelectorPreview.done(function() {\n\t\t\t\tdeferredResponse.resolve();\n\t\t\t}).fail(function(message) {\n\t\t\t\tdeferredResponse.reject(message);\n\t\t\t\twindow.cs = undefined;\n\t\t\t});\n\t\t});\n\t\treturn deferredResponse;\n\t}\n};\n\nvar getContentScript = function(location) {\n\tvar contentScript = {};\n\t// 处理不同地方的请求\n\tif(location === \"ContentScript\") {\n\t\tcontentScript = ContentScript;\n\t\treturn contentScript;\n\t} else if(location === \"BackgroundScript\" || location === \"DevTools\") {\n\t\t// 后台调用\n\t\tObject.keys(ContentScript).forEach(function(attr) {\n\t\t\tcontentScript[attr] = ContentScript[attr];\n\t\t});\n\t\treturn contentScript;\n\t} else {\n\t\tthrow \"Invalid ContentScript initialization - \" + location;\n\t}\n};"
  },
  {
    "path": "server/static/scripts/ContentSelector.js",
    "content": "/**\n * @param options.parentCSSSelector\tElements can be only selected within this element\n * @param options.allowedElements\tElements that can only be selected\n * @constructor\n */\nContentSelector = function(options) {\n\t// deferred返回对象\n\tthis.deferredCSSSelectorResponse = $.Deferred();\n\t// 允许选择的元素\n\tthis.allowedElements = options.allowedElements;\n\t// 父容器选择器\n\tthis.parentCSSSelector = options.parentCSSSelector.trim();\n\t// 选择器类型\n\tthis.selectorType = options.selectorType;\n\t// alert函数\n\t// this.alert = options.alert || function(txt) {alert(txt);};\n\t// 父选择器\n\tif(this.parentCSSSelector) {\n\t\tthis.parent = $(this.parentCSSSelector)[0];\n\t\t// 父选择器未找到时的情况\n\t\tif(this.parent === undefined) {\n\t\t\t// this.deferredCSSSelectorResponse.reject(\"parent selector not found\");\n\t\t\t// this.alert(\"Parent element not found!\");\n\t\t\t// console.log(\"父元素未找到!\");\n\t\t\t// return;\n\t\t\tthis.parent = $(\"body\")[0];\n\t\t}\n\t} else {\n\t\tthis.parent = $(\"body\")[0];\n\t}\n};\n\nContentSelector.prototype = {\n\t/**\n\t * 用户选择css选择器\n\t */\n\tgetCSSSelector: function() {\n\t\tif(this.deferredCSSSelectorResponse.state() !== \"rejected\") {\n\t\t\t// 用户选择的元素\n\t\t\tthis.selectedElements = [];\n\t\t\t// 当前元素的父子元素层级(相对于当前元素)\n\t\t\tthis.top = 0;\n\t\t\t// 初始化选择器\n\t\t\tthis.initCssSelector(false);\n\t\t\t// 开启选择器\n\t\t\tthis.initGUI();\n\t\t}\n\t\treturn this.deferredCSSSelectorResponse.promise();\n\t},\n\t// 获取选择器\n\tgetCurrentCSSSelector: function() {\n\t\t// 有效选择\n\t\tif(this.selectedElements && this.selectedElements.length > 0) {\n\t\t\t// 返回结果\n\t\t\tvar cssSelector;\n\t\t\t// 选择集中包含父容器\n\t\t\tif(this.isParentSelected()) {\n\t\t\t\t// 只选中父容器\n\t\t\t\tif(this.selectedElements.length === 1) {\n\t\t\t\t\tcssSelector = '_parent_';\n\t\t\t\t// 启用多重选择时\n\t\t\t\t} else if($(\"#-selector-toolbar [name=diferentElementSelection]\").prop(\"checked\")) {\n\t\t\t\t\tvar selectedElements = this.selectedElements.clone();\n\t\t\t\t\t// 删除父元素\n\t\t\t\t\tselectedElements.splice(selectedElements.indexOf(this.parent), 1);\n\t\t\t\t\tcssSelector = '_parent_, '+this.cssSelector.getCssSelector(selectedElements, this.top);\n\t\t\t\t} else {\n\t\t\t\t\t// 不允许多重选择时将报错\n\t\t\t\t\tcssSelector = this.cssSelector.getCssSelector(this.selectedElements, this.top);\n\t\t\t\t}\n\t\t\t// 选择集中不包含父元素\n\t\t\t} else {\n\t\t\t\tcssSelector = this.cssSelector.getCssSelector(this.selectedElements, this.top);\n\t\t\t}\n\t\t\treturn cssSelector;\n\t\t}\n\t\treturn \"\";\n\t},\n\t// 用户选择元素集合中包括父容器\n\tisParentSelected: function() {\n\t\treturn this.selectedElements.indexOf(this.parent) !== -1;\n\t},\n\n\t/**\n\t * 初始化或重新配置CSS选择器(允许多个选择器)\n\t * @param allowMultipleSelectors\n\t */\n\tinitCssSelector: function(allowMultipleSelectors) {\n\t\t// CssSelector选择器类\n\t\tthis.cssSelector = new CssSelector({\n\t\t\tenableSmartTableSelector: true,\n\t\t\tparent: this.parent,\n\t\t\tallowMultipleSelectors: allowMultipleSelectors,\n\t\t\tignoredClasses: [\n\t\t\t\t\"-sitemap-select-item-selected\",\n\t\t\t\t\"-sitemap-select-item-hover\",\n\t\t\t\t\"-sitemap-parent\",\n\t\t\t\t\"-web-scraper-img-on-top\",\n\t\t\t\t\"-web-scraper-selection-active\"\n\t\t\t],\n\t\t\tquery: jQuery\n\t\t});\n\t},\n\n\tpreviewSelector: function (elementCSSSelector) {\n\t\tif(this.deferredCSSSelectorResponse.state() !== \"rejected\") {\n\n\t\t\tthis.highlightParent();\n\t\t\t$(ElementQuery(elementCSSSelector, this.parent)).addClass('-sitemap-select-item-selected');\n\t\t\tthis.deferredCSSSelectorResponse.resolve();\n\t\t}\n\n\t\treturn this.deferredCSSSelectorResponse.promise();\n\t},\n\t/*\n\t * 开启选择器界面\n\t */\n\tinitGUI: function () {\n\t\t// 父元素为body 不要突出显示\n\t\tthis.highlightParent();\n\t\t// 除工具栏外的所有元素\n\t\tthis.$allElements = $(this.allowedElements+\":not(#-selector-toolbar):not(#-selector-toolbar *)\", this.parent);\n\t\t// 允许选择父节点(父元素不为body时)\n\t\tif (this.parent !== document.body){\n\t\t\tthis.$allElements.push(this.parent);\n\t\t}\n\t\t// 鼠标指向、离开事件\n\t\tthis.bindElementHighlight();\n\t\t// 元素点击事件\n\t\tthis.bindElementSelection();\n\t\t// 键盘事件(选择当前元素父子级)\n\t\tthis.bindKeyboardSelectionManipulations();\n\t\t// 选择器样式弹窗\n\t\tthis.attachToolbar();\n\t\t// 是否启用多重选择\n\t\tthis.bindMultipleGroupCheckbox();\n\t\t// 关闭错误提示\n\t\tthis.bindMultipleGroupPopupHide();\n\t\t// 改变img位置\n\t\tthis.bindMoveImagesToTop();\n\t},\n\t// 元素点击事件\n\tbindElementSelection: function (){\n\t\tthis.$allElements.bind(\"click.elementSelector\", function (e){\n\t\t\tvar element = e.currentTarget;\n\t\t\t// 用户选择的元素集\n\t\t\tif (this.selectedElements.indexOf(element) === -1){\n\t\t\t\tthis.selectedElements.push(element);\n\t\t\t}\n\t\t\t// 元素高光\n\t\t\tthis.highlightSelectedElements();\n\t\t\t// 取消其他事件\n\t\t\treturn false;\n\t\t}.bind(this));\n\t},\n\n\t/**\n\t * Add to select elements the element that is under the mouse\n\t */\n\tselectMouseOverElement: function() {\n\t\tvar element = this.mouseOverElement;\n\t\tif(element) {\n\t\t\tthis.selectedElements.push(element);\n\t\t\tthis.highlightSelectedElements();\n\t\t}\n\t},\n\t// 鼠标指向、离开事件\n\tbindElementHighlight: function () {\n\t\t$(this.$allElements)\n\t\t// 鼠标指向\n\t\t.bind(\"mouseover.elementSelector\", function (e){\n\t\t\t// 除了web scraper对于其他的事件监听冒泡\n\t\t\tif(e.target !== e.currentTarget) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar element = e.currentTarget;\n\t\t\tthis.mouseOverElement = element;\n\t\t\t$(element).addClass(\"-sitemap-select-item-hover\");\n\t\t}.bind(this))\n\t\t// 鼠标离开\n\t\t.bind(\"mouseout.elementSelector\", function (e){\n\t\t\t// 除了web scraper对于其他的事件监听冒泡\n\t\t\tif(e.target !== e.currentTarget) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar element = e.currentTarget;\n\t\t\tthis.mouseOverElement = null;\n\t\t\t$(element).removeClass(\"-sitemap-select-item-hover\");\n\t\t}.bind(this));\n\t},\n\t// 改变img位置\n\tbindMoveImagesToTop: function() {\n\t\t$(\"body\").addClass(\"-web-scraper-selection-active\");\n\t\t// 选择img标签时 改变img位置\n\t\tif(this.allowedElements === 'img') {\n\t\t\t$(\"img\").filter(function(i, element) {\n\t\t\t\treturn $(element).css(\"position\") === 'static';\n\t\t\t}).addClass(\"-web-scraper-img-on-top\");\n\t\t}\n\t},\n\n\tunbindMoveImagesToTop: function() {\n\n\t\t$(\"body.-web-scraper-selection-active\").removeClass(\"-web-scraper-selection-active\");\n\t\t$(\"img.-web-scraper-img-on-top\").removeClass(\"-web-scraper-img-on-top\");\n\t},\n\n\tselectChild: function () {\n\t\tthis.top--;\n\t\tif (this.top < 0) {\n\t\t\tthis.top = 0;\n\t\t}\n\t},\n\tselectParent: function () {\n\t\tthis.top++;\n\t},\n\n\t// 键盘事件\n\tbindKeyboardSelectionManipulations: function () {\n\t\t// check for focus\n\t\tvar lastFocusStatus;\n\t\tthis.keyPressFocusInterval = setInterval(function() {\n\t\t\tvar focus = document.hasFocus();\n\t\t\tif(focus === lastFocusStatus) {\n\t\t\t\treturn;\n            }\n\t\t\tlastFocusStatus = focus;\n\t\t\t$(\"#-selector-toolbar .key-button\").toggleClass(\"hide\", !focus);\n\t\t\t$(\"#-selector-toolbar .key-events\").toggleClass(\"hide\", focus);\n\t\t}.bind(this), 200);\n\t\t// 改变当前选择的层级(+/-1)\n\t\t// 选择元素\n\t\t$(document).bind(\"keydown.selectionManipulation\", function (event) {\n\t\t\t// 使用C键选择子元素\n\t\t\tif (event.keyCode === 67) {\n\t\t\t\tthis.animateClickedKey($(\"#-selector-toolbar .key-button-child\"));\n\t\t\t\tthis.selectChild();\n\t\t\t}\n\t\t\t// 使用P键选择父元素\n\t\t\telse if (event.keyCode === 80) {\n\t\t\t\tthis.animateClickedKey($(\"#-selector-toolbar .key-button-parent\"));\n\t\t\t\tthis.selectParent();\n\t\t\t}\n\t\t\t// 使用S键选择该元素\n\t\t\telse if (event.keyCode === 83) {\n\t\t\t\tthis.animateClickedKey($(\"#-selector-toolbar .key-button-select\"));\n\t\t\t\tthis.selectMouseOverElement();\n\t\t\t}\n\t\t\t// 高光标识\n\t\t\tthis.highlightSelectedElements();\n\t\t}.bind(this));\n\t},\n\n\tanimateClickedKey: function(element) {\n\t\t$(element).removeClass(\"clicked\").removeClass(\"clicked-animation\");\n\t\tsetTimeout(function() {\n\t\t\t$(element).addClass(\"clicked\");\n\t\t\tsetTimeout(function(){\n\t\t\t\t$(element).addClass(\"clicked-animation\");\n\t\t\t},100);\n\t\t},1);\n\n\t},\n\n\thighlightSelectedElements: function () {\n\t\ttry {\n\t\t\tvar resultCssSelector = this.getCurrentCSSSelector();\n\t\t\t$(\"body #-selector-toolbar .selector\").text(resultCssSelector);\n\t\t\t// highlight selected elements\n\t\t\t$(\".-sitemap-select-item-selected\").removeClass('-sitemap-select-item-selected');\n\t\t\t$(ElementQuery(resultCssSelector, this.parent)).addClass('-sitemap-select-item-selected');\n\t\t}\n\t\tcatch(err) {\n\t\t\tif(err === \"found multiple element groups, but allowMultipleSelectors disabled\") {\n\t\t\t\t// console.log(\"禁用多个不同的元素选择\");\n\t\t\t\tthis.showMultipleGroupPopup();\n\t\t\t\t// remove last added element\n\t\t\t\tthis.selectedElements.pop();\n\t\t\t\tthis.highlightSelectedElements();\n\t\t\t}\n\t\t}\n\t},\n\n\tshowMultipleGroupPopup: function() {\n\t\t$(\"#-selector-toolbar .popover\").attr(\"style\", \"display:block !important;\");\n\t},\n\t// 关闭错误提示\n\thideMultipleGroupPopup: function() {\n\t\t$(\"#-selector-toolbar .popover\").attr(\"style\", \"\");\n\t},\n\t// 关闭错误提示事件\n\tbindMultipleGroupPopupHide: function() {\n\t\t$(\"#-selector-toolbar .popover .close\").click(this.hideMultipleGroupPopup.bind(this));\n\t},\n\n\tunbindMultipleGroupPopupHide: function() {\n\t\t$(\"#-selector-toolbar .popover .close\").unbind(\"click\");\n\t},\n\t// 是否启用多重选择\n\tbindMultipleGroupCheckbox: function() {\n\t\t$(\"#-selector-toolbar [name=diferentElementSelection]\").change(function(e) {\n\t\t\tif($(e.currentTarget).is(\":checked\")) {\n\t\t\t\tthis.initCssSelector(true);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.initCssSelector(false);\n\t\t\t}\n\t\t}.bind(this));\n\t},\n\tunbindMultipleGroupCheckbox: function(){\n\t\t$(\"#-selector-toolbar .diferentElementSelection\").unbind(\"change\");\n\t},\n\t// 选择器样式\n\tattachToolbar: function () {\n\t\tvar toolbar = `<div id=\"-selector-toolbar\">\n\t\t\t<div class=\"list-item\">\n\t\t\t\t<div class=\"selector-container\">\n\t\t\t\t\t<div class=\"selector\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"input-group-addon list-item\">\n\t\t\t\t<input type=\"checkbox\" title=\"启用多重元素选择器\" name=\"diferentElementSelection\">\n\t\t\t\t<div class=\"popover top\">\n\t\t\t\t\t<div class=\"close\">×</div>\n\t\t\t\t\t<div class=\"arrow\"></div>\n\t\t\t\t\t<div class=\"popover-content\">\n\t\t\t\t\t\t<div class=\"txt\">选择元素非同列表元素，如果本次点击包括您选择的元素，请确定选择后再次重试。</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"list-item key-events\">\n\t\t\t\t<div title=\"单击此处可启用键盘事件进行选择元素层级\">开启键盘事件</div></div>\n\t\t\t<div class=\"list-item key-button key-button-select hide\" title=\"使用S键选择当前元素\">S</div>\n\t\t\t<div class=\"list-item key-button key-button-parent hide\" title=\"使用P键选择当前元素父元素\">P</div>\n\t\t\t<div class=\"list-item key-button key-button-child hide\" title=\"使用C键选择当前元素子元素\">C</div>\n\t\t\t<div class=\"list-item done-selecting-button\">确定</div>\n\t\t</div>`;\n\t\t$(\"body\").append(toolbar);\n\t\t// 确定选择元素时\n\t\t$(\"body #-selector-toolbar .done-selecting-button\").click(function () {\n\t\t\t// 显示选择结果\n\t\t\tthis.selectionFinished();\n\t\t}.bind(this));\n\t},\n\t// 父元素为body 不要突出显示\n\thighlightParent: function () {\n\t\t// 父元素为body 不要突出显示\n\t\tif(!$(this.parent).is(\"body\") && !$(this.parent).is(\"#webpage\")) {\n\t\t\t$(this.parent).addClass(\"-sitemap-parent\");\n\t\t}\n\t\t// 详情点击 显示\n\t\tif(this.selectorType === 'SelectorDetail'){\n\t\t\t$(this.parent).addClass(\"-sitemap-parent\");\n\t\t}\n\t},\n\n\tunbindElementSelection: function () {\n\t\t$(this.$allElements).unbind(\"click.elementSelector\");\n\t\t// remove highlighted element classes\n\t\tthis.unbindElementSelectionHighlight();\n\t},\n\tunbindElementSelectionHighlight: function () {\n\t\t$(\".-sitemap-select-item-selected\").removeClass('-sitemap-select-item-selected');\n\t\t$(\".-sitemap-parent\").removeClass('-sitemap-parent');\n\t},\n\tunbindElementHighlight: function () {\n\t\t$(this.$allElements).unbind(\"mouseover.elementSelector\")\n\t\t\t.unbind(\"mouseout.elementSelector\");\n\t},\n\tunbindKeyboardSelectionMaipulatios: function () {\n\t\t$(document).unbind(\"keydown.selectionManipulation\");\n\t\tclearInterval(this.keyPressFocusInterval);\n\t},\n\tremoveToolbar: function () {\n\t\t$(\"body #-selector-toolbar a\").unbind(\"click\");\n\t\t$(\"#-selector-toolbar\").remove();\n\t},\n\n\t/**\n\t * Remove toolbar and unbind events\n\t */\n\tremoveGUI: function() {\n\n\t\tthis.unbindElementSelection();\n\t\tthis.unbindElementHighlight();\n\t\tthis.unbindKeyboardSelectionMaipulatios();\n\t\tthis.unbindMultipleGroupPopupHide();\n\t\tthis.unbindMultipleGroupCheckbox();\n\t\tthis.unbindMoveImagesToTop();\n\t\tthis.removeToolbar();\n\t},\n\t// 返回选择器结果\n\tselectionFinished: function () {\n\t\tvar resultCssSelector = this.getCurrentCSSSelector();\n\t\tthis.deferredCSSSelectorResponse.resolve({\n\t\t\tCSSSelector: resultCssSelector\n\t\t});\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Controller.js",
    "content": "/* sitemap控制器  面板主程序 */\nvar SitemapController = function (options) {\n\n    for (var i in options) {\n        this[i] = options[i];\n    }\n    this.init();\n};\n\nSitemapController.prototype = {\n    contentScript: getContentScript(\"DevTools\"),\n    // 注册事件\n    control: function (controls) {\n        var controller = this;\n\n        for (var selector in controls) {\n            for (var event in controls[selector]) {\n                $(document).on(event, selector, (function (selector, event) {\n                    return function () {\n                        var continueBubbling = controls[selector][event].call(controller, this);\n                        if (continueBubbling !== true) {\n                            return false;\n                        }\n                    };\n                })(selector, event));\n            }\n        }\n    },\n    // 加载模板\n    loadTemplates: function (cbAllTemplatesLoaded) {\n        var templateIds = [\n            'Viewport',\n            'SitemapList',\n            'SitemapListItem',\n            'SitemapCreate',\n            'SitemapStartUrlField',\n            'SitemapImport',\n            'SitemapSave',\n            'SitemapBrowseData',\n            'SitemapScrapeConfig',\n            'SitemapExportDataCSV',\n            'SitemapEditMetadata',\n            'SelectorList',\n            'SelectorListItem',\n            'SelectorEdit',\n            'SelectorEditTableColumn',\n            'SitemapSelectorGraph',\n            'DataPreview'\n        ];\n        var templatesLoaded = 0;\n        // ich加载模板\n        var cbLoaded = function (templateId, template) {\n            templatesLoaded++;\n            ich.addTemplate(templateId, template);\n            if (templatesLoaded === templateIds.length) {\n                cbAllTemplatesLoaded();\n            }\n        };\n\n        templateIds.forEach(function (templateId) {\n            $.get('/static/' + this.templateDir + templateId + '.html', cbLoaded.bind(this, templateId));\n        }.bind(this));\n    },\n\n    // 初始化\n    init: function () {\n        this.loadTemplates(function () {\n            // 初始化全局对象state\n            this.clearState();\n            // 渲染模板\n            var initSitemap = ich.Viewport();\n            $(\".sidebar\").append(initSitemap);\n            // 禁止form submit\n            $(\"form\").bind(\"submit\", function () {\n                return false;\n            });\n            // 注册事件\n            this.control({\n                // 保存选择器\n                '#sitemap-export-nav-button': {\n                    click: this.showSitemapExportPanel\n                },\n                // 保存按钮\n                '#viewport button[action=sitemap-save-button]': {\n                    click: this.saveConfig\n                },\n                '#sitemap-export-data-csv-nav-button': {\n                    click: this.showSitemapExportDataCsvPanel\n                },\n                '#submit-create-sitemap': {\n                    click: this.createSitemap\n                },\n                '#submit-import-sitemap': {\n                    click: this.importSitemap\n                },\n                '#sitemap-edit-metadata-nav-button': {\n                    click: this.editSitemapMetadata\n                },\n                '#sitemap-selector-list-nav-button': {\n                    click: this.showSitemapSelectorList\n                },\n                '#sitemap-selector-graph-nav-button': {\n                    click: this.showSitemapSelectorGraph\n                },\n                '#sitemap-browse-nav-button': {\n                    click: this.browseSitemapData\n                },\n                'button#submit-edit-sitemap': {\n                    click: this.editSitemapMetadataSave\n                },\n                '#edit-sitemap-metadata-form': {\n                    submit: function(){return false;}\n                },\n                '#sitemaps tr': {\n                    click: this.editSitemap\n                },\n                '#sitemaps button[action=delete-sitemap]': {\n                    click: this.deleteSitemap\n                },\n                '#sitemap-scrape-nav-button': {\n                    click: this.showScrapeSitemapConfigPanel\n                },\n                '#submit-scrape-sitemap-form': {\n                    submit: function(){return false;}\n                },\n                // 开始任务\n                '#submit-scrape-sitemap': {\n                    click: this.scrapeSitemap\n                },\n                \"#sitemaps button[action=browse-sitemap-data]\": {\n                    click: this.sitemapListBrowseSitemapData\n                },\n                '#sitemaps button[action=csv-download-sitemap-data]': {\n                    click: this.downloadSitemapData\n                },\n                // @TODO move to tr\n                '#selector-tree tbody tr': {\n                    click: this.showChildSelectors\n                },\n                '#selector-tree .breadcrumb a': {\n                    click: this.treeNavigationshowSitemapSelectorList\n                },\n                '#selector-tree tr button[action=edit-selector]': {\n                    click: this.editSelector\n                },\n                '#edit-selector select[name=type]': {\n                    change: this.selectorTypeChanged\n                },\n                // 保存新增选择器\n                '#edit-selector button[action=save-selector]': {\n                    click: this.saveSelector\n                },\n                '#edit-selector button[action=cancel-selector-editing]': {\n                    click: this.cancelSelectorEditing\n                },\n                '#edit-selector #selectorId': {\n                    keyup: this.updateSelectorParentListOnIdChange\n                },\n                '#selector-tree button[action=add-selector]': {\n                    click: this.addSelector\n                },\n                \"#selector-tree tr button[action=delete-selector]\": {\n                    click: this.deleteSelector\n                },\n                \"#selector-tree tr button[action=preview-selector]\": {\n                    click: this.previewSelectorFromSelectorTree\n                },\n                \"#selector-tree tr button[action=data-preview-selector]\": {\n                    click: this.previewSelectorDataFromSelectorTree\n                },\n                \"#edit-selector button[action=select-selector]\": {\n                    click: this.selectSelector\n                },\n                \"#edit-selector button[action=select-table-header-row-selector]\": {\n                    click: this.selectTableHeaderRowSelector\n                },\n                \"#edit-selector button[action=select-table-data-row-selector]\": {\n                    click: this.selectTableDataRowSelector\n                },\n                \"#edit-selector button[action=preview-selector]\": {\n                    click: this.previewSelector\n                },\n                \"#edit-selector button[action=preview-click-element-selector]\": {\n                    click: this.previewClickElementSelector\n                },\n                \"#edit-selector button[action=preview-table-row-selector]\": {\n                    click: this.previewTableRowSelector\n                },\n                \"#edit-selector button[action=preview-selector-data]\": {\n                    click: this.previewSelectorDataFromSelectorEditing\n                },\n                \"button.add-extra-start-url\": {\n                    click: this.addStartUrl\n                },\n                \"button.remove-start-url\": {\n                    click: this.removeStartUrl\n                }\n            });\n            this.showSitemaps();\n            this.createSitemap();\n        }.bind(this));\n        // 改变样式\n\n        // // web scraper was used today\n        // this.backgroundScript.setDailyStat({\n        //     key: \"webScraperOpened\",\n        //     value: true\n        // });\n        //\n        // // start web scraper usage counter\n        // this.backgroundScript.updateExtensionIsBeingUsed();\n        // setInterval(function() {\n        //     this.backgroundScript.updateExtensionIsBeingUsed();\n        // }.bind(this),60e3);\n    },\n    // 清除对象\n    clearState: function () {\n        // 全局对象\n        this.state = {\n            // sitemap对象\n            currentSitemap: null,\n            // 面包屑导航id值\n            editSitemapBreadcumbsSelectors: null,\n            // 面包屑导航根id:_root\n            currentParentSelectorId: null,\n            // 当前选择器id值\n            currentSelector: null\n        };\n    },\n    // state对象初始化设置\n    setStateEditSitemap: function (sitemap) {\n        this.state.currentSitemap = sitemap;\n        this.state.editSitemapBreadcumbsSelectors = [\n            {id: '_root'}\n        ];\n        this.state.currentParentSelectorId = '_root';\n    },\n    // 设置导航栏样式\n    setActiveNavigationButton: function (navigationId) {\n        $(\".nav .active\").removeClass(\"active\");\n        $(\"#\" + navigationId + \"-nav-button\").closest(\"li\").addClass(\"active\");\n        if (navigationId.match(/^sitemap-/)) {\n            $(\"#sitemap-nav-button\").removeClass(\"disabled\");\n            $(\"#sitemap-nav-button\").closest(\"li\").addClass('active');\n            $(\"#navbar-active-sitemap-id\").text(\"(\" + this.state.currentSitemap._id + \")\");\n        } else {\n            $(\"#sitemap-nav-button\").addClass(\"disabled\");\n            $(\"#navbar-active-sitemap-id\").text(\"\");\n        }\n        if (navigationId.match(/^create-sitemap-/)) {\n            $(\"#create-sitemap-nav-button\").closest(\"li\").addClass('active');\n        }\n    },\n    /**\n     * Simple info popup for sitemap start url input field\n     */\n\n    /**\n     * Simple info popup for sitemap start url input field\n     */\n    initMultipleStartUrlHelper: function () {\n        $(\"#startUrl\")\n            .popover({\n                title: 'Multiple start urls',\n                html: true,\n                content: \"You can create ranged start urls like this:<br />http://example.com/[1-100].html\",\n                placement: 'bottom'\n            })\n            .blur(function () {\n                $(this).popover('hide');\n            });\n    },\n\n    /**\n     * 返回当前视图中bootstrapValidator对象\n     */\n    getFormValidator: function() {\n        var validator = $('#viewport form').data('bootstrapValidator');\n        return validator;\n    },\n\n    /**\n     * Returns whether current form in the viewport is valid\n     * @returns {Boolean}\n     */\n    isValidForm: function() {\n        var validator = this.getFormValidator();\n\n        //validator.validate();\n        // validate method calls submit which is not needed in this case.\n        for (var field in validator.options.fields) {\n            validator.validateField(field);\n        }\n\n        var valid = validator.isValid();\n        return valid;\n    },\n\n    /**\n     * Add validation to sitemap creation or editing form\n     */\n    initSitemapValidation: function() {\n\n        $('#viewport form').bootstrapValidator({\n            fields: {\n                \"_id\": {\n                    validators: {\n                        notEmpty: {\n                            message: 'The sitemap id is required and cannot be empty'\n                        },\n                        stringLength: {\n                            min: 3,\n                            message: 'The sitemap id should be atleast 3 characters long'\n                        },\n                        regexp: {\n                            regexp: /^[a-z][a-z0-9_\\$\\(\\)\\+\\-/]+$/,\n                            message: 'Only lowercase characters (a-z), digits (0-9), or any of the characters _, $, (, ), +, -, and / are allowed. Must begin with a letter.'\n                        },\n                        // placeholder for sitemap id existance validation\n                        callback: {\n                            message: 'Sitemap with this id already exists',\n                            callback: function(value, validator) {\n                                return true;\n                            }.bind(this)\n                        }\n                    }\n                },\n                \"startUrl[]\": {\n                    validators: {\n                        notEmpty: {\n                            message: 'The start URL is required and cannot be empty'\n                        },\n                        uri: {\n                            message: 'The start URL is not a valid URL'\n                        }\n                    }\n                }\n            }\n        });\n    },\n\n    showCreateSitemap: function () {\n        this.setActiveNavigationButton('create-sitemap-create');\n        var sitemapForm = ich.SitemapCreate();\n        $(\"#viewport\").html(sitemapForm);\n        this.initMultipleStartUrlHelper();\n        this.initSitemapValidation();\n\n        return true;\n    },\n\n    initImportStiemapValidation: function(){\n        $('#viewport form').bootstrapValidator({\n            fields: {\n                \"_id\": {\n                    validators: {\n                        stringLength: {\n                            min: 3,\n                            message: 'The sitemap id should be atleast 3 characters long'\n                        },\n                        regexp: {\n                            regexp: /^[a-z][a-z0-9_\\$\\(\\)\\+\\-/]+$/,\n                            message: 'Only lowercase characters (a-z), digits (0-9), or any of the characters _, $, (, ), +, -, and / are allowed. Must begin with a letter.'\n                        },\n                        // placeholder for sitemap id existance validation\n                        callback: {\n                            message: 'Sitemap with this id already exists',\n                            callback: function(value, validator) {\n                                return true;\n                            }.bind(this)\n                        }\n                    }\n                },\n                sitemapJSON: {\n                    validators: {\n                        notEmpty: {\n                            message: 'Sitemap JSON is required and cannot be empty'\n                        },\n                        callback: {\n                            message: 'JSON is not valid',\n                            callback: function(value, validator) {\n                                try {\n                                    JSON.parse(value);\n                                } catch (e) {\n                                    return false;\n                                }\n                                return true;\n                            }.bind(this)\n                        }\n                    }\n                }\n            }\n        });\n    },\n    // 导入数据\n    showImportSitemapPanel: function () {\n        this.setActiveNavigationButton('create-sitemap-import');\n        var sitemapForm = ich.SitemapImport();\n        $(\"#viewport\").html(sitemapForm);\n        this.initImportStiemapValidation();\n        return true;\n    },\n    // 保存数据\n    showSitemapExportPanel: function () {\n        this.setActiveNavigationButton('sitemap-export');\n        // 获取sitemap JSON数据\n        var sitemap = this.state.currentSitemap;\n        var sitemapConfig = JSON.stringify(window.CONFIG_DATA);\n        var sitemapJSON = sitemap.exportSitemap();\n        var sitemapSaveForm = ich.SitemapSave({\n            sitemapJSON: sitemapJSON,\n            sitemapConfig: sitemapConfig\n        });\n        // 表单验证\n        $(\"#viewport\").html(sitemapSaveForm);\n        this.initScrapeSitemapSaveValidation();\n        return true;\n    },\n    showSitemaps: function () {\n\n        this.clearState();\n        this.setActiveNavigationButton(\"sitemaps\");\n\n        // this.store.getAllSitemaps(function (sitemaps) {\n        //     $sitemapListPanel = ich.SitemapList();\n        //     sitemaps.forEach(function (sitemap) {\n        //         $sitemap = ich.SitemapListItem(sitemap);\n        //         $sitemap.data(\"sitemap\", sitemap);\n        //         $sitemapListPanel.find(\"tbody\").append($sitemap);\n        //     });\n        //     $(\"#viewport\").html($sitemapListPanel);\n        // });\n        $sitemapListPanel = ich.SitemapList();\n        $(\"#viewport\").html($sitemapListPanel);\n    },\n\n    getSitemapFromMetadataForm: function(){\n\n        var id = $(\"#viewport form input[name=_id]\").val();\n        var $startUrlInputs = $(\"#viewport form .input-start-url\");\n        var startUrl;\n        if($startUrlInputs.length === 1) {\n            startUrl = $startUrlInputs.val();\n        } else {\n            startUrl = [];\n            $startUrlInputs.each(function(i, element) {\n                startUrl.push($(element).val());\n            });\n        }\n\n        return {\n            id:id,\n            startUrl:startUrl\n        };\n    },\n\n    createSitemap: function () {\n        // cancel submit if invalid form\n        if (window.CONFIG_DATA){\n            var sitemapData = {id: window.CONFIG_DATA.name, startUrl: window.CONFIG_DATA.url};\n        } else{\n            var sitemapData = {id: \"zhihu\", startUrl: \"http://www.acfun.cn/\"};\n        }\n        // var sitemapData = {id: \"zhihu\", startUrl: \"http://www.acfun.cn/\"};\n        // check whether sitemap with this id already exist\n        // this.backgroundScript.incrementDailyStat({\n        //     key: \"sitemapsCreated\",\n        //     increment: 1\n        // });\n        var sitemap = new Sitemap({\n            _id: sitemapData.id,\n            startUrl: sitemapData.startUrl,\n            selectors: []\n        });\n        this._editSitemap(sitemap, ['_root']);\n    },\n\n    importSitemap: function () {\n\n        // cancel submit if invalid form\n        if(!this.isValidForm()) {\n            return false;\n        }\n\n        // load data from form\n        var sitemapJSON = $(\"[name=sitemapJSON]\").val();\n        var id = $(\"input[name=_id]\").val();\n        var sitemap = new Sitemap();\n        sitemap.importSitemap(sitemapJSON);\n        if(id.length) {\n            sitemap._id = id;\n        }\n        // check whether sitemap with this id already exist\n        this.store.sitemapExists(sitemap._id, function (sitemapExists) {\n            if(sitemapExists) {\n                var validator = this.getFormValidator();\n                validator.updateStatus('_id', 'INVALID', 'callback');\n            } else {\n                // stats\n                // this.backgroundScript.incrementDailyStat({\n                //     key: \"sitemapsImported\",\n                //     increment: 1\n                // });\n\n                this.store.createSitemap(sitemap, function (sitemap) {\n                    this._editSitemap(sitemap, ['_root']);\n                }.bind(this, sitemap));\n            }\n        }.bind(this));\n    },\n\n    editSitemapMetadata: function (button) {\n\n        this.setActiveNavigationButton('sitemap-edit-metadata');\n\n        var sitemap = this.state.currentSitemap;\n        var $sitemapMetadataForm = ich.SitemapEditMetadata(sitemap);\n        $(\"#viewport\").html($sitemapMetadataForm);\n        this.initMultipleStartUrlHelper();\n        this.initSitemapValidation();\n\n        return true;\n    },\n\n    editSitemapMetadataSave: function (button) {\n        var sitemap = this.state.currentSitemap;\n        var sitemapData = this.getSitemapFromMetadataForm();\n\n        // cancel submit if invalid form\n        if(!this.isValidForm()) {\n            return false;\n        }\n\n        // check whether sitemap with this id already exist\n        this.store.sitemapExists(sitemapData.id, function (sitemapExists) {\n            if(sitemap._id !== sitemapData.id && sitemapExists) {\n                var validator = this.getFormValidator();\n                validator.updateStatus('_id', 'INVALID', 'callback');\n                return;\n            }\n\n            // change data\n            sitemap.startUrl = sitemapData.startUrl;\n\n            // just change sitemaps url\n            if (sitemapData.id === sitemap._id) {\n                // this.store.saveSitemap(sitemap, function (sitemap) {\n                //     this.showSitemapSelectorList();\n                // }.bind(this));\n                this.showSitemapSelectorList();\n            // id changed. we need to delete the old one and create a new one\n            } else {\n                var newSitemap = new Sitemap(sitemap);\n                var oldSitemap = sitemap;\n                newSitemap._id = sitemapData.id;\n                this.store.createSitemap(newSitemap, function (newSitemap) {\n                    this.store.deleteSitemap(oldSitemap, function () {\n                        this.state.currentSitemap = newSitemap;\n                        this.showSitemapSelectorList();\n                    }.bind(this));\n                }.bind(this));\n            }\n\n        }.bind(this));\n    },\n\n    /**\n     * Callback when sitemap edit button is clicked in sitemap grid\n     */\n    editSitemap: function (tr) {\n\n        var sitemap = $(tr).data(\"sitemap\");\n        this._editSitemap(sitemap);\n    },\n\n    _editSitemap: function (sitemap) {\n        this.setStateEditSitemap(sitemap);\n        this.setActiveNavigationButton(\"sitemap\");\n        this.showSitemapSelectorList();\n    },\n    // 展现选择器列表\n    showSitemapSelectorList: function () {\n        // 更新样式\n        this.setActiveNavigationButton('sitemap-selector-list');\n\n        var sitemap = this.state.currentSitemap;\n        var parentSelectors = this.state.editSitemapBreadcumbsSelectors;\n        var parentSelectorId = this.state.currentParentSelectorId;\n\n        var $selectorListPanel = ich.SelectorList({\n            parentSelectors: parentSelectors\n        });\n        // 该父容器下的选择器\n        var selectors = sitemap.getDirectChildSelectors(parentSelectorId);\n        selectors.forEach(function (selector) {\n            $selector = ich.SelectorListItem(selector);\n            $selector.data(\"selector\", selector);\n            $selectorListPanel.find(\"tbody\").append($selector);\n        });\n        $(\"#viewport\").html($selectorListPanel);\n\n        return true;\n    },\n    showSitemapSelectorGraph: function () {\n        this.setActiveNavigationButton('sitemap-selector-graph');\n        var sitemap = this.state.currentSitemap;\n        var $selectorGraphPanel = ich.SitemapSelectorGraph();\n        $(\"#viewport\").html($selectorGraphPanel);\n        var graphDiv = $(\"#selector-graph\")[0];\n        var graph = new SelectorGraphv2(sitemap);\n        graph.draw(graphDiv, $(document).width(), 200);\n        return true;\n    },\n    showChildSelectors: function (tr) {\n        var selector = $(tr).data('selector');\n        var parentSelectors = this.state.editSitemapBreadcumbsSelectors;\n        this.state.currentParentSelectorId = selector.id;\n        parentSelectors.push(selector);\n\n        this.showSitemapSelectorList();\n    },\n\n    treeNavigationshowSitemapSelectorList: function (button) {\n        var parentSelectors = this.state.editSitemapBreadcumbsSelectors;\n        var controller = this;\n        $(\"#selector-tree .breadcrumb li a\").each(function (i, parentSelectorButton) {\n            if (parentSelectorButton === button) {\n                parentSelectors.splice(i + 1);\n                controller.state.currentParentSelectorId = parentSelectors[i].id;\n            }\n        });\n        this.showSitemapSelectorList();\n    },\n    // 表单验证\n    initSelectorValidation: function() {\n        // 验证表单\n        var Validation = {\n            fields: {\n                \"id\": {\n                    validators: {\n                        notEmpty: {\n                            message: '字段名称不能为空'\n                        },\n                        regexp: {\n                            regexp: /^[^_].*$/,\n                            message: '字段名称不能以下划线(_)开始'\n                        }\n                    }\n                },\n                selector: {\n                    validators: {\n                        notEmpty: {\n                            message: '选择器不能为空'\n                        }\n                    }\n                },\n                pageUrl: {\n                    validators: {\n                        uri: {\n                            message: '请输入正确的url, 需翻页的参数写在最后'\n                        }\n                    }\n                },\n                startNum: {\n                    validators: {\n                        numeric: {\n                            message: '请输入数字'\n                        }\n                    }\n                },\n                endNum: {\n                    validators: {\n                        numeric: {\n                            message: '请输入数字'\n                        },\n                        callback: {\n                            message: '终止页数必须大于起始页',\n                            callback: function(value, validator){\n                                var startNum = parseInt($(\"#edit-selector [name=startNum]\").val());\n                                if (startNum > value){\n                                    return false;\n                                } else {\n                                    return true;\n                                }\n                            }\n                        }\n                    }\n                },\n                regex: {\n                    validators: {\n                        callback: {\n                            message: '匹配内容为空 不支持',\n                            callback: function(value, validator) {\n                                // allow no regex\n                                if(!value) {\n                                    return true;\n                                }\n\n                                var matches = \"\".match(new RegExp(value));\n                                if(matches !== null && matches[0] === \"\") {\n                                    return false;\n                                } else {\n                                    return true;\n                                }\n                            }\n                        }\n                    }\n                },\n                clickElementSelector: {\n                    validators: {\n                        notEmpty: {\n                            message: '点击元素不能为空'\n                        }\n                    }\n                },\n                tableHeaderRowSelector: {\n                    validators: {\n                        notEmpty: {\n                            message: '标题行选择器不能为空'\n                        }\n                    }\n                },\n                tableDataRowSelector: {\n                    validators: {\n                        notEmpty: {\n                            message: 'D内容行选择器不能为空'\n                        }\n                    }\n                },\n                delay: {\n                    validators: {\n                        numeric: {\n                            message: '间隔时间必须为数字'\n                        }\n                    }\n                },\n                parentSelectors: {\n                    validators: {\n                        notEmpty: {\n                            message: '必须选择至少一个父选择器'\n                        },\n                        callback: {\n                            message: '无法处理递归元素选择器',\n                            callback: function(value, validator, $field) {\n\n                                var sitemap = this.getCurrentlyEditedSelectorSitemap();\n                                return !sitemap.selectors.hasRecursiveElementSelectors();\n\n                            }.bind(this)\n                        }\n                    }\n                }\n            }\n        };\n        // bootstrapValidator插件\n        $('#viewport form').bootstrapValidator(Validation);\n    },\n    editSelector: function (button) {\n        var selector = $(button).closest(\"tr\").data('selector');\n        this._editSelector(selector);\n    },\n    updateSelectorParentListOnIdChange: function() {\n\n        var selector = this.getCurrentlyEditedSelector();\n        $(\".currently-edited\").val(selector.id).text(selector.id);\n    },\n    // 修改选择器页面\n    _editSelector: function (selector) {\n        var sitemap = this.state.currentSitemap;\n        var selectorIds = sitemap.getPossibleParentSelectorIds();\n\n        var $editSelectorForm = ich.SelectorEdit({\n            selector: selector,\n            selectorIds: selectorIds,\n            // 字段类型加载\n            selectorTypes: [\n                {\n                    type: 'SelectorText',\n                    title: '文本选择器'\n                },\n                {\n                    type: 'SelectorLink',\n                    title: '翻页选择器'\n                },\n                {\n                    type: 'SelectorDetail',\n                    title: '详情页选择器'\n                },\n                {\n                    type: 'SelectorHTML',\n                    title: 'html选择器'\n                },\n                {\n                    type: 'SelectorElement',\n                    title: '元素集选择器'\n                },\n                {\n                    type: 'SelectorImage',\n                    title: '图片选择器'\n                },\n                {\n                    type: 'SelectorElementAttribute',\n                    title: '元素属性选择器'\n                }\n            ]\n        });\n        $(\"#viewport\").html($editSelectorForm);\n        // 父容器加载\n        $(\"#edit-selector #parentSelectors option\").each(function(i, element) {\n            if($(element).val() === selector.id) {\n                $(element).addClass(\"currently-edited\");\n            }\n        });\n\n        // 设置click点击类型表单\n        if(selector.clickType) {\n            $editSelectorForm.find(\"[name=clickType]\").val(selector.clickType);\n        }\n        // 设置click点击元素表单\n        if(selector.clickElementUniquenessType) {\n            $editSelectorForm.find(\"[name=clickElementUniquenessType]\").val(selector.clickElementUniquenessType);\n        }\n        // 字段类型\n        $editSelectorForm.find(\"[name=type]\").val(selector.type);\n        // 父选择器\n        selector.parentSelectors.forEach(function (parentSelectorId) {\n            $editSelectorForm.find(\"#parentSelectors [value='\" + parentSelectorId + \"']\").attr(\"selected\", \"selected\");\n        });\n\n        this.state.currentSelector = selector;\n        // 字段类型事件\n        this.selectorTypeChanged();\n        // 表单验证\n        this.initSelectorValidation();\n    },\n    // 字段类型事件\n    selectorTypeChanged: function () {\n        var type = $(\"#edit-selector select[name=type]\").val();\n        var features = window[type].getFeatures();\n        $(\"#edit-selector .feature\").hide();\n        features.forEach(function (feature) {\n            $(\"#edit-selector .feature-\" + feature).show();\n        });\n        // add this selector to possible parent selector\n        var selector = this.getCurrentlyEditedSelector();\n        if(selector.canHaveChildSelectors()) {\n            if($(\"#edit-selector #parentSelectors .currently-edited\").length === 0) {\n                var $option = $('<option class=\"currently-edited\"></option>');\n                $option.text(selector.id).val(selector.id);\n                $(\"#edit-selector #parentSelectors\").append($option);\n            }\n        // remove if type doesn't allow to have child selectors\n        } else {\n            $(\"#edit-selector #parentSelectors .currently-edited\").remove();\n        }\n    },\n    // 保存新增选择器\n    saveSelector: function (button) {\n        var sitemap = this.state.currentSitemap;\n        var selector = this.state.currentSelector;\n        var newSelector = this.getCurrentlyEditedSelector();\n        // 表单验证\n        if(!this.isValidForm()) {\n            return false;\n        }\n        // // 验证翻页选择器在入口页面且唯一\n        // if (newSelector.type === \"SelectorLink\"){\n        //     var linkValid = sitemap.selectors.getDirectChildSelectors(newSelector.parentSelectors[0]).filter(i => i.type === \"SelectorLink\" && i.id !== newSelector.id);\n        //     if (JSON.stringify(linkValid) !== '[]'){\n        //         this.showSitemapSelectorList();\n        //         return;\n        //     }\n        // }\n        // // 验证详情选择器唯一\n        // if (newSelector.type === \"SelectorDetail\"){\n        //     var detailValid = sitemap.selectors.getDirectChildSelectors(newSelector.parentSelectors[0]).filter(i => i.type === \"SelectorDetail\" && i.id !== newSelector.id);\n        //     if (JSON.stringify(detailValid) !== '[]'){\n        //         this.showSitemapSelectorList();\n        //         return;\n        //     }\n        // }\n        // // 验证元素集选择器唯一\n        // if (newSelector.type === \"SelectorElement\"){\n        //     var elementValid = sitemap.selectors.getDirectChildSelectors(newSelector.parentSelectors[0]).filter(i => i.type === \"SelectorElement\" && i.id !== newSelector.id);\n        //     if (JSON.stringify(elementValid) !== '[]'){\n        //         this.showSitemapSelectorList();\n        //         return;\n        //     }\n        // }\n        // 更新selector对象\n        sitemap.updateSelector(selector, newSelector);\n        // 前台展现\n        this.showSitemapSelectorList();\n    },\n    // 获取表单数据 生成新Selector对象\n    getCurrentlyEditedSelector: function () {\n        var id = $(\"#edit-selector [name=id]\").val();\n        var selectorsSelector = $(\"#edit-selector [name=selector]\").val();\n        var tableDataRowSelector = $(\"#edit-selector [name=tableDataRowSelector]\").val();\n        var tableHeaderRowSelector = $(\"#edit-selector [name=tableHeaderRowSelector]\").val();\n        var clickElementSelector = $(\"#edit-selector [name=clickElementSelector]\").val();\n        var type = $(\"#edit-selector [name=type]\").val();\n        var clickElementUniquenessType = $(\"#edit-selector [name=clickElementUniquenessType]\").val();\n        var clickType = $(\"#edit-selector [name=clickType]\").val();\n        var discardInitialElements = $(\"#edit-selector [name=discardInitialElements]\").is(\":checked\");\n        var multiple = $(\"#edit-selector [name=multiple]\").is(\":checked\");\n        var downloadImage = $(\"#edit-selector [name=downloadImage]\").is(\":checked\");\n        var clickPopup = $(\"#edit-selector [name=clickPopup]\").is(\":checked\");\n        var pageUrl = $(\"#edit-selector [name=pageUrl]\").val();\n        var startNum = !$(\"#edit-selector [name=startNum]\").val() ? 0 : parseInt($(\"#edit-selector [name=startNum]\").val());\n        var endNum = !$(\"#edit-selector [name=endNum]\").val() ? 0 : parseInt($(\"#edit-selector [name=endNum]\").val());\n        var regex = $(\"#edit-selector [name=regex]\").val();\n        var delay = $(\"#edit-selector [name=delay]\").val();\n        var extractAttribute = $(\"#edit-selector [name=extractAttribute]\").val();\n        var parentSelectors = $(\"#edit-selector [name=parentSelectors]\").val();\n        var columns = [];\n        var $columnHeaders = $(\"#edit-selector .column-header\");\n        var $columnNames = $(\"#edit-selector .column-name\");\n        var $columnExtracts = $(\"#edit-selector .column-extract\");\n\n        $columnHeaders.each(function(i){\n            var header = $($columnHeaders[i]).val();\n            var name = $($columnNames[i]).val();\n            var extract = $($columnExtracts[i]).is(\":checked\");\n            columns.push({\n                header:header,\n                name:name,\n                extract:extract\n            });\n        });\n\n        var newSelector = new Selector({\n            id: id,\n            selector: selectorsSelector,\n            tableHeaderRowSelector: tableHeaderRowSelector,\n            tableDataRowSelector: tableDataRowSelector,\n            clickElementSelector: clickElementSelector,\n            clickElementUniquenessType: clickElementUniquenessType,\n            clickType: clickType,\n            discardInitialElements: discardInitialElements,\n            type: type,\n            multiple: multiple,\n            downloadImage: downloadImage,\n            clickPopup: clickPopup,\n            pageUrl: pageUrl,\n            startNum: startNum,\n            endNum: endNum,\n            regex: regex,\n            extractAttribute:extractAttribute,\n            parentSelectors: parentSelectors,\n            columns:columns,\n            delay:delay\n        });\n        return newSelector;\n    },\n    /**\n     * @returns {Sitemap|*} 拷贝Sitemap返回当前selector\n     */\n    getCurrentlyEditedSelectorSitemap: function () {\n        var sitemap = this.state.currentSitemap.clone();\n        var selector = sitemap.getSelectorById(this.state.currentSelector.id);\n        var newSelector = this.getCurrentlyEditedSelector();\n        sitemap.updateSelector(selector, newSelector);\n        return sitemap;\n    },\n    cancelSelectorEditing: function (button) {\n\n        // cancel possible element selection\n        // this.contentScript.removeCurrentContentSelector().done(function() {\n        //     this.showSitemapSelectorList();\n        // }.bind(this));\n        this.showSitemapSelectorList();\n    },\n    // 添加新选择器\n    addSelector: function () {\n        var parentSelectorId = this.state.currentParentSelectorId;\n        var sitemap = this.state.currentSitemap;\n\n        var selector = new Selector({\n            parentSelectors: [parentSelectorId],\n            type: 'SelectorText',\n            multiple: false\n        });\n        // 修改选择器\n        this._editSelector(selector, sitemap);\n    },\n    // 删除选择器\n    deleteSelector: function (button) {\n\n        var sitemap = this.state.currentSitemap;\n        var selector = $(button).closest(\"tr\").data('selector');\n        sitemap.deleteSelector(selector);\n\n        // this.store.saveSitemap(sitemap, function () {\n        //     this.showSitemapSelectorList();\n        // }.bind(this));\n        this.showSitemapSelectorList();\n    },\n    deleteSitemap: function (button) {\n        var sitemap = $(button).closest(\"tr\").data(\"sitemap\");\n        var controller = this;\n\n        // stats\n        // this.backgroundScript.incrementDailyStat({\n        //     key: \"sitemapsDeleted\",\n        //     increment: 1\n        // });\n\n        this.store.deleteSitemap(sitemap, function () {\n            controller.showSitemaps();\n        });\n    },\n    // 请求表单验证\n    initScrapeSitemapConfigValidation: function(){\n\t\t$('#viewport form').bootstrapValidator({\n\t\t\tfields: {\n\t\t\t\t\"requestInterval\": {\n\t\t\t\t\tvalidators: {\n\t\t\t\t\t\tnumeric: {\n\t\t\t\t\t\t\tmessage: '请求间隔必须是数字'\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"pageLoadDelay\": {\n\t\t\t\t\tvalidators: {\n\t\t\t\t\t\tnumeric: {\n\t\t\t\t\t\t\tmessage: '翻页间隔必须是数字'\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n                \"sitemapConfig\": {\n\t\t\t\t\tvalidators: {\n\t\t\t\t\t\tnotEmpty: {\n\t\t\t\t\t\t\tmessage: '不能为空'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: {\n\t\t\t\t\t\t\tmessage: '字段选择器格式错误，或缺失_id, startUrl, selectors字段，请检查',\n\t\t\t\t\t\t\tcallback: function(value, validator) {\n\t\t\t\t\t\t\t    try{\n\t\t\t\t\t\t\t        var val = JSON.parse(value);\n\t\t\t\t\t\t\t        if (!val['url']) throw 'KeyError';\n\t\t\t\t\t\t\t        // if (!val['dynamic']) throw 'KeyError';\n\t\t\t\t\t\t\t        // if (!val['proxy']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['header']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['form']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['cookie']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['name']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['method']) throw 'KeyError';\n                                } catch (error){\n\t\t\t\t\t\t\t        return false;\n                                }\n                                return true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sitemapFields\": {\n\t\t\t\t\tvalidators: {\n\t\t\t\t\t\tnotEmpty: {\n\t\t\t\t\t\t\tmessage: '不能为空'\n\t\t\t\t\t\t},\n                        regex: {\n\t\t\t\t\t\t    regexp: /\"selectors\":\\[.+\\]/,\n                            message: 'selectors选择器为空，请添加字段',\n                        },\n\t\t\t\t\t\tcallback: {\n\t\t\t\t\t\t\tmessage: '字段选择器格式错误，或缺失_id, startUrl, selectors字段，请检查',\n\t\t\t\t\t\t\tcallback: function(value, validator) {\n\t\t\t\t\t\t\t    try{\n\t\t\t\t\t\t\t        var val = JSON.parse(value);\n\t\t\t\t\t\t\t        if (!val['_id']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['startUrl']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['selectors']) throw 'KeyError';\n                                } catch (error){\n\t\t\t\t\t\t\t        return false;\n                                }\n                                return true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n    // 保存表单验证\n    initScrapeSitemapSaveValidation: function(){\n\t\t$('#viewport form').bootstrapValidator({\n\t\t\tfields: {\n                \"sitemapConfigSave\": {\n\t\t\t\t\tvalidators: {\n\t\t\t\t\t\tnotEmpty: {\n\t\t\t\t\t\t\tmessage: '不能为空'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcallback: {\n\t\t\t\t\t\t\tmessage: '字段选择器格式错误，或缺失_id, startUrl, selectors字段，请检查',\n\t\t\t\t\t\t\tcallback: function(value, validator) {\n\t\t\t\t\t\t\t    try{\n\t\t\t\t\t\t\t        var val = JSON.parse(value);\n\t\t\t\t\t\t\t        if (!val['url']) throw 'KeyError';\n\t\t\t\t\t\t\t        // if (!val['dynamic']) throw 'KeyError';\n\t\t\t\t\t\t\t        // if (!val['proxy']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['header']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['form']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['cookie']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['name']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['method']) throw 'KeyError';\n                                } catch (error){\n\t\t\t\t\t\t\t        return false;\n                                }\n                                return true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"sitemapFieldsSave\": {\n\t\t\t\t\tvalidators: {\n\t\t\t\t\t\tnotEmpty: {\n\t\t\t\t\t\t\tmessage: '不能为空'\n\t\t\t\t\t\t},\n                        regex: {\n\t\t\t\t\t\t    regexp: /\"selectors\":\\[.+\\]/,\n                            message: 'selectors选择器为空，请添加字段',\n                        },\n\t\t\t\t\t\tcallback: {\n\t\t\t\t\t\t\tmessage: '字段选择器格式错误，或缺失_id, startUrl, selectors字段，请检查',\n\t\t\t\t\t\t\tcallback: function(value, validator) {\n\t\t\t\t\t\t\t    try{\n\t\t\t\t\t\t\t        var val = JSON.parse(value);\n\t\t\t\t\t\t\t        if (!val['_id']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['startUrl']) throw 'KeyError';\n\t\t\t\t\t\t\t        if (!val['selectors']) throw 'KeyError';\n                                } catch (error){\n\t\t\t\t\t\t\t        return false;\n                                }\n                                return true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n    // 配置请求参数\n    showScrapeSitemapConfigPanel: function() {\n        this.setActiveNavigationButton('sitemap-scrape');\n        // 获取sitemap JSON数据\n        var sitemap = this.state.currentSitemap;\n        var sitemapJSON = sitemap.exportSitemap();\n        var sitemapConfig = JSON.stringify(window.CONFIG_DATA);\n        var scrapeConfigPanel = ich.SitemapScrapeConfig({\n            sitemapConfig: sitemapConfig,\n            sitemapJSON: sitemapJSON\n        });\n        $(\"#viewport\").html(scrapeConfigPanel);\n        // 表单验证\n        this.initScrapeSitemapConfigValidation();\n        return true;\n    },\n    // 开始任务\n    scrapeSitemap: function () {\n        if(!this.isValidForm()) {\n            return false;\n        }\n        var sitemap = this;\n        // stats\n        // this.backgroundScript.incrementDailyStat({\n        //     key: \"scrapingJobsRun\",\n        //     increment: 1\n        // });\n        // 请求间隔\n        var requestInterval = parseInt($(\"input[name=requestInterval]\").val() ? $(\"input[name=requestInterval]\").val() : 0);\n        // 翻页间隔\n        var pageLoadDelay = parseInt($(\"input[name=pageLoadDelay]\").val() ? $(\"input[name=pageLoadDelay]\").val() : 0);\n        // 选择器字段\n        var selectedField = $('#sitemapFields').val();\n        // 任务配置\n        var config = $('#sitemapConfig').val();\n        // 字段验证\n        if (JSON.parse(config)['name'] === 'config' || JSON.parse(selectedField)['_id'] === 'config'){\n            sitemap.getFormValidator().destroy();\n            $(\".scraping-in-progress\").html('配置名称不能为config， 请修改\"任务配置\"中\"name\"参数或\"字段选择器\"中\"_id\"参数')\n                .removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n            $(\"#submit-scrape-sitemap\").closest(\".form-group\").hide();\n            return true;\n        }\n        // 数据\n        var request = {\n            scrapeSitemap: true,\n            selectedField: JSON.parse(selectedField),\n            requestInterval: requestInterval,\n            pageLoadDelay: pageLoadDelay,\n            config: JSON.parse(config)\n        };\n        // 推送到tornado\n        $.ajax({\n            url: \"/crawler/start\",\n            type : \"post\",\n            async: true,\n            data: JSON.stringify(request)\n        }).done(function (data){\n            if (data.state){\n                // 更改运行样式\n                sitemap.getFormValidator().destroy();\n                $(\".scraping-in-progress\").removeClass(\"hide\");\n                $(\"#submit-scrape-sitemap\").closest(\".form-group\").hide();\n                $(\"#scrape-sitemap-config input\").prop('disabled', true);\n                $(\"textarea[class=form-control]\").prop('disabled', true);\n            } else {\n                // 更改运行样式\n                sitemap.getFormValidator().destroy();\n                $(\".scraping-in-progress\").html(data.message).removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n                $(\"#submit-scrape-sitemap\").closest(\".form-group\").hide();\n            }\n        }).fail(function (data){\n            // 更改运行样式\n            sitemap.getFormValidator().destroy();\n            $(\".scraping-in-progress\").html('发送数据失败, 请检查参数.').removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n            $(\"#submit-scrape-sitemap\").closest(\".form-group\").hide();\n        });\n        // 插件版运行任务\n        // chrome.runtime.sendMessage(request, function (response) {\n        //     this.browseSitemapData();\n        // }.bind(this));\n        return true;\n    },\n    sitemapListBrowseSitemapData: function (button) {\n        var sitemap = $(button).closest(\"tr\").data(\"sitemap\");\n        this.setStateEditSitemap(sitemap);\n        this.browseSitemapData();\n    },\n    browseSitemapData: function () {\n        this.setActiveNavigationButton('sitemap-browse');\n        var sitemap = this.state.currentSitemap;\n        this.store.getSitemapData(sitemap, function (data) {\n\n            var dataColumns = sitemap.getDataColumns();\n\n            var dataPanel = ich.SitemapBrowseData({\n                columns: dataColumns\n            });\n            $(\"#viewport\").html(dataPanel);\n\n            // display data\n            // Doing this the long way so there aren't xss vulnerubilites\n            // while working with data or with the selector titles\n            var $tbody = $(\"#sitemap-data tbody\");\n            data.forEach(function (row) {\n                var $tr = $(\"<tr></tr>\");\n                dataColumns.forEach(function (column) {\n                    var $td = $(\"<td></td>\");\n                    var cellData = row[column];\n                    if (typeof cellData === 'object') {\n                        cellData = JSON.stringify(cellData);\n                    }\n                    $td.text(cellData);\n                    $tr.append($td);\n                });\n                $tbody.append($tr);\n            });\n        }.bind(this));\n\n        return true;\n    },\n\n    showSitemapExportDataCsvPanel: function () {\n        this.setActiveNavigationButton('sitemap-export-data-csv');\n\n        var sitemap = this.state.currentSitemap;\n        var exportPanel = ich.SitemapExportDataCSV(sitemap);\n        $(\"#viewport\").html(exportPanel);\n\n        // generate data\n        $(\".download-button\").hide();\n        this.store.getSitemapData(sitemap, function (data) {\n            var blob = sitemap.getDataExportCsvBlob(data);\n            $(\".download-button a\").attr(\"href\", window.URL.createObjectURL(blob));\n            $(\".download-button a\").attr(\"download\", sitemap._id + \".csv\");\n            $(\".download-button\").show();\n        }.bind(this));\n\n        return true;\n    },\n    // 元素选择器\n    selectSelector: function (button) {\n        // 选择器文本框\n        var input = $(button).closest(\".form-group\").find(\"input.selector-value\");\n        // 当前sitemap\n        var sitemap = this.getCurrentlyEditedSelectorSitemap();\n        // 当前selector\n        var selector = this.getCurrentlyEditedSelector();\n        // 选择器父容器id[\"_root\"]\n        var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n        // 父容器选择器\n        var parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(currentStateParentSelectorIds);\n        // 开启当前css选择器\n        var deferredSelector = this.contentScript.selectSelector({\n            parentCSSSelector: parentCSSSelector,\n            allowedElements: selector.getItemCSSSelector(),\n            selectorType: $(\"#edit-selector select[name=type]\").val()\n        });\n\n        deferredSelector.done(function(result) {\n            $(input).val(result.CSSSelector);\n            // 更新选择器字段的验证\n            var validator = this.getFormValidator();\n            validator.revalidateField(input);\n            // @TODO how could this be encapsulated?\n            // update header row, data row selectors after selecting the table. selectors are updated based on tables\n            // inner html\n            if(selector.type === 'SelectorTable') {\n                this.getSelectorHTML().done(function(html) {\n                    var tableHeaderRowSelector = SelectorTable.getTableHeaderRowSelectorFromTableHTML(html);\n                    var tableDataRowSelector = SelectorTable.getTableDataRowSelectorFromTableHTML(html);\n                    $(\"input[name=tableHeaderRowSelector]\").val(tableHeaderRowSelector);\n                    $(\"input[name=tableDataRowSelector]\").val(tableDataRowSelector);\n                    var headerColumns = SelectorTable.getTableHeaderColumnsFromHTML(tableHeaderRowSelector, html);\n                    this.renderTableHeaderColumns(headerColumns);\n                }.bind(this));\n            }\n\n        }.bind(this));\n    },\n\n    getCurrentStateParentSelectorIds: function() {\n\n        var parentSelectorIds = this.state.editSitemapBreadcumbsSelectors.map(function(selector) {\n            return selector.id;\n        });\n\n        return parentSelectorIds;\n    },\n\n    selectTableHeaderRowSelector: function(button) {\n\n        var input = $(button).closest(\".form-group\").find(\"input.selector-value\");\n        var sitemap = this.getCurrentlyEditedSelectorSitemap();\n        var selector = this.getCurrentlyEditedSelector();\n        var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n        var parentCSSSelector = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, currentStateParentSelectorIds);\n\n        var deferredSelector = this.contentScript.selectSelector({\n            parentCSSSelector: parentCSSSelector,\n            allowedElements: \"tr\"\n        });\n\n        deferredSelector.done(function(result) {\n            var tableHeaderRowSelector = result.CSSSelector;\n            $(input).val(tableHeaderRowSelector);\n\n            this.getSelectorHTML().done(function(html) {\n                var headerColumns = SelectorTable.getTableHeaderColumnsFromHTML(tableHeaderRowSelector, html);\n                this.renderTableHeaderColumns(headerColumns);\n            }.bind(this));\n\n            // update validation for selector field\n            var validator = this.getFormValidator();\n            validator.revalidateField(input);\n\n        }.bind(this));\n    },\n\n    selectTableDataRowSelector: function(button) {\n        var input = $(button).closest(\".form-group\").find(\"input.selector-value\");\n        var sitemap = this.getCurrentlyEditedSelectorSitemap();\n        var selector = this.getCurrentlyEditedSelector();\n        var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n        var parentCSSSelector = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, currentStateParentSelectorIds);\n\n        var deferredSelector = this.contentScript.selectSelector({\n            parentCSSSelector: parentCSSSelector,\n            allowedElements: \"tr\"\n        });\n        deferredSelector.done(function(result) {\n            $(input).val(result.CSSSelector);\n            // update validation for selector field\n            var validator = this.getFormValidator();\n            validator.revalidateField(input);\n        }.bind(this));\n    },\n\n    /**\n     * update table selector column editing fields\n     */\n    renderTableHeaderColumns: function(headerColumns) {\n\n        // reset previous columns\n        var $tbody = $(\".feature-columns table tbody\");\n        $tbody.html(\"\");\n        headerColumns.forEach(function(column) {\n            var $row = ich.SelectorEditTableColumn(column);\n            $tbody.append($row);\n        });\n    },\n\n    /**\n     * Returns HTML that the current selector would select\n     */\n    getSelectorHTML: function() {\n\n        var sitemap = this.getCurrentlyEditedSelectorSitemap();\n        var selector = this.getCurrentlyEditedSelector();\n        var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n        var CSSSelector = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, currentStateParentSelectorIds);\n        var deferredHTML = this.contentScript.getHTML({CSSSelector: CSSSelector});\n\n        return deferredHTML;\n    },\n    // 选择器-显示元素\n    previewSelector: function (button) {\n        if (!$(button).hasClass('preview')) {\n            var sitemap = this.getCurrentlyEditedSelectorSitemap();\n            var selector = this.getCurrentlyEditedSelector();\n            var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n            var parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(currentStateParentSelectorIds);\n            var deferredSelectorPreview = this.contentScript.previewSelector({\n                parentCSSSelector: parentCSSSelector,\n                elementCSSSelector: selector.selector\n            });\n            deferredSelectorPreview.done(function() {\n                $(button).addClass(\"preview\");\n            });\n        } else {\n            this.contentScript.removeCurrentContentSelector();\n            $(button).removeClass(\"preview\");\n        }\n    },\n    previewClickElementSelector: function(button) {\n\n        if (!$(button).hasClass('preview')) {\n\n            var sitemap = this.state.currentSitemap;\n            var selector = this.getCurrentlyEditedSelector();\n            var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n            var parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(currentStateParentSelectorIds);\n\n            var deferredSelectorPreview = this.contentScript.previewSelector({\n                parentCSSSelector: parentCSSSelector,\n                elementCSSSelector: selector.clickElementSelector\n            });\n\n            deferredSelectorPreview.done(function() {\n                $(button).addClass(\"preview\");\n            });\n        } else {\n            this.contentScript.removeCurrentContentSelector();\n            $(button).removeClass(\"preview\");\n        }\n    },\n    previewTableRowSelector: function(button) {\n\n        if (!$(button).hasClass('preview')) {\n\n            var sitemap = this.getCurrentlyEditedSelectorSitemap();\n            var selector = this.getCurrentlyEditedSelector();\n            var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n            var parentCSSSelector = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, currentStateParentSelectorIds);\n            var rowSelector = $(button).closest(\".form-group\").find(\"input\").val();\n\n            var deferredSelectorPreview = this.contentScript.previewSelector({\n                parentCSSSelector: parentCSSSelector,\n                elementCSSSelector: rowSelector\n            });\n\n            deferredSelectorPreview.done(function() {\n                $(button).addClass(\"preview\");\n            });\n        } else {\n            this.contentScript.removeCurrentContentSelector();\n            $(button).removeClass(\"preview\");\n        }\n    },\n    previewSelectorFromSelectorTree: function (button) {\n        if (!$(button).hasClass('preview')) {\n            var sitemap = this.state.currentSitemap;\n            var selector = $(button).closest(\"tr\").data('selector');\n            var currentStateParentSelectorIds = this.getCurrentStateParentSelectorIds();\n            var parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(currentStateParentSelectorIds);\n            var deferredSelectorPreview = this.contentScript.previewSelector({\n                parentCSSSelector: parentCSSSelector,\n                elementCSSSelector: selector.selector\n            });\n            deferredSelectorPreview.done(function() {\n                $(button).addClass(\"preview\");\n            });\n        } else {\n            this.contentScript.removeCurrentContentSelector();\n            $(button).removeClass(\"preview\");\n        }\n    },\n    // sitemap数据预览入口\n    previewSelectorDataFromSelectorTree: function (button) {\n        var sitemap = this.state.currentSitemap;\n        var selector = $(button).closest(\"tr\").data('selector');\n        this.previewSelectorData(sitemap, selector.id);\n    },\n    // 数据预览入口函数\n    previewSelectorDataFromSelectorEditing: function() {\n        var sitemap = this.state.currentSitemap.clone();\n        var selector = sitemap.getSelectorById(this.state.currentSelector.id);\n        var newSelector = this.getCurrentlyEditedSelector();\n        sitemap.updateSelector(selector, newSelector);\n        // 选择器-数据预览\n        this.previewSelectorData(sitemap, newSelector.id);\n    },\n    /**\n     * Returns a list of selector ids that the user has opened\n     * @returns {Array}\n     */\n    getStateParentSelectorIds: function(){\n        var parentSelectorIds = [];\n        this.state.editSitemapBreadcumbsSelectors.forEach(function(selector){\n            parentSelectorIds.push(selector.id);\n        });\n        return parentSelectorIds;\n    },\n    // 显示预览数据\n    showPreviewSelectorData: function (response){\n        if (response.length === 0) {\n            return\n        }\n        var dataColumns = Object.keys(response[0]);\n        // 加载模板\n        var $dataPreviewPanel = ich.DataPreview({\n            columns: dataColumns\n        });\n        $(\"body\").append($dataPreviewPanel);\n        $dataPreviewPanel.modal({keyboard: true});\n        // display data\n        // Doing this the long way so there aren't xss vulnerubilites\n        // while working with data or with the selector titles\n        var $tbody = $(\"tbody\", $dataPreviewPanel);\n        response.forEach(function (row) {\n            var $tr = $(\"<tr></tr>\");\n            dataColumns.forEach(function (column) {\n                var $td = $(\"<td></td>\");\n                var cellData = row[column];\n                if (typeof cellData === 'object') {\n                    cellData = JSON.stringify(cellData);\n                }\n                $td.text(cellData);\n                $tr.append($td);\n            });\n            $tbody.append($tr);\n        });\n        // var windowHeight = $(\".sidebar\").height();\n        // $(\".data-preview-modal .modal-body\").height(windowHeight - 130);\n        // 关闭后移除模态框\n        $dataPreviewPanel.on(\"hidden.bs.modal\", function () {\n            $(this).remove();\n        });\n    },\n    // 选择器-数据预览\n    previewSelectorData: function (sitemap, selectorId) {\n        // data preview will be base on how the selector tree is opened\n        var parentSelectorIds = this.getStateParentSelectorIds();\n        var request = {\n            previewSelectorData: true,\n            sitemap: JSON.parse(JSON.stringify(sitemap)),\n            parentSelectorIds: parentSelectorIds,\n            selectorId: selectorId\n        };\n        // 提取数据\n        // if (request.extractData){\n\t\t\t// var extractor = new window.collect.DataExtractor(request);\n\t\t\t// var deferredData = extractor.getData();\n\t\t\t// deferredData.done(function(data){\n\t\t\t// \tthis.showPreviewSelectorData(data);\n\t\t\t// }.bind(this));\n\t\t\t// return true;\n\t\t// 预览数据\n\t\t// } else if (request.previewSelectorData){\n        var extractor = new window.collect.DataExtractor(request);\n        var deferredData = extractor.getSingleSelectorData(request.parentSelectorIds, request.selectorId);\n        deferredData.done(function(data){\n            this.showPreviewSelectorData(data);\n        }.bind(this));\n        return true;\n\t\t// 调用ContentScript交互\n\t\t// } else if (request.contentScriptCall){\n\t\t// \tvar contentScript = getContentScript(\"ContentScript\");\n\t\t// \tvar deferredResponse = contentScript[request.fn](request.request);\n\t\t// \tdeferredResponse.done(function(response) {\n\t\t// \t\tthis.showPreviewSelectorData(response);\n\t\t// \t}.bind(this));\n\t\t// \treturn true;\n\t\t// }\n    },\n    /**\n     * Add start url to sitemap creation or editing form\n     * @param button\n     */\n    addStartUrl: function(button) {\n\n        var $startUrlInputField = ich.SitemapStartUrlField();\n        $(\"#viewport .start-url-block:last\").after($startUrlInputField);\n        var validator = this.getFormValidator();\n        validator.addField($startUrlInputField.find(\"input\"));\n    },\n    /**\n     * Remove start url from sitemap creation or editing form.\n     * @param button\n     */\n    removeStartUrl: function(button) {\n\n        var $block = $(button).closest(\".start-url-block\");\n        if($(\"#viewport .start-url-block\").length > 1) {\n\n            // remove from validator\n            var validator = this.getFormValidator();\n            validator.removeField($block.find(\"input\"));\n\n            $block.remove();\n        }\n    },\n    // 保存配置\n    saveConfig: function(){\n        // 请求间隔\n        var requestInterval = parseInt($(\"input[name=requestInterval]\").val() ? $(\"input[name=requestInterval]\").val() : 0);\n        // 翻页间隔\n        var pageLoadDelay = parseInt($(\"input[name=pageLoadDelay]\").val() ? $(\"input[name=pageLoadDelay]\").val() : 0);\n        // 选择器字段\n        var selectedField = $('#sitemapFieldsSave').val();\n        // 任务配置\n        var config = $('#sitemapConfigSave').val();\n        // 数据\n        var request = {\n            requestInterval: requestInterval,\n            pageLoadDelay: pageLoadDelay,\n            selectedField: selectedField,\n            config: config\n        };\n        var sitemap = this;\n        // 推送到tornado\n        $.ajax({\n            url: \"/data/save\",\n            type : \"post\",\n            async: true,\n            data: request\n        }).done(function (data){\n            if (data.state){\n                // 更改运行样式\n                sitemap.getFormValidator().destroy();\n                $(\".scraping-in-progress\").removeClass(\"hide\");\n                $('button[action=sitemap-save-button]').closest(\".form-group\").hide();\n                $(\"textarea[class=form-control]\").prop('disabled', true);\n            } else {\n                // 更改运行样式\n                sitemap.getFormValidator().destroy();\n                $(\".scraping-in-progress\").html(data.message).removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n                $('button[action=sitemap-save-button]').closest(\".form-group\").hide();\n            }\n        }).fail(function (){\n            // 更改运行样式\n            sitemap.getFormValidator().destroy();\n            $(\".scraping-in-progress\").html('发送数据失败, 请检查参数.').removeClass(\"hide alert-success\").addClass(\"alert-danger\");\n            $(\"#submit-scrape-sitemap\").closest(\".form-group\").hide();\n        });\n        return true;\n    }\n};\n"
  },
  {
    "path": "server/static/scripts/DataExtractor.js",
    "content": "DataExtractor = function (options) {\n\tif (options.sitemap instanceof parent.Sitemap) {\n\t\tthis.sitemap = options.sitemap;\n\t} else {\n\t\tthis.sitemap = new parent.Sitemap(options.sitemap);\n\t}\n\n\tthis.parentSelectorId = options.parentSelectorId;\n\tthis.parentElement = options.parentElement || $(\"html\")[0];\n};\n\nDataExtractor.prototype = {\n    /**\n     * 返回一新SelectorList对象. follow=true splits selectors in trees.\n     * Two side by side type=multiple selectors split trees.\n     */\n\tfindSelectorTrees: function () {\n\t\treturn this._findSelectorTrees(this.parentSelectorId, new parent.SelectorList());\n\t},\n\n\t/**\n\t * the selector cannot return multiple records and it also cannot create new jobs. Also all of its child selectors\n\t * must have the same features\n\t * @param selector\n\t * @returns {boolean}\n\t */\n\tselectorIsCommonToAllTrees: function (selector) {\n\n\t\t// selectors which return mutiple items cannot be common to all\n\t\t// selectors\n\t\tif (selector.willReturnMultipleRecords()) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Link selectors which will follow to a new page also cannot be common\n\t\t// to all selectors\n\t\tif (selector.canCreateNewJobs()\n\t\t\t&& this.sitemap.getDirectChildSelectors(selector.id).length > 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// also all child selectors must have the same features\n\t\tvar childSelectors = this.sitemap.getAllSelectors(selector.id);\n\t\tfor (var i in childSelectors) {\n\t\t\tvar childSelector = childSelectors[i];\n\t\t\tif (!this.selectorIsCommonToAllTrees(childSelector)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\tgetSelectorsCommonToAllTrees: function (parentSelectorId) {\n\t\tvar commonSelectors = [];\n\t\t// SelectorList类型, 该选择器的子选择器\n\t\tvar childSelectors = this.sitemap.getDirectChildSelectors(parentSelectorId);\n\n\t\tchildSelectors.forEach(function (childSelector) {\n\t\t\tif (this.selectorIsCommonToAllTrees(childSelector)) {\n\t\t\t\tcommonSelectors.push(childSelector);\n\t\t\t\t// also add all child selectors which. Child selectors were also checked\n\t\t\t\tvar selectorChildSelectors = this.sitemap.getAllSelectors(childSelector.id);\n\t\t\t\tselectorChildSelectors.forEach(function (selector) {\n\t\t\t\t\tif (commonSelectors.indexOf(selector) === -1) {\n\t\t\t\t\t\tcommonSelectors.push(selector);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\t\t}.bind(this));\n\n\t\treturn commonSelectors;\n\t},\n\t// 返回选择器树结构\n\t_findSelectorTrees: function (parentSelectorId, commonSelectorsFromParent) {\n\t\tvar commonSelectors = commonSelectorsFromParent.concat(this.getSelectorsCommonToAllTrees(parentSelectorId));\n\t\t// find selectors that will be making a selector tree\n\t\tvar selectorTrees = [];\n\t\tvar childSelectors = this.sitemap.getDirectChildSelectors(parentSelectorId);\n\n\t\tchildSelectors.forEach(function (selector) {\n\t\t\tif (!this.selectorIsCommonToAllTrees(selector)) {\n\t\t\t\t// this selector will be making a new selector tree. But this selector might contain some child\n\t\t\t\t// selectors that are making more trees so here should be a some kind of seperation for that\n\t\t\t\tif (!selector.canHaveLocalChildSelectors()) {\n\t\t\t\t\tvar selectorTree = commonSelectors.concat([selector]);\n\t\t\t\t\tselectorTrees.push(selectorTree);\n\t\t\t\t} else {\n\t\t\t\t\t// find selector tree within this selector\n\t\t\t\t\tvar commonSelectorsFromParent = commonSelectors.concat([selector]);\n\t\t\t\t\tvar childSelectorTrees = this._findSelectorTrees(selector.id, commonSelectorsFromParent);\n\t\t\t\t\tselectorTrees = selectorTrees.concat(childSelectorTrees);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this));\n\t\t// it there were not any selectors that make a separate tree then all common selectors make up a single selector tree\n\t\tif (selectorTrees.length === 0) {\n\t\t\treturn [commonSelectors];\n\t\t} else {\n\t\t\treturn selectorTrees;\n\t\t}\n\t},\n\n\tgetSelectorTreeCommonData: function (selectors, parentSelectorId, parentElement) {\n\t\tvar childSelectors = selectors.getDirectChildSelectors(parentSelectorId);\n\t\tvar deferredDataCalls = [];\n\t\tchildSelectors.forEach(function (selector) {\n\t\t\tif (!selectors.willReturnMultipleRecords(selector.id)) {\n\t\t\t\tdeferredDataCalls.push(this.getSelectorCommonData.bind(this,selectors, selector, parentElement));\n\t\t\t}\n\t\t}.bind(this));\n\n\t\tvar deferredResponse = $.Deferred();\n\t\t$.whenCallSequentially(deferredDataCalls).done(function(responses) {\n\t\t\tvar commonData = {};\n            responses.forEach(function(data) {\n\t\t\t\tcommonData = Object.merge(commonData, data);\n\t\t\t});\n\t\t\tdeferredResponse.resolve(commonData);\n\t\t});\n\n\t\treturn deferredResponse;\n\t},\n\n\tgetSelectorCommonData: function(selectors, selector, parentElement) {\n\t\tvar d = $.Deferred();\n\t\tvar deferredData = selector.getData(parentElement);\n\t\tdeferredData.done(function(data) {\n\t\t\tif (selector.willReturnElements()) {\n\t\t\t\tvar newParentElement = data[0];\n\t\t\t\tvar deferredChildCommonData = this.getSelectorTreeCommonData(selectors, selector.id, newParentElement);\n\t\t\t\tdeferredChildCommonData.done(function(data){\n\t\t\t\t\td.resolve(data);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\td.resolve(data[0]);\n\t\t\t}\n\t\t}.bind(this));\n\n\t\treturn d;\n\t},\n\n\t/**\n\t * Returns all data records for a selector that can return multiple records\n\t */\n\tgetMultiSelectorData: function(selectors, selector, parentElement, commonData) {\n\n\t\tvar deferredResponse = $.Deferred();\n\n\t\t// if the selector is not an Element selector then its fetched data is the result.\n\t\tif (!selector.willReturnElements()) {\n\n\t\t\tvar deferredData = selector.getData(parentElement);\n\t\t\tdeferredData.done(function(selectorData) {\n\t\t\t\tvar newCommonData = Object.clone(commonData, true);\n\t\t\t\tvar resultData = [];\n\n\t\t\t\tselectorData.forEach(function (record) {\n\t\t\t\t\tObject.merge(record, newCommonData, true);\n\t\t\t\t\tresultData.push(record);\n\t\t\t\t}.bind(this));\n\n\t\t\t\tdeferredResponse.resolve(resultData);\n\t\t\t}.bind(this));\n\n\t\t}\n\n\t\t// handle situation when this selector is an elementSelector\n\t\tvar deferredData = selector.getData(parentElement);\n\t\tdeferredData.done(function(selectorData) {\n\t\t\tvar deferredDataCalls = [];\n\n\t\t\tselectorData.forEach(function (element) {\n\t\t\t\tvar newCommonData = Object.clone(commonData, true);\n\t\t\t\tvar childRecordDeferredCall = this.getSelectorTreeData.bind(this, selectors, selector.id, element, newCommonData);\n\t\t\t\tdeferredDataCalls.push(childRecordDeferredCall);\n\t\t\t}.bind(this));\n\n\t\t\t$.whenCallSequentially(deferredDataCalls).done(function(responses) {\n\t\t\t\tvar resultData = [];\n\t\t\t\tresponses.forEach(function(childRecordList) {\n\t\t\t\t\tchildRecordList.forEach(function(childRecord){\n\t\t\t\t\t\tvar rec = new Object();\n\t\t\t\t\t\tObject.merge(rec, childRecord, true);\n\t\t\t\t\t\tresultData.push(rec);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tdeferredResponse.resolve(resultData);\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\n\t\treturn deferredResponse;\n\t},\n\n\tgetSelectorTreeData: function (selectors, parentSelectorId, parentElement, commonData) {\n\n\t\tvar childSelectors = selectors.getDirectChildSelectors(parentSelectorId);\n\t\tvar childCommonDataDeferred = this.getSelectorTreeCommonData(selectors, parentSelectorId, parentElement);\n\t\tvar deferredResponse = $.Deferred();\n\n\t\tchildCommonDataDeferred.done(function(childCommonData) {\n\t\t\tcommonData = Object.merge(commonData, childCommonData);\n\t\t\tvar dataDeferredCalls = [];\n\n\t\t\tchildSelectors.forEach(function (selector) {\n\t\t\t\tif (selectors.willReturnMultipleRecords(selector.id)) {\n\t\t\t\t\tvar newCommonData = Object.clone(commonData, true);\n\t\t\t\t\tvar dataDeferredCall = this.getMultiSelectorData.bind(this, selectors, selector, parentElement, newCommonData);\n\t\t\t\t\tdataDeferredCalls.push(dataDeferredCall);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\n\t\t\t// merge all data records together\n\t\t\t$.whenCallSequentially(dataDeferredCalls).done(function(responses) {\n\t\t\t\tvar resultData = [];\n\t\t\t\tresponses.forEach(function(childRecords) {\n                    childRecords.forEach(function(childRecord){\n\t\t\t\t\t\tvar rec = new Object();\n\t\t\t\t\t\tObject.merge(rec, childRecord, true);\n\t\t\t\t\t\tresultData.push(rec);\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tif (resultData.length === 0) {\n\t\t\t\t\t// If there are no multi record groups then return common data.\n\t\t\t\t\t// In a case where common data is empty return nothing.\n\t\t\t\t\tif(Object.keys(commonData).length === 0) {\n\t\t\t\t\t\tdeferredResponse.resolve([]);\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdeferredResponse.resolve([commonData]);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdeferredResponse.resolve(resultData);\n\t\t\t\t}\n\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\n\t\treturn deferredResponse;\n\t},\n\t// 获取数据\n\tgetData: function () {\n\t\tvar selectorTrees = this.findSelectorTrees();\n\t\tvar dataDeferredCalls = [];\n\n\t\tselectorTrees.forEach(function (selectorTree) {\n\t\t\tvar deferredTreeDataCall = this.getSelectorTreeData.bind(this, selectorTree, this.parentSelectorId, this.parentElement, {});\n\t\t\tdataDeferredCalls.push(deferredTreeDataCall);\n\t\t}.bind(this));\n\n\t\tvar responseDeferred = $.Deferred();\n\t\t$.whenCallSequentially(dataDeferredCalls).done(function(responses) {\n\t\t\tvar results = [];\n\t\t\tresponses.forEach(function(dataResults) {\n\t\t\t\tresults = results.concat(dataResults);\n\t\t\t}.bind(this));\n\t\t\tresponseDeferred.resolve(results);\n\t\t}.bind(this));\n\t\treturn responseDeferred;\n\t},\n\t// 获取显示数据\n\tgetSingleSelectorData: function(parentSelectorIds, selectorId) {\n\t\t// to fetch only single selectors data we will create a sitemap that only contains this selector, his\n\t\t// parents and all child selectors\n\t\tvar sitemap = this.sitemap;\n\t\t// 该选择器Selector对象\n\t\tvar selector = this.sitemap.selectors.getSelector(selectorId);\n\t\t// 存在时，递归查找所有子选择器\n\t\tvar childSelectors = sitemap.selectors.getAllSelectors(selectorId);\n\t\t// _root下一级父容器Selector对象集\n\t\tvar parentSelectors = [];\n\t\tfor(var i = parentSelectorIds.length-1;i>=0;i--) {\n\t\t\tvar id = parentSelectorIds[i];\n\t\t\tif(id === '_root') break;\n\t\t\tvar parentSelector = this.sitemap.selectors.getSelector(id);\n\t\t\tparentSelectors.push(parentSelector);\n\t\t}\n\n\t\t// 该选择器链\n\t\tvar selectors = parentSelectors.concat(childSelectors);\n\t\tselectors.push(selector);\n\t\tsitemap.selectors = new parent.SelectorList(selectors);\n\n\t\tvar parentSelectorId;\n\t\t// find the parent that leaded to the page where required selector is being used\n\t\t// 选择器获取数据必须寻找父容器用以确定页面\n\t\tfor(var i = parentSelectorIds.length-1;i>=0;i--) {\n\t\t\tvar id = parentSelectorIds[i];\n\t\t\tif(id === '_root') {\n\t\t\t\tparentSelectorId = id;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar parentSelector = this.sitemap.selectors.getSelector(parentSelectorIds[i]);\n\t\t\t// 非elements对象\n\t\t\tif(!parentSelector.willReturnElements()) {\n\t\t\t\tparentSelectorId = id;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.parentSelectorId = parentSelectorId;\n\n\t\treturn this.getData();\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/ElementQuery.js",
    "content": "/**\n * Element selector. Uses jQuery as base and adds some more features\n * @param parentElement\n * @param selector\n */\nElementQuery = function(CSSSelector, parentElement) {\n\n\tCSSSelector = CSSSelector || \"\";\n\n\tvar selectedElements = [];\n\n\tvar addElement = function(element) {\n\t\tif(selectedElements.indexOf(element) === -1) {\n\t\t\tselectedElements.push(element);\n\t\t}\n\t};\n\n\tvar selectorParts = ElementQuery.getSelectorParts(CSSSelector);\n\tselectorParts.forEach(function(selector) {\n\n\t\t// handle special case when parent is selected\n\t\tif(selector === \"_parent_\") {\n\t\t\t$(parentElement).each(function(i, element){\n\t\t\t\taddElement(element);\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\tvar elements = $(selector, parentElement);\n\t\t\telements.each(function(i, element) {\n\t\t\t\taddElement(element);\n\t\t\t});\n\t\t}\n\t});\n\n\treturn selectedElements;\n};\n\nElementQuery.getSelectorParts = function(CSSSelector) {\n\n\tvar selectors = CSSSelector.split(/(,|\".*?\"|'.*?'|\\(.*?\\))/);\n\n\tvar resultSelectors = [];\n\tvar currentSelector = \"\";\n\tselectors.forEach(function(selector) {\n\t\tif(selector === ',') {\n\t\t\tif(currentSelector.trim().length) {\n\t\t\t\tresultSelectors.push(currentSelector.trim());\n\t\t\t}\n\t\t\tcurrentSelector = \"\";\n\t\t}\n\t\telse {\n\t\t\tcurrentSelector += selector;\n\t\t}\n\t});\n\tif(currentSelector.trim().length) {\n\t\tresultSelectors.push(currentSelector.trim());\n\t}\n\t\n\treturn resultSelectors;\n};\n"
  },
  {
    "path": "server/static/scripts/Job.js",
    "content": "var Job = function (url, parentSelector, scraper, parentJob, baseData) {\n\n\tif (parentJob !== undefined) {\n\t\tthis.url = this.combineUrls(parentJob.url, url);\n\t}\n\telse {\n\t\tthis.url = url;\n\t}\n\tthis.parentSelector = parentSelector;\n\tthis.scraper = scraper;\n\tthis.dataItems = [];\n\tthis.baseData = baseData || {\n\t\t'web-scraper-start-url': url\n\t};\n};\n\nJob.prototype = {\n\n\tcombineUrls: function (parentUrl, childUrl) {\n\n\t\tvar urlMatcher = new RegExp(\"(https?://)?([a-z0-9\\\\-\\\\.]+\\\\.[a-z0-9\\\\-]+(:\\\\d+)?|\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d+)?)?(\\\\/[^\\\\?]*\\\\/|\\\\/)?([^\\\\?]*)?(\\\\?.*)?\", \"i\");\n\n\t\tvar parentMatches = parentUrl.match(urlMatcher);\n\t\tvar childMatches = childUrl.match(urlMatcher);\n\n\t\t// special case for urls like this: ?a=1  or like-this/\n\t\tif (childMatches[1] === undefined && childMatches[2] === undefined && childMatches[5] === undefined && childMatches[6] === undefined) {\n\n\t\t\tvar url = parentMatches[1] + parentMatches[2] + parentMatches[5] + parentMatches[6] + childMatches[7];\n\t\t\treturn url;\n\t\t}\n\n\t\tif (childMatches[1] === undefined) {\n\t\t\tchildMatches[1] = parentMatches[1];\n\t\t}\n\t\tif (childMatches[2] === undefined) {\n\t\t\tchildMatches[2] = parentMatches[2];\n\t\t}\n\t\tif (childMatches[5] === undefined) {\n\t\t\tif(parentMatches[5] === undefined) {\n\t\t\t\tchildMatches[5] = '/';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchildMatches[5] = parentMatches[5];\n\t\t\t}\n\t\t}\n\n\t\tif (childMatches[6] === undefined) {\n\t\t\tchildMatches[6] = \"\";\n\t\t}\n\t\tif (childMatches[7] === undefined) {\n\t\t\tchildMatches[7] = \"\";\n\t\t}\n\n\t\treturn childMatches[1] + childMatches[2] + childMatches[5] + childMatches[6] + childMatches[7];\n\t},\n\n\texecute: function (browser, callback, scope) {\n\n\t\tvar sitemap = this.scraper.sitemap;\n\t\tvar job = this;\n\t\tbrowser.fetchData(this.url, sitemap, this.parentSelector, function (results) {\n\t\t\t// merge data with data from initialization\n\t\t\tfor (var i in results) {\n\t\t\t\tvar result = results[i];\n\t\t\t\tfor (var key in this.baseData) {\n\t\t\t\t\tif(!(key in result)) {\n\t\t\t\t\t\tresult[key] = this.baseData[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dataItems.push(result);\n\t\t\t}\n\t\t\tconsole.log(job);\n\t\t\tcallback(job);\n\t\t}.bind(this), this);\n\t},\n\tgetResults: function () {\n\t\treturn this.dataItems;\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Queue.js",
    "content": "var Queue = function () {\n\tthis.jobs = [];\n\tthis.scrapedUrls = {};\n};\n\nQueue.prototype = {\n\n\t/**\n\t * Returns false if page is already scraped\n\t * @param job\n\t * @returns {boolean}\n\t */\n\tadd: function (job) {\n\n\t\tif (this.canBeAdded(job)) {\n\t\t\tthis.jobs.push(job);\n\t\t\tthis._setUrlScraped(job.url);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tcanBeAdded: function (job) {\n\t\tif (this.isScraped(job.url)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// reject documents\n\t\tif (job.url.match(/\\.(doc|docx|pdf|ppt|pptx|odt)$/i) !== null) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tgetQueueSize: function () {\n\t\treturn this.jobs.length;\n\t},\n\n\tisScraped: function (url) {\n\t\treturn (this.scrapedUrls[url] !== undefined);\n\t},\n\n\t_setUrlScraped: function (url) {\n\t\tthis.scrapedUrls[url] = true;\n\t},\n\n\tgetNextJob: function () {\n\n\t\t// @TODO test this\n\t\tif (this.getQueueSize() > 0) {\n\t\t\treturn this.jobs.pop();\n\t\t}\n\t\telse {\n\t\t\treturn false;\n\t\t}\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Scraper.js",
    "content": "Scraper = function (options) {\n\tthis.queue = options.queue;\n\tthis.sitemap = options.sitemap;\n\tthis.store = options.store;\n\tthis.browser = options.browser;\n\tthis.resultWriter = null; // db instance for scraped data writing\n\tthis.requestInterval = parseInt(options.requestInterval);\n\tthis.pageLoadDelay = parseInt(options.pageLoadDelay);\n\tthis.stats = options.stats;\n};\n\nScraper.prototype = {\n\n\t/**\n\t * Scraping delay between two page opening requests\n\t */\n\trequestInterval: 2000,\n\t_timeNextScrapeAvailable: 0,\n\n\tinitFirstJobs: function () {\n\n\t\tvar urls = this.sitemap.getStartUrls();\n\n\t\turls.forEach(function (url) {\n\t\t\tvar firstJob = new Job(url, \"_root\", this);\n\t\t\tthis.queue.add(firstJob);\n\t\t}.bind(this));\n\t},\n\n\trun: function (executionCallback) {\n\n\t\tvar scraper = this;\n\n\t\t// callback when scraping is finished\n\t\tthis.executionCallback = executionCallback;\n\n\t\tthis.initFirstJobs();\n\n\t\tthis.store.initSitemapDataDb(this.sitemap._id, function (resultWriter) {\n\t\t\tscraper.resultWriter = resultWriter;\n\t\t\tscraper._run();\n\t\t});\n\t},\n\n\trecordCanHaveChildJobs: function (record) {\n\t\tif (record._follow === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar selectorId = record._followSelectorId;\n\t\tvar childSelectors = this.sitemap.getDirectChildSelectors(selectorId);\n\t\tif (childSelectors.length === 0) {\n\t\t\treturn false;\n\t\t}\n\t\telse {\n\t\t\treturn true;\n\t\t}\n\t},\n\n\tgetFileFilename: function(url) {\n\n\t\tvar parts = url.split(\"/\");\n\t\tvar filename = parts[parts.length-1];\n\t\tfilename = filename.replace(/\\?/g, \"\");\n\t\tif(filename.length > 130) {\n\t\t\tfilename = filename.substr(0, 130);\n\t\t}\n\t\treturn filename;\n\t},\n\n\t/**\n\t * Save images for user if the records contains them\n\t * @param record\n\t */\n\tsaveImages: function(record) {\n\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar deferredImageStoreCalls = [];\n\t\tvar prefixLength = \"_imageBase64-\".length;\n\n\t\tfor(var attr in record) {\n\t\t\tif(attr.substr(0, prefixLength) === \"_imageBase64-\") {\n\t\t\t\tvar selectorId = attr.substring(prefixLength, attr.length);\n\t\t\t\tdeferredImageStoreCalls.push(function(selectorId) {\n\n\t\t\t\t\tvar imageBase64 = record['_imageBase64-'+selectorId];\n\t\t\t\t\tvar deferredDownloadDone = $.Deferred();\n\n\t\t\t\t\tvar deferredBlob = Base64.base64ToBlob(imageBase64, record['_imageMimeType-'+selectorId]);\n\n\t\t\t\t\tdelete record['_imageMimeType-'+selectorId];\n\t\t\t\t\tdelete record['_imageBase64-'+selectorId];\n\n\t\t\t\t\tdeferredBlob.done(function(blob) {\n\n\t\t\t\t\t\tvar downloadUrl =  window.URL.createObjectURL(blob);\n\t\t\t\t\t\tvar fileSavePath = this.sitemap._id+'/'+selectorId+'/'+this.getFileFilename(record[selectorId+'-src']);\n\n\t\t\t\t\t\t// download image using chrome api\n\t\t\t\t\t\tvar downloadRequest = {\n\t\t\t\t\t\t\turl: downloadUrl,\n\t\t\t\t\t\t\tfilename: fileSavePath\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// wait for the download to finish\n\t\t\t\t\t\tchrome.downloads.download(downloadRequest, function(downloadId) {\n\t\t\t\t\t\t\tvar cbDownloaded = function(downloadItem) {\n\t\t\t\t\t\t\t\tif(downloadItem.id === downloadId && downloadItem.state) {\n\t\t\t\t\t\t\t\t\tif(downloadItem.state.current === \"complete\") {\n\t\t\t\t\t\t\t\t\t\tdeferredDownloadDone.resolve();\n\t\t\t\t\t\t\t\t\t\tchrome.downloads.onChanged.removeListener(cbDownloaded);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse if(downloadItem.state.current === \"interrupted\") {\n\t\t\t\t\t\t\t\t\t\tdeferredDownloadDone.reject(\"download failed\");\n\t\t\t\t\t\t\t\t\t\tchrome.downloads.onChanged.removeListener(cbDownloaded);\n\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};\n\n\t\t\t\t\t\t\tchrome.downloads.onChanged.addListener(cbDownloaded);\n\t\t\t\t\t\t});\n\t\t\t\t\t}.bind(this));\n\n\t\t\t\t\treturn deferredDownloadDone.promise();\n\n\t\t\t\t}.bind(this, selectorId));\n\t\t\t}\n\t\t}\n\n\t\t$.whenCallSequentially(deferredImageStoreCalls).done(function() {\n\t\t\tdeferredResponse.resolve();\n\t\t});\n\n\t\treturn deferredResponse.promise();\n\t},\n\n\t// @TODO remove recursion and add an iterative way to run these jobs.\n\t_run: function () {\n\n\t\tvar job = this.queue.getNextJob();\n\t\tif (job === false) {\n\t\t\tconsole.log(\"Scraper execution is finished\");\n\t\t\tthis.executionCallback();\n\t\t\treturn;\n\t\t}\n\n\t\tif(this.stats) {\n\t\t\tstats.incrementDailyStat(\"pagesScraped\");\n\t\t}\n\n\t\tjob.execute(this.browser, function (job) {\n\n\t\t\tvar scrapedRecords = [];\n\t\t\tvar deferredDatamanipulations = [];\n\n\t\t\tvar records = job.getResults();\n\t\t\trecords.forEach(function (record) {\n\t\t\t\t//var record = JSON.parse(JSON.stringify(rec));\n\n\t\t\t\tdeferredDatamanipulations.push(this.saveImages.bind(this, record));\n\n\t\t\t\t// @TODO refactor job exstraction to a seperate method\n\t\t\t\tif (this.recordCanHaveChildJobs(record)) {\n\t\t\t\t\tvar followSelectorId = record._followSelectorId;\n\t\t\t\t\tvar followURL = record['_follow'];\n\t\t\t\t\tvar followSelectorId = record['_followSelectorId'];\n\t\t\t\t\tdelete record['_follow'];\n\t\t\t\t\tdelete record['_followSelectorId'];\n\t\t\t\t\tvar newJob = new Job(followURL, followSelectorId, this, job, record);\n\t\t\t\t\tif (this.queue.canBeAdded(newJob)) {\n\t\t\t\t\t\tthis.queue.add(newJob);\n\t\t\t\t\t}\n\t\t\t\t\t// store already scraped links\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.log(\"Ignoring next\")\n\t\t\t\t\t\tconsole.log(record);\n//\t\t\t\t\t\tscrapedRecords.push(record);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (record._follow !== undefined) {\n\t\t\t\t\t\tdelete record['_follow'];\n\t\t\t\t\t\tdelete record['_followSelectorId'];\n\t\t\t\t\t}\n\t\t\t\t\tscrapedRecords.push(record);\n\t\t\t\t}\n\n\t\t\t}.bind(this));\n\n\t\t\t$.whenCallSequentially(deferredDatamanipulations).done(function() {\n\t\t\t\tthis.resultWriter.writeDocs(scrapedRecords, function () {\n\n\t\t\t\t\tvar now = (new Date()).getTime();\n\t\t\t\t\t// delay next job if needed\n\t\t\t\t\tthis._timeNextScrapeAvailable = now + this.requestInterval;\n\t\t\t\t\tif(now >= this._timeNextScrapeAvailable) {\n\t\t\t\t\t\tthis._run();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar delay = this._timeNextScrapeAvailable - now;\n\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\tthis._run();\n\t\t\t\t\t\t}.bind(this), delay);\n\t\t\t\t\t}\n\t\t\t\t}.bind(this));\n\t\t\t}.bind(this));\n\n\t\t}.bind(this));\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorDetail.js",
    "content": "var SelectorDetail = {\n\tcanReturnMultipleRecords: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn true;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar dfd = $.Deferred();\n\n\t\t// return empty record if not multiple type and no elements found\n\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\tvar data = {};\n\t\t\tdata[this.id] = null;\n\t\t\tdfd.resolve([data]);\n\t\t\treturn dfd;\n\t\t}\n\n\t\t// extract links one by one\n\t\tvar deferredDataExtractionCalls = [];\n\t\t$(elements).each(function (k, element) {\n\n\t\t\tdeferredDataExtractionCalls.push(function(element) {\n\n\t\t\t\tvar deferredData = $.Deferred();\n\n\t\t\t\tvar data = {};\n\t\t\t\tdata[this.id] = $(element).text();\n\t\t\t\tdata._followSelectorId = this.id;\n\t\t\t\tdata[this.id + '-href'] = element.href;\n\t\t\t\tdata._follow = element.href;\n\t\t\t\tdeferredData.resolve(data);\n\n\t\t\t\treturn deferredData;\n\t\t\t}.bind(this, element));\n\t\t}.bind(this));\n\n\t\t$.whenCallSequentially(deferredDataExtractionCalls).done(function(responses) {\n\t\t\tvar result = [];\n\t\t\tresponses.forEach(function(dataResult) {\n\t\t\t\tresult.push(dataResult);\n\t\t\t});\n\t\t\tdfd.resolve(result);\n\t\t});\n\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id, this.id + '-href'];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn [];\n\t},\n\n\tgetItemCSSSelector: function() {\n\t\treturn \"a\";\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorElement.js",
    "content": "var SelectorElement = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn true;\n\t},\n\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\tvar elements = this.getDataElements(parentElement);\n\t\tdfd.resolve(jQuery.makeArray(elements));\n\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple'];\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Selector/SelectorElementAttribute.js",
    "content": "var SelectorElementAttribute = {\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar result = [];\n\t\t$(elements).each(function (k, element) {\n\t\t\tvar data = {};\n\n\t\t\tdata[this.id] = $(element).attr(this.extractAttribute);\n\t\t\tresult.push(data);\n\t\t}.bind(this));\n\n\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\tvar data = {};\n\t\t\tdata[this.id + '-src'] = null;\n\t\t\tresult.push(data);\n\t\t}\n\t\tdfd.resolve(result);\n\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple', 'extractAttribute'];\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorElementClick.js",
    "content": "var SelectorElementClick = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn true;\n\t},\n\n\tgetClickElements: function(parentElement) {\n\t\tvar clickElements = ElementQuery(this.clickElementSelector, parentElement);\n\t\treturn clickElements;\n\t},\n\n\t/**\n\t * Check whether element is still reachable from html. Useful to check whether the element is removed from DOM.\n\t * @param element\n\t */\n\tisElementInHTML: function(element) {\n\t\treturn $(element).closest(\"html\").length !== 0;\n\t},\n\n\tgetElementCSSSelector: function(element) {\n\n\t\tvar nthChild, prev;\n\t\tfor(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);\n\t\tvar tagName = element.tagName.toLocaleLowerCase();\n\t\tvar cssSelector = tagName+\":nth-child(\"+nthChild+\")\";\n\n\t\twhile(element.parentElement) {\n\t\t\telement = element.parentElement;\n\t\t\tvar tagName = element.tagName.toLocaleLowerCase();\n\t\t\tif(tagName === 'body' || tagName === 'html') {\n\t\t\t\tcssSelector = tagName+\">\"+cssSelector;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);\n\t\t\t\tcssSelector = tagName+\":nth-child(\"+nthChild+\")>\"+cssSelector;\n\t\t\t}\n\t\t}\n\n\t\treturn cssSelector;\n\t},\n\n\ttriggerButtonClick: function(clickElement) {\n\n\t\tvar cssSelector = this.getElementCSSSelector(clickElement);\n\n\t\t// this function will trigger the click from browser land\n\t\tvar script   = document.createElement(\"script\");\n\t\tscript.type  = \"text/javascript\";\n\t\tscript.text  = \"\" +\n\t\t\t\"(function(){ \" +\n\t\t\t\"var el = document.querySelectorAll('\"+cssSelector+\"')[0]; \" +\n\t\t\t\"if(el.tagName==='OPTION'){\" +\n\t\t\t\"el.selected=true;\" +\n\t\t\t\"el.dispatchEvent(new Event('change', { bubbles: true }));\" +\n\t\t\t\"} else {\" +\n\t\t\t\"el.click();\" +\n\t\t\t\"}\" +\n\t\t\t\"})();\";\n\t\tdocument.body.appendChild(script);\n\t},\n\n\tgetClickElementUniquenessType: function() {\n\n\t\tif(this.clickElementUniquenessType  === undefined) {\n\t\t\treturn 'uniqueText';\n\t\t}\n\t\telse {\n\t\t\treturn this.clickElementUniquenessType;\n\t\t}\n\t},\n\n\t_getData: function(parentElement) {\n\n\t\tvar delay = parseInt(this.delay) || 0;\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar foundElements = new UniqueElementList('uniqueHTMLText');\n\t\tvar clickElements = this.getClickElements(parentElement);\n\t\tvar doneClickingElements = new UniqueElementList(this.getClickElementUniquenessType());\n\n\t\t// add elements that are available before clicking\n\t\tvar elements = this.getDataElements(parentElement);\n\t\telements.forEach(foundElements.push.bind(foundElements));\n\n\t\t// discard initial elements\n\t\tif(this.discardInitialElements) {\n\t\t\tfoundElements = new UniqueElementList('uniqueText');\n\t\t}\n\n\t\t// no elements to click at the beginning\n\t\tif(clickElements.length === 0) {\n\t\t\tdeferredResponse.resolve(foundElements);\n\t\t\treturn deferredResponse.promise();\n\t\t}\n\n\t\t// initial click and wait\n\t\tvar currentClickElement = clickElements[0];\n\t\tthis.triggerButtonClick(currentClickElement);\n\t\tvar nextElementSelection = (new Date()).getTime()+delay;\n\n\t\t// infinitely scroll down and find all items\n\t\tvar interval = setInterval(function() {\n\n\t\t\t// find those click elements that are not in the black list\n\t\t\tvar allClickElements = this.getClickElements(parentElement);\n\t\t\tclickElements = [];\n\t\t\tallClickElements.forEach(function(element) {\n\t\t\t\tif(!doneClickingElements.isAdded(element)) {\n\t\t\t\t\tclickElements.push(element);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar now = (new Date()).getTime();\n\t\t\t// sleep. wait when to extract next elements\n\t\t\tif(now < nextElementSelection) {\n\t\t\t\t//console.log(\"wait\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// add newly found elements to element foundElements array.\n\t\t\tvar elements = this.getDataElements(parentElement);\n\t\t\tvar addedAnElement = false;\n\t\t\telements.forEach(function(element) {\n\t\t\t\tvar added = foundElements.push(element);\n\t\t\t\tif(added) {\n\t\t\t\t\taddedAnElement = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t//console.log(\"added\", addedAnElement);\n\n\t\t\t// no new elements found. Stop clicking this button\n\t\t\tif(!addedAnElement) {\n\t\t\t\tdoneClickingElements.push(currentClickElement);\n\t\t\t}\n\n\t\t\t// continue clicking and add delay, but if there is nothing\n\t\t\t// more to click the finish\n\t\t\t//console.log(\"total buttons\", clickElements.length)\n\t\t\tif(clickElements.length === 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tdeferredResponse.resolve(foundElements);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t//console.log(\"click\");\n\t\t\t\tcurrentClickElement = clickElements[0];\n\t\t\t\t// click on elements only once if the type is clickonce\n\t\t\t\tif(this.clickType === 'clickOnce') {\n\t\t\t\t\tdoneClickingElements.push(currentClickElement);\n\t\t\t\t}\n\t\t\t\tthis.triggerButtonClick(currentClickElement);\n\t\t\t\tnextElementSelection = now+delay;\n\t\t\t}\n\t\t}.bind(this), 50);\n\n\t\treturn deferredResponse.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple', 'clickElementSelector', 'clickType', 'discardInitialElements', 'clickElementUniquenessType'];\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Selector/SelectorElementScroll.js",
    "content": "var SelectorElementScroll = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn true;\n\t},\n\tscrollToBottom: function() {\n\t\twindow.scrollTo(0,document.body.scrollHeight);\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar delay = parseInt(this.delay) || 0;\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar foundElements = [];\n\n\t\t// initially scroll down and wait\n\t\tthis.scrollToBottom();\n\t\tvar nextElementSelection = (new Date()).getTime()+delay;\n\n\t\t// infinitely scroll down and find all items\n\t\tvar interval = setInterval(function() {\n\n\t\t\tvar now = (new Date()).getTime();\n\t\t\t// sleep. wait when to extract next elements\n\t\t\tif(now < nextElementSelection) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar elements = this.getDataElements(parentElement);\n\t\t\t// no new elements found\n\t\t\tif(elements.length === foundElements.length) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tdeferredResponse.resolve(jQuery.makeArray(elements));\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// continue scrolling and add delay\n\t\t\t\tfoundElements = elements;\n\t\t\t\tthis.scrollToBottom();\n\t\t\t\tnextElementSelection = now+delay;\n\t\t\t}\n\n\t\t}.bind(this), 50);\n\n\t\treturn deferredResponse.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple'];\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Selector/SelectorGroup.js",
    "content": "var SelectorGroup = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\t// cannot reuse this.getDataElements because it depends on *multiple* property\n\t\tvar elements = $(this.selector, parentElement);\n\n\t\tvar records = [];\n\t\t$(elements).each(function (k, element) {\n\t\t\tvar data = {};\n\n\t\t\tdata[this.id] = $(element).text();\n\n\t\t\tif(this.extractAttribute) {\n\t\t\t\tdata[this.id+'-'+this.extractAttribute] = $(element).attr(this.extractAttribute);\n\t\t\t}\n\n\t\t\trecords.push(data);\n\t\t}.bind(this));\n\n\t\tvar result = {};\n\t\tresult[this.id] = records;\n\n\t\tdfd.resolve([result]);\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['extractAttribute'];\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorHTML.js",
    "content": "var SelectorHTML = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar result = [];\n\t\t$(elements).each(function (k, element) {\n\t\t\tvar data = {};\n\t\t\tvar html = $(element).html();\n\n\t\t\tif (this.regex !== undefined && this.regex.length) {\n\t\t\t\tvar matches = html.match(new RegExp(this.regex));\n\t\t\t\tif (matches !== null) {\n\t\t\t\t\thtml = matches[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\thtml = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata[this.id] = html;\n\n\t\t\tresult.push(data);\n\t\t}.bind(this));\n\n\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\tvar data = {};\n\t\t\tdata[this.id] = null;\n\t\t\tresult.push(data);\n\t\t}\n\n\t\tdfd.resolve(result);\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple', 'regex'];\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Selector/SelectorImage.js",
    "content": "var SelectorImage = {\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar deferredDataCalls = [];\n\t\t$(elements).each(function(i, element) {\n\t\t\tdeferredDataCalls.push(function() {\n\n\t\t\t\tvar deferredData = $.Deferred();\n\n\t\t\t\tvar data = {};\n\t\t\t\tdata[this.id + '-src'] = element.src;\n\n\t\t\t\t// download image if required\n\t\t\t\tif(!this.downloadImage) {\n\t\t\t\t\tdeferredData.resolve(data);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar deferredImageBase64 = this.downloadImageBase64(element.src);\n\n\t\t\t\t\tdeferredImageBase64.done(function(imageResponse) {\n\n\t\t\t\t\t\tdata['_imageBase64-'+this.id] = imageResponse.imageBase64;\n\t\t\t\t\t\tdata['_imageMimeType-'+this.id] = imageResponse.mimeType;\n\n\t\t\t\t\t\tdeferredData.resolve(data);\n\t\t\t\t\t}.bind(this)).fail(function() {\n\t\t\t\t\t\t// failed to download image continue.\n\t\t\t\t\t\t// @TODO handle errror\n\t\t\t\t\t\tdeferredData.resolve(data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn deferredData.promise();\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\n\t\t$.whenCallSequentially(deferredDataCalls).done(function(dataResults) {\n\n\t\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\t\tvar data = {};\n\t\t\t\tdata[this.id+'-src'] = null;\n\t\t\t\tdataResults.push(data);\n\t\t\t}\n\n\t\t\tdfd.resolve(dataResults);\n\t\t});\n\n\t\treturn dfd.promise();\n\t},\n\n\tdownloadFileAsBlob: function(url) {\n\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.onreadystatechange = function() {\n\t\t\tif (this.readyState == 4) {\n\t\t\t\tif(this.status == 200) {\n\t\t\t\t\tvar blob = this.response;\n\t\t\t\t\tdeferredResponse.resolve(blob);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdeferredResponse.reject(xhr.statusText);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.open('GET', url);\n\t\txhr.responseType = 'blob';\n\t\txhr.send();\n\n\t\treturn deferredResponse.promise();\n\t},\n\n\tdownloadImageBase64: function(url) {\n\n\t\tvar deferredResponse = $.Deferred();\n\t\tvar deferredDownload = this.downloadFileAsBlob(url);\n\t\tdeferredDownload.done(function(blob) {\n\t\t\tvar mimeType = blob.type;\n\t\t\tvar deferredBlob = Base64.blobToBase64(blob);\n\t\t\tdeferredBlob.done(function(imageBase64) {\n\t\t\t\tdeferredResponse.resolve({\n\t\t\t\t\tmimeType: mimeType,\n\t\t\t\t\timageBase64: imageBase64\n\t\t\t\t});\n\t\t\t}.bind(this));\n\t\t}.bind(this)).fail(deferredResponse.fail);\n\t\treturn deferredResponse.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id + '-src'];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple', 'downloadImage'];\n\t},\n\n\tgetItemCSSSelector: function() {\n\t\treturn \"img\";\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorLink.js",
    "content": "var SelectorLink = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn true;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar dfd = $.Deferred();\n\n\t\t// return empty record if not multiple type and no elements found\n\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\tvar data = {};\n\t\t\tdata[this.id] = null;\n\t\t\tdfd.resolve([data]);\n\t\t\treturn dfd;\n\t\t}\n\n\t\t// extract links one by one\n\t\tvar deferredDataExtractionCalls = [];\n\t\t$(elements).each(function (k, element) {\n\n\t\t\tdeferredDataExtractionCalls.push(function(element) {\n\n\t\t\t\tvar deferredData = $.Deferred();\n\n\t\t\t\tvar data = {};\n\t\t\t\tdata[this.id] = $(element).text();\n\t\t\t\tdata._followSelectorId = this.id;\n\t\t\t\tdata[this.id + '-href'] = element.href;\n\t\t\t\tdata._follow = element.href;\n\t\t\t\tdeferredData.resolve(data);\n\n\t\t\t\treturn deferredData;\n\t\t\t}.bind(this, element));\n\t\t}.bind(this));\n\t\t$.whenCallSequentially(deferredDataExtractionCalls).done(function(responses) {\n\t\t\tvar result = [];\n\t\t\tresponses.forEach(function(dataResult) {\n\t\t\t\tresult.push(dataResult);\n\t\t\t});\n\t\t\tdfd.resolve(result);\n\t\t});\n\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id, this.id + '-href'];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['next-page', 'pageUrl', 'startNum', 'endNum'];\n\t},\n\n\tgetItemCSSSelector: function() {\n\t\treturn \"a\";\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorPopupLink.js",
    "content": "var SelectorPopupLink = {\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn true;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar dfd = $.Deferred();\n\n\t\t// return empty record if not multiple type and no elements found\n\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\tvar data = {};\n\t\t\tdata[this.id] = null;\n\t\t\tdfd.resolve([data]);\n\t\t\treturn dfd;\n\t\t}\n\n\t\t// extract links one by one\n\t\tvar deferredDataExtractionCalls = [];\n\t\t$(elements).each(function (k, element) {\n\n\t\t\tdeferredDataExtractionCalls.push(function(element) {\n\n\t\t\t\tvar deferredData = $.Deferred();\n\n\t\t\t\tvar data = {};\n\t\t\t\tdata[this.id] = $(element).text();\n\t\t\t\tdata._followSelectorId = this.id;\n\n\t\t\t\tvar deferredPopupURL = this.getPopupURL(element);\n\t\t\t\tdeferredPopupURL.done(function(url) {\n\t\t\t\t\tdata[this.id + '-href'] = url;\n\t\t\t\t\tdata._follow = url;\n\t\t\t\t\tdeferredData.resolve(data);\n\t\t\t\t}.bind(this));\n\n\t\t\t\treturn deferredData;\n\t\t\t}.bind(this, element));\n\t\t}.bind(this));\n\n\t\t$.whenCallSequentially(deferredDataExtractionCalls).done(function(responses) {\n\t\t\tvar result = [];\n\t\t\tresponses.forEach(function(dataResult) {\n\t\t\t\tresult.push(dataResult);\n\t\t\t});\n\t\t\tdfd.resolve(result);\n\t\t});\n\n\t\treturn dfd.promise();\n\t},\n\n\tgetElementCSSSelector: function(element) {\n\n\t\tvar nthChild, prev;\n\t\tfor(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);\n\t\tvar tagName = element.tagName.toLocaleLowerCase();\n\t\tvar cssSelector = tagName+\":nth-child(\"+nthChild+\")\";\n\n\t\twhile(element.parentElement) {\n\t\t\telement = element.parentElement;\n\t\t\tvar tagName = element.tagName.toLocaleLowerCase();\n\t\t\tif(tagName === 'body' || tagName === 'html') {\n\t\t\t\tcssSelector = tagName+\">\"+cssSelector;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor(nthChild = 1, prev = element.previousElementSibling; prev !== null;prev = prev.previousElementSibling, nthChild++);\n\t\t\t\tcssSelector = tagName+\":nth-child(\"+nthChild+\")>\"+cssSelector;\n\t\t\t}\n\t\t}\n\n\t\treturn cssSelector;\n\t},\n\n\t/**\n\t * Gets an url from a window.open call by mocking the window.open function\n\t * @param element\n\t * @returns $.Deferred()\n\t */\n\tgetPopupURL: function(element) {\n\n\t\t// override window.open function. we need to execute this in page scope.\n\t\t// we need to know how to find this element from page scope.\n\t\tvar cssSelector = this.getElementCSSSelector(element);\n\n\t\t// this function will catch window.open call and place the requested url as the elements data attribute\n\t\tvar script   = document.createElement(\"script\");\n\t\tscript.type  = \"text/javascript\";\n\t\tscript.text  = \"\" +\n\t\t\t\"(function(){ \" +\n\t\t\t\"var open = window.open; \" +\n\t\t\t\"var el = document.querySelectorAll('\"+cssSelector+\"')[0]; \" +\n\t\t\t\"var openNew = function() { \" +\n\t\t\t\"var url = arguments[0]; \" +\n\t\t\t\"el.dataset.webScraperExtractUrl = url; \" +\n\t\t\t\"window.open = open; \" +\n\t\t\t\"};\" +\n\t\t\t\"window.open = openNew; \" +\n\t\t\t\"el.click(); \" +\n\t\t\t\"})();\";\n\t\tdocument.body.appendChild(script);\n\n\t\t// wait for url to be available\n\t\tvar deferredURL = $.Deferred();\n\t\tvar timeout = Math.abs(5000/30); // 5s timeout to generate an url for popup\n\t\tvar interval = setInterval(function() {\n\t\t\tvar url = $(element).data(\"web-scraper-extract-url\");\n\t\t\tif(url) {\n\t\t\t\tdeferredURL.resolve(url);\n\t\t\t\tclearInterval(interval);\n\t\t\t\tscript.remove();\n\t\t\t}\n\t\t\t// timeout popup opening\n\t\t\tif(timeout-- <= 0) {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tscript.remove();\n\t\t\t}\n\t\t}, 30);\n\n\t\treturn deferredURL.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id, this.id + '-href'];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple'];\n\t},\n\n\tgetItemCSSSelector: function() {\n\t\treturn \"*\";\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Selector/SelectorTable.js",
    "content": "var SelectorTable = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\tgetTableHeaderColumns: function ($table) {\n\t\tvar columns = {};\n\t\tvar headerRowSelector = this.getTableHeaderRowSelector();\n\t\tvar $headerRow = $table.find(headerRowSelector);\n\t\tif ($headerRow.length > 0) {\n\t\t\t$headerRow.find(\"td,th\").each(function (i) {\n\t\t\t\tvar header = $(this).text().trim();\n\t\t\t\tcolumns[header] = {\n\t\t\t\t\tindex: i + 1\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\treturn columns;\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\tvar tables = this.getDataElements(parentElement);\n\n\t\tvar result = [];\n\t\t$(tables).each(function (k, table) {\n\n\t\t\tvar columns = this.getTableHeaderColumns($(table));\n\n\t\t\tvar dataRowSelector = this.getTableDataRowSelector();\n\t\t\t$(table).find(dataRowSelector).each(function (i, row) {\n\t\t\t\tvar data = {};\n\t\t\t\tthis.columns.forEach(function (column) {\n\t\t\t\t\tif(column.extract === true) {\n\t\t\t\t\t\tif (columns[column.header] === undefined) {\n\t\t\t\t\t\t\tdata[column.name] = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvar rowText = $(row).find(\">:nth-child(\" + columns[column.header].index + \")\").text().trim();\n\t\t\t\t\t\t\tdata[column.name] = rowText;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresult.push(data);\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\n\t\tdfd.resolve(result);\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\n\t\tvar dataColumns = [];\n\t\tthis.columns.forEach(function (column) {\n\t\t\tif (column.extract === true) {\n\t\t\t\tdataColumns.push(column.name);\n\t\t\t}\n\t\t});\n\t\treturn dataColumns;\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple', 'columns', 'tableDataRowSelector', 'tableHeaderRowSelector'];\n\t},\n\n\tgetItemCSSSelector: function () {\n\t\treturn \"table\";\n\t},\n\n\tgetTableHeaderRowSelectorFromTableHTML: function(html) {\n\n\t\tvar $table = $(html);\n\t\tif($table.find(\"thead tr:has(td:not(:empty)), thead tr:has(th:not(:empty))\").length) {\n\n\t\t\tif($table.find(\"thead tr\").length === 1) {\n\t\t\t\treturn \"thead tr\";\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar $rows = $table.find(\"thead tr\");\n\t\t\t\t// first row with data\n\t\t\t\tvar rowIndex = $rows.index($rows.filter(\":has(td:not(:empty)),:has(th:not(:empty))\")[0]);\n\t\t\t\treturn \"thead tr:nth-of-type(\"+(rowIndex+1)+\")\";\n\t\t\t}\n\t\t}\n\t\telse if($table.find(\"tr td:not(:empty), tr th:not(:empty)\").length) {\n\t\t\tvar $rows = $table.find(\"tr\");\n\t\t\t// first row with data\n\t\t\tvar rowIndex = $rows.index($rows.filter(\":has(td:not(:empty)),:has(th:not(:empty))\")[0]);\n\t\t\treturn  \"tr:nth-of-type(\"+(rowIndex+1)+\")\";\n\t\t}\n\t\telse {\n\t\t\treturn \"\";\n\t\t}\n\t},\n\n\tgetTableDataRowSelectorFromTableHTML: function(html) {\n\n\t\tvar $table = $(html);\n\t\tif($table.find(\"thead tr:has(td:not(:empty)), thead tr:has(th:not(:empty))\").length) {\n\n\t\t\treturn \"tbody tr\";\n\t\t}\n\t\telse if($table.find(\"tr td:not(:empty), tr th:not(:empty)\").length) {\n\t\t\tvar $rows = $table.find(\"tr\");\n\t\t\t// first row with data\n\t\t\tvar rowIndex = $rows.index($rows.filter(\":has(td:not(:empty)),:has(th:not(:empty))\")[0]);\n\t\t\treturn \"tr:nth-of-type(n+\"+(rowIndex+2)+\")\";\n\t\t}\n\t\telse {\n\t\t\treturn \"\";\n\t\t}\n\t},\n\n\tgetTableHeaderRowSelector: function() {\n\n\t\t// handle legacy selectors\n\t\tif(this.tableHeaderRowSelector === undefined) {\n\t\t\treturn \"thead tr\";\n\t\t}\n\t\telse {\n\t\t\treturn this.tableHeaderRowSelector;\n\t\t}\n\t},\n\n\tgetTableDataRowSelector: function(){\n\n\t\t// handle legacy selectors\n\t\tif(this.tableDataRowSelector === undefined) {\n\t\t\treturn \"tbody tr\";\n\t\t}\n\t\telse {\n\t\t\treturn this.tableDataRowSelector;\n\t\t}\n\t},\n\n\t/**\n\t * Extract table header column info from html\n\t * @param html\n\t */\n\tgetTableHeaderColumnsFromHTML: function(headerRowSelector, html) {\n\n\t\tvar $table = $(html);\n\t\tvar $headerRowColumns = $table.find(headerRowSelector).find(\"td,th\");\n\n\t\tvar columns = [];\n\n\t\t$headerRowColumns.each(function(i, columnEl) {\n\t\t\tvar header = $(columnEl).text().trim();\n\t\t\tvar name =  header;\n\t\t\tif(header.length !== 0) {\n\t\t\t\tcolumns.push({\n\t\t\t\t\theader: header,\n\t\t\t\t\tname: name,\n\t\t\t\t\textract: true\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn columns;\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Selector/SelectorText.js",
    "content": "var SelectorText = {\n\n\tcanReturnMultipleRecords: function () {\n\t\treturn true;\n\t},\n\n\tcanHaveChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanHaveLocalChildSelectors: function () {\n\t\treturn false;\n\t},\n\n\tcanCreateNewJobs: function () {\n\t\treturn false;\n\t},\n\twillReturnElements: function () {\n\t\treturn false;\n\t},\n\t_getData: function (parentElement) {\n\n\t\tvar dfd = $.Deferred();\n\n\t\tvar elements = this.getDataElements(parentElement);\n\n\t\tvar result = [];\n\t\t$(elements).each(function (k, element) {\n\t\t\tvar data = {};\n\n\t\t\t// remove script, style tag contents from text results\n\t\t\tvar $element_clone = $(element).clone();\n\t\t\t$element_clone.find(\"script, style\").remove();\n\t\t\t// <br> replace br tags with newlines\n\t\t\t$element_clone.find(\"br\").after(\"\\n\");\n\n\t\t\tvar text = $element_clone.text();\n\t\t\tif (this.regex !== undefined && this.regex.length) {\n\t\t\t\tvar matches = text.match(new RegExp(this.regex));\n\t\t\t\tif (matches !== null) {\n\t\t\t\t\ttext = matches[0];\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttext = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata[this.id] = text;\n\n\t\t\tresult.push(data);\n\t\t}.bind(this));\n\n\t\tif (this.multiple === false && elements.length === 0) {\n\t\t\tvar data = {};\n\t\t\tdata[this.id] = null;\n\t\t\tresult.push(data);\n\t\t}\n\n\t\tdfd.resolve(result);\n\t\treturn dfd.promise();\n\t},\n\n\tgetDataColumns: function () {\n\t\treturn [this.id];\n\t},\n\n\tgetFeatures: function () {\n\t\treturn ['multiple', 'regex'];\n\t}\n};\n"
  },
  {
    "path": "server/static/scripts/Selector.js",
    "content": "var Selector = function (selector) {\n\tthis.updateData(selector);\n\tthis.initType();\n};\n\nSelector.prototype = {\n\n\t/**\n\t * Is this selector configured to return multiple items?\n\t * @returns {boolean}\n\t */\n\twillReturnMultipleRecords: function () {\n\t\treturn this.canReturnMultipleRecords() && this.multiple;\n\t},\n\n\t/**\n\t * 根据该选择器类型更新选择器属性\n\t * @param data\n\t */\n\tupdateData: function (data) {\n\t\t/*\n\t\t{parentSelectors: [parentSelectorId],\n        type: 'SelectorText',\n        // multiple: false\n    \t}\n    */\n\t\tvar allowedKeys = ['id', 'type', 'selector', 'parentSelectors'];\n\t\t// ['id', 'type', 'selector', 'parentSelectors', \"multiple\", \"regex\", \"delay\"]\n\t\tallowedKeys = allowedKeys.concat(window[data.type].getFeatures());\n\n\t\t// update data\n\t\tfor (var key in data) {\n\t\t\tif (allowedKeys.indexOf(key) !== -1 || typeof data[key] === 'function') {\n\t\t\t\tthis[key] = data[key];\n\t\t\t}\n\t\t}\n\n\t\t// remove values that are not needed for this type of selector\n\t\tfor (var key in this) {\n\t\t\tif (allowedKeys.indexOf(key) === -1 && typeof this[key] !== 'function') {\n\t\t\t\tdelete this[key];\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * CSS selector which will be used for element selection\n\t * @returns {string}\n\t */\n\tgetItemCSSSelector: function() {\n\t\treturn \"*\";\n\t},\n\n\t/**\n\t * override objects methods based on seletor type\n\t */\n\tinitType: function () {\n\n\t\tif (window[this.type] === undefined) {\n\t\t\tthrow \"Selector type not defined \" + this.type;\n\t\t}\n\n\t\t// overrides objects methods\n\t\tfor (var i in window[this.type]) {\n\t\t\tthis[i] = window[this.type][i];\n\t\t}\n\t},\n\n\t/**\n\t * 父容器中是否有该选择器\n\t * @param selectorId\n\t * @returns {boolean}\n\t */\n\thasParentSelector: function (selectorId) {\n\t\treturn (this.parentSelectors.indexOf(selectorId) !== -1);\n\t},\n\n\tremoveParentSelector: function (selectorId) {\n\t\tvar index = this.parentSelectors.indexOf(selectorId);\n\t\tif(index !== -1) {\n\t\t\tthis.parentSelectors.splice(index, 1);\n\t\t}\n\t},\n\t// 修改父容器\n\trenameParentSelector: function (originalId, replacementId) {\n\t\t// 父容器有该选择器 替换之\n\t\tif (this.hasParentSelector(originalId)) {\n\t\t\tvar pos = this.parentSelectors.indexOf(originalId);\n\t\t\t// 删除旧父容器 添加新的\n\t\t\tthis.parentSelectors.splice(pos, 1, replacementId);\n\t\t}\n\t},\n\n\tgetDataElements: function (parentElement) {\n\t\t// var elements = ElementQuery(this.selector, parentElement);\n\t\tvar elements = window.collect.ElementQuery(this.selector, parentElement);\n\t\tif (this.multiple) {\n\t\t\treturn elements;\n\t\t}\n\t\telse if (elements.length > 0) {\n\t\t\treturn [elements[0]];\n\t\t}\n\t\telse {\n\t\t\treturn [];\n\t\t}\n\t},\n\n\tgetData: function(parentElement) {\n\t\tvar d = $.Deferred();\n\t\tvar timeout = this.delay || 0;\n\t\t// this works much faster because $.whenCallSequentially isn't running next data extraction immediately\n\t\tif(timeout === 0) {\n\t\t\tvar deferredData = this._getData(parentElement);\n\t\t\tdeferredData.done(function(data){\n\t\t\t\td.resolve(data);\n\t\t\t});\n\t\t} else {\n\t\t\tsetTimeout(function() {\n\t\t\t\tvar deferredData = this._getData(parentElement);\n\t\t\t\tdeferredData.done(function(data){\n\t\t\t\t\td.resolve(data);\n\t\t\t\t});\n\t\t\t}.bind(this), timeout);\n\t\t}\n\t\treturn d.promise();\n\t}\n};"
  },
  {
    "path": "server/static/scripts/SelectorGraph.js",
    "content": "var SelectorGraph = function (sitemap) {\n\tthis.sitemap = sitemap;\n\tthis.nodes = [];\n\tthis.nodes.push({id: '_root', parentSelectors: []});\n\tsitemap.selectors.forEach(function (selector) {\n\t\tthis.nodes.push(JSON.parse(JSON.stringify(selector)));\n\t}.bind(this));\n};\n\nSelectorGraph.prototype = {\n\n\tgetNodes: function () {\n\t\treturn this.nodes;\n\t},\n\n\tgetLabelAnchors: function () {\n\t\tvar labelAnchors = [];\n\t\tthis.nodes.forEach(function (node) {\n\t\t\tlabelAnchors.push({node: node});\n\t\t\tlabelAnchors.push({node: node});\n\t\t});\n\t\treturn labelAnchors;\n\t},\n\n\tgetLabelAnchorLinks: function () {\n\t\tvar labelAnchorLinks = [];\n\t\tfor (var i = 0; i < this.nodes.length; i++) {\n\t\t\tlabelAnchorLinks.push({\n\t\t\t\tsource: i * 2,\n\t\t\t\ttarget: i * 2 + 1,\n\t\t\t\tweight: 1\n\t\t\t});\n\t\t}\n\t\treturn labelAnchorLinks;\n\t},\n\n\tgetNodeById: function (nodeId) {\n\t\tfor (var i in this.nodes) {\n\t\t\tvar node = this.nodes[i];\n\t\t\tif (node.id === nodeId) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t},\n\n\tgetLinks: function () {\n\t\tvar links = [];\n\t\tthis.nodes.forEach(function (selector) {\n\t\t\tselector.parentSelectors.forEach(function (parentSelectorId) {\n\t\t\t\tvar parentSelector = this.getNodeById(parentSelectorId);\n\t\t\t\tlinks.push({\n\t\t\t\t\tsource: selector,\n\t\t\t\t\ttarget: parentSelector,\n\t\t\t\t\tweight: 1\n\t\t\t\t});\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\t\treturn links;\n\t},\n\n\tdraw: function (element, w, h) {\n\n\t\tvar labelDistance = 0;\n\n\t\tvar vis = d3.select(element).append(\"svg:svg\").attr(\"width\", w).attr(\"height\", h);\n\n\t\tvar nodes = this.getNodes();\n\t\tvar labelAnchors = this.getLabelAnchors();\n\t\tvar labelAnchorLinks = this.getLabelAnchorLinks();\n\t\tvar links = this.getLinks();\n\n\t\tvar force = d3.layout.force().size([w, h]).nodes(nodes).links(links).gravity(1).linkDistance(50).charge(-3000).linkStrength(function (x) {\n\t\t\treturn x.weight * 10\n\t\t});\n\n\t\tforce.start();\n\n\t\tvar force2 = d3.layout.force().nodes(labelAnchors).links(labelAnchorLinks).gravity(0).linkDistance(0).linkStrength(8).charge(-100).size([w, h]);\n\t\tforce2.start();\n\n\t\tvar link = vis.selectAll(\"line.link\").data(links).enter().append(\"svg:line\").attr(\"class\", \"link\").style(\"stroke\", \"#CCC\");\n\n\t\tvar node = vis.selectAll(\"g.node\").data(force.nodes()).enter().append(\"svg:g\").attr(\"class\", \"node\");\n\t\tnode.append(\"svg:circle\").attr(\"r\", 5).style(\"fill\", \"#555\").style(\"stroke\", \"#FFF\").style(\"stroke-width\", 3);\n\t\tnode.call(force.drag);\n\n\n\t\tvar anchorLink = vis.selectAll(\"line.anchorLink\").data(labelAnchorLinks)//.enter().append(\"svg:line\").attr(\"class\", \"anchorLink\").style(\"stroke\", \"#999\");\n\n\t\tvar anchorNode = vis.selectAll(\"g.anchorNode\").data(force2.nodes()).enter().append(\"svg:g\").attr(\"class\", \"anchorNode\");\n\t\tanchorNode.append(\"svg:circle\").attr(\"r\", 0).style(\"fill\", \"#FFF\");\n\t\tanchorNode.append(\"svg:text\").text(function (d, i) {\n\t\t\treturn i % 2 == 0 ? \"\" : d.node.id\n\t\t}).style(\"fill\", \"#555\").style(\"font-family\", \"Arial\").style(\"font-size\", 12);\n\n\t\tvar updateLink = function () {\n\t\t\tthis.attr(\"x1\",function (d) {\n\t\t\t\treturn d.source.x;\n\t\t\t}).attr(\"y1\",function (d) {\n\t\t\t\t\treturn d.source.y;\n\t\t\t\t}).attr(\"x2\",function (d) {\n\t\t\t\t\treturn d.target.x;\n\t\t\t\t}).attr(\"y2\", function (d) {\n\t\t\t\t\treturn d.target.y;\n\t\t\t\t});\n\n\t\t}\n\n\t\tvar updateNode = function () {\n\t\t\tthis.attr(\"transform\", function (d) {\n\t\t\t\treturn \"translate(\" + d.x + \",\" + d.y + \")\";\n\t\t\t});\n\n\t\t}\n\n\t\tforce.on(\"tick\", function () {\n\n\t\t\tforce2.start();\n\n\t\t\tnode.call(updateNode);\n\n\t\t\tanchorNode.each(function (d, i) {\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\td.x = d.node.x;\n\t\t\t\t\td.y = d.node.y;\n\t\t\t\t} else {\n\t\t\t\t\tvar b = this.childNodes[1].getBBox();\n\n\t\t\t\t\tvar diffX = d.x - d.node.x;\n\t\t\t\t\tvar diffY = d.y - d.node.y;\n\n\t\t\t\t\tvar dist = Math.sqrt(diffX * diffX + diffY * diffY);\n\n\t\t\t\t\tvar shiftX = b.width * (diffX - dist) / (dist * 2);\n\t\t\t\t\tshiftX = Math.max(-b.width, Math.min(0, shiftX));\n\t\t\t\t\tvar shiftY = 5;\n\t\t\t\t\tthis.childNodes[1].setAttribute(\"transform\", \"translate(\" + shiftX + \",\" + shiftY + \")\");\n\t\t\t\t}\n\t\t\t});\n\n\n\t\t\tanchorNode.call(updateNode);\n\n\t\t\tlink.call(updateLink);\n\t\t\tanchorLink.call(updateLink);\n\n\t\t});\n\t}\n};"
  },
  {
    "path": "server/static/scripts/SelectorGraphv2.js",
    "content": "var SelectorGraphv2 = function (sitemap) {\n\tthis.sitemap = sitemap;\n};\n\nSelectorGraphv2.prototype = {\n\n\t/**\n\t * Inits d3.layout.tree\n\t */\n\tinitTree: function (w, h) {\n\n\t\tthis.tree = d3.layout.tree().size([h, w]);\n\t\tthis.tree.children(this.getSelectorVisibleChildren.bind(this));\n\t},\n\tgetSelectorChildren: function (parentSelector) {\n\n\t\tif (parentSelector.childSelectors === undefined) {\n\t\t\tparentSelector.childSelectors = this.sitemap.selectors.getDirectChildSelectors(parentSelector.id).fullClone();\n\t\t}\n\n\t\tif (parentSelector.childSelectors.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\telse {\n\t\t\treturn parentSelector.childSelectors;\n\t\t}\n\t},\n\n\tgetSelectorVisibleChildren: function (parentSelector) {\n\n\t\t// initially hide selector children\n\t\tif (parentSelector.visibleChildren === undefined) {\n\t\t\tparentSelector.visibleChildren = false;\n\t\t}\n\n\t\tif (parentSelector.visibleChildren === false) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.getSelectorChildren(parentSelector);\n\n\t},\n\n\tselectorHasChildren: function (parentSelector) {\n\n\t\tvar children = this.sitemap.selectors.getDirectChildSelectors(parentSelector.id);\n\t\tvar selectorHasChildren = children.length > 0;\n\t\treturn selectorHasChildren;\n\t},\n\n\t/**\n\t * function for line drawing between two nodes\n\t */\n\tdiagonal: d3.svg.diagonal()\n\t\t.projection(function (d) {\n\t\t\treturn [d.y, d.x];\n\t\t}),\n\n\tdraw: function (element, w, h) {\n\t\tvar m = [20, 120, 20, 120],\n\t\t\tw = w - m[1] - m[3],\n\t\t\th = h - m[0] - m[2],\n\t\t\ti = 0,\n\t\t\troot,\n\t\t\tselectorList;\n\n\t\tthis.initTree(w, h);\n\n\t\t// @TODO use element\n\t\tthis.svg = d3.select(element).append(\"svg:svg\")\n\t\t\t.attr(\"width\", w + m[1] + m[3])\n\t\t\t.attr(\"height\", h + m[0] + m[2])\n\t\t\t.append(\"svg:g\")\n\t\t\t.attr(\"transform\", \"translate(\" + m[3] + \",\" + m[0] + \")\");\n\n\t\tthis.root = {\n\t\t\tid: '_root',\n\t\t\tx0: h / 2,\n\t\t\ty0: 0,\n\t\t\ti: '_root'\n\t\t};\n\n\t\tthis.update(this.root);\n\t},\n\n\t/**\n\t * Color for selectors circle\n\t * @param selector\n\t */\n\tgetNodeColor: function (selector) {\n\n\t\tif (this.selectorHasChildren(selector) && !selector.visibleChildren) {\n\t\t\treturn \"lightsteelblue\";\n\t\t}\n\t\telse {\n\t\t\treturn \"#fff\";\n\t\t}\n\t},\n\n\tupdate: function (source) {\n\t\tvar duration = 500;\n\n\t\t// Compute the new tree layout.\n\t\tvar nodes = this.tree.nodes(this.root).reverse();\n\n\t\t// Normalize for fixed-depth.\n\t\tnodes.forEach(function (d) {\n\t\t\td.y = d.depth * 100;\n\t\t});\n\t\tvar i = 0;\n\t\t// Update the nodes…\n\t\tvar node = this.svg.selectAll(\"g.node\")\n\t\t\t.data(nodes, function (d) {\n\t\t\t\tif (d.i === undefined) {\n\t\t\t\t\td.i = d.id;\n\t\t\t\t\td.i = source.i + \"/\" + d.i;\n\t\t\t\t}\n\t\t\t\treturn d.i;\n\t\t\t});\n\n\t\t// Enter any new nodes at the parent's previous position.\n\t\tvar nodeEnter = node.enter().append(\"svg:g\")\n\t\t\t.attr(\"class\", \"node\")\n\t\t\t.attr(\"transform\", function (d) {\n\t\t\t\treturn \"translate(\" + source.y0 + \",\" + source.x0 + \")\";\n\t\t\t})\n\t\t\t.on(\"click\", function (d) {\n\t\t\t\tthis.toggle(d);\n\t\t\t\tthis.update(d);\n\t\t\t}.bind(this));\n\n\t\tnodeEnter.append(\"svg:circle\")\n\t\t\t.attr(\"r\", 1e-6)\n\t\t\t.style(\"fill\", this.getNodeColor.bind(this));\n\n\t\tnodeEnter.append(\"svg:text\")\n\t\t\t.attr(\"x\", function (d) {\n\t\t\t\treturn this.selectorHasChildren(d) ? -10 : 10;\n\t\t\t}.bind(this))\n\t\t\t.attr(\"dy\", \".35em\")\n\t\t\t.attr(\"text-anchor\", function (d) {\n\t\t\t\treturn this.selectorHasChildren(d) ? \"end\" : \"start\";\n\t\t\t}.bind(this))\n\t\t\t.text(function (d) {\n\t\t\t\treturn d.id;\n\t\t\t})\n\t\t\t.style(\"fill-opacity\", 1e-6);\n\n\t\t// Transition nodes to their new position.\n\t\tvar nodeUpdate = node.transition()\n\t\t\t.duration(duration)\n\t\t\t.attr(\"transform\", function (d) {\n\t\t\t\treturn \"translate(\" + d.y + \",\" + d.x + \")\";\n\t\t\t});\n\n\t\tnodeUpdate.select(\"circle\")\n\t\t\t.attr(\"r\", 6)\n\t\t\t.style(\"fill\", this.getNodeColor.bind(this));\n\n\t\tnodeUpdate.select(\"text\")\n\t\t\t.style(\"fill-opacity\", 1);\n\n\t\t// Transition exiting nodes to the parent's new position.\n\t\tvar nodeExit = node.exit().transition()\n\t\t\t.duration(duration)\n\t\t\t.attr(\"transform\", function (d) {\n\t\t\t\treturn \"translate(\" + source.y + \",\" + source.x + \")\";\n\t\t\t})\n\t\t\t.remove();\n\n\t\tnodeExit.select(\"circle\")\n\t\t\t.attr(\"r\", 1e-6);\n\n\t\tnodeExit.select(\"text\")\n\t\t\t.style(\"fill-opacity\", 1e-6);\n\n\t\t// Update the links…\n\t\tvar link = this.svg.selectAll(\"path.link\")\n\t\t\t.data(this.tree.links(nodes), function (d) {\n\t\t\t\treturn d.target.i;\n\t\t\t});\n\n\t\t// Enter any new links at the parent's previous position.\n\t\tlink.enter().insert(\"svg:path\", \"g\")\n\t\t\t.attr(\"class\", \"link\")\n\t\t\t.attr(\"d\", function (d) {\n\t\t\t\tvar o = {x: source.x0, y: source.y0};\n\t\t\t\tvar res = this.diagonal({source: o, target: o});\n\t\t\t\treturn res;\n\t\t\t}.bind(this))\n\t\t\t.transition()\n\t\t\t.duration(duration)\n\t\t\t.attr(\"d\", this.diagonal);\n\n\t\t// Transition links to their new position.\n\t\tlink.transition()\n\t\t\t.duration(duration)\n\t\t\t.attr(\"d\", this.diagonal);\n\n\t\t// Transition exiting nodes to the parent's new position.\n\t\tlink.exit().transition()\n\t\t\t.duration(duration)\n\t\t\t.attr(\"d\", function (d) {\n\t\t\t\tvar o = {x: source.x, y: source.y};\n\t\t\t\treturn this.diagonal({source: o, target: o});\n\t\t\t}.bind(this))\n\t\t\t.remove();\n\n\t\t// Stash the old positions for transition.\n\t\tnodes.forEach(function (d) {\n\t\t\td.x0 = d.x;\n\t\t\td.y0 = d.y;\n\t\t});\n\t},\n\n\ttoggle: function (d) {\n\t\td.visibleChildren = !d.visibleChildren;\n\t}\n};"
  },
  {
    "path": "server/static/scripts/SelectorList.js",
    "content": "var SelectorList = function (selectors) {\n\t// 空选择器list\n\tif(selectors === undefined) {\n\t\treturn;\n\t}\n\n\tfor(var i = 0;i<selectors.length;i++) {\n\t\tthis.push(selectors[i]);\n\t}\n};\n\nSelectorList.prototype = new Array;\n\nSelectorList.prototype.push = function(selector) {\n\n\tif(!this.hasSelector(selector.id)) {\n\t\tif(!(selector instanceof Selector)) {\n\t\t\tselector = new Selector(selector);\n\t\t}\n\t\tArray.prototype.push.call(this, selector);\n\t}\n};\n\nSelectorList.prototype.hasSelector = function(selectorId) {\n\n\tif(selectorId instanceof Object) {\n\t\tselectorId = selectorId.id;\n\t}\n\n\tfor (var i = 0; i < this.length; i++) {\n\t\tif(this[i].id === selectorId) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/**\n * 选择器id不存在时，返回所有选择器；存在时，递归查找所有子选择器.\n * @param parentSelectorId\n * @returns {Array}\n */\nSelectorList.prototype.getAllSelectors = function(parentSelectorId) {\n\tif(parentSelectorId === undefined) {\n\t\treturn this;\n\t}\n\t// 递归查找所有子选择器\n\tvar getAllChildSelectors = function(parentSelectorId, resultSelectors) {\n\t\tthis.forEach(function(selector) {\n\t\t\tif(selector.hasParentSelector(parentSelectorId)) {\n\t\t\t\tif(resultSelectors.indexOf(selector) === -1) {\n\t\t\t\t\tresultSelectors.push(selector);\n\t\t\t\t\tgetAllChildSelectors(selector.id, resultSelectors);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this));\n\t}.bind(this);\n\n\tvar resultSelectors = [];\n\tgetAllChildSelectors(parentSelectorId, resultSelectors);\n\treturn resultSelectors;\n};\n\n/**\n * Returns only selectors that are directly under a parent\n * @param parentSelectorId\n * @returns {Array}\n */\nSelectorList.prototype.getDirectChildSelectors = function(parentSelectorId) {\n\tvar resultSelectors = new SelectorList();\n\tthis.forEach(function(selector) {\n\t\tif(selector.hasParentSelector(parentSelectorId)) {\n\t\t\tresultSelectors.push(selector);\n\t\t}\n\t});\n\treturn resultSelectors;\n};\n\nSelectorList.prototype.clone = function() {\n\tvar resultList = new SelectorList();\n\tthis.forEach(function(selector){\n\t\tresultList.push(selector);\n\t});\n\treturn resultList;\n};\n\nSelectorList.prototype.fullClone = function() {\n\tvar resultList = new SelectorList();\n\tthis.forEach(function(selector){\n\t\tresultList.push(JSON.parse(JSON.stringify(selector)));\n\t});\n\treturn resultList;\n};\n// 合并数组\nSelectorList.prototype.concat = function() {\n\tvar resultList = this.clone();\n\tfor(var i in arguments) {\n\t\targuments[i].forEach(function(selector) {\n\t\t\tresultList.push(selector);\n\t\t}.bind(this));\n\t}\n\treturn resultList;\n};\n// 返回该选择器的Selector对象\nSelectorList.prototype.getSelector = function(selectorId) {\n\tfor (var i = 0; i < this.length; i++) {\n\t\tvar selector = this[i];\n\t\tif (selector.id === selectorId) {\n\t\t\treturn selector;\n\t\t}\n\t}\n};\n\n/**\n * Returns all selectors if this selectors including all parent selectors within this page\n * @TODO not used any more.\n * @param selectorId\n * @returns {*}\n */\nSelectorList.prototype.getOnePageSelectors = function (selectorId) {\n\tvar resultList = new SelectorList();\n\tvar selector = this.getSelector(selectorId);\n\tresultList.push(this.getSelector(selectorId));\n\n\t// recursively find all parent selectors that could lead to the page where selectorId is used.\n\tvar findParentSelectors = function(selector) {\n\n\t\tselector.parentSelectors.forEach(function(parentSelectorId) {\n\n\t\t\tif(parentSelectorId === \"_root\") return;\n\t\t\tvar parentSelector = this.getSelector(parentSelectorId);\n\t\t\tif(resultList.indexOf(parentSelector) !== -1) return;\n\t\t\tif(parentSelector.willReturnElements()) {\n\t\t\t\tresultList.push(parentSelector);\n\t\t\t\tfindParentSelectors(parentSelector);\n\t\t\t}\n\t\t}.bind(this));\n\t}.bind(this);\n\n\tfindParentSelectors(selector);\n\n\t// add all child selectors\n\tresultList = resultList.concat(this.getSinglePageAllChildSelectors(selector.id));\n\treturn resultList;\n};\n\n/**\n * Returns all child selectors of a selector which can be used within one page.\n * @param parentSelectorId\n */\nSelectorList.prototype.getSinglePageAllChildSelectors = function(parentSelectorId) {\n\n\tvar resultList = new SelectorList();\n\tvar addChildSelectors = function(parentSelector) {\n\t\tif(parentSelector.willReturnElements()) {\n\t\t\tvar childSelectors = this.getDirectChildSelectors(parentSelector.id);\n\t\t\tchildSelectors.forEach(function (childSelector) {\n\t\t\t\tif(resultList.indexOf(childSelector) === -1) {\n\t\t\t\t\tresultList.push(childSelector);\n\t\t\t\t\taddChildSelectors(childSelector);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t}\n\t}.bind(this);\n\n\tvar parentSelector = this.getSelector(parentSelectorId);\n\taddChildSelectors(parentSelector);\n\treturn resultList;\n};\n\nSelectorList.prototype.willReturnMultipleRecords = function(selectorId) {\n\n\t// handle reuqested selector\n\tvar selector = this.getSelector(selectorId);\n\tif(selector.willReturnMultipleRecords() === true) {\n\t\treturn true;\n\t}\n\n\t// handle all its child selectors\n\tvar childSelectors = this.getAllSelectors(selectorId);\n\tfor (var i = 0; i < childSelectors.length; i++) {\n\t\tvar selector = childSelectors[i];\n\t\tif (selector.willReturnMultipleRecords() === true) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\n/**\n * When serializing to JSON convert to an array\n * @returns {Array}\n */\nSelectorList.prototype.toJSON = function() {\n\tvar result = [];\n\tthis.forEach(function(selector) {\n\t\tresult.push(selector);\n\t});\n\treturn result;\n};\n\nSelectorList.prototype.getSelectorById = function (selectorId) {\n\tfor (var i = 0; i < this.length; i++) {\n\t\tvar selector = this[i];\n\t\tif (selector.id === selectorId) {\n\t\t\treturn selector;\n\t\t}\n\t}\n};\n\n/**\n * returns css selector for a given element. css selector includes all parent element selectors\n * @param selectorId\n * @param parentSelectorIds array of parent selector ids from devtools Breadcumb\n * @returns string\n */\nSelectorList.prototype.getCSSSelectorWithinOnePage = function (selectorId, parentSelectorIds) {\n\n\tvar CSSSelector = this.getSelector(selectorId).selector;\n\tvar parentCSSSelector = this.getParentCSSSelectorWithinOnePage(parentSelectorIds);\n\tCSSSelector = parentCSSSelector+CSSSelector;\n\n\treturn CSSSelector;\n};\n\n/**\n * returns css selector for parent selectors that are within one page\n * @param parentSelectorIds array of parent selector ids from devtools Breadcumb\n * @returns string\n */\nSelectorList.prototype.getParentCSSSelectorWithinOnePage = function (parentSelectorIds) {\n\tvar CSSSelector = \"\";\n\tfor (var i = parentSelectorIds.length-1; i > 0; i--) {\n\t\tvar parentSelectorId = parentSelectorIds[i];\n\t\tvar parentSelector = this.getSelector(parentSelectorId);\n\t\tif(parentSelector.willReturnElements()) {\n\t\t\tCSSSelector = parentSelector.selector + \" \" + CSSSelector;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn CSSSelector;\n};\n\nSelectorList.prototype.hasRecursiveElementSelectors = function() {\n\n\tvar RecursionFound = false;\n\n\tthis.forEach(function(topSelector) {\n\t\tvar visitedSelectors = [];\n\n\t\tvar checkRecursion = function(parentSelector) {\n\n\t\t\t// already visited\n\t\t\tif(visitedSelectors.indexOf(parentSelector) !== -1) {\n\t\t\t\tRecursionFound = true;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(parentSelector.willReturnElements()) {\n\t\t\t\tvisitedSelectors.push(parentSelector);\n\t\t\t\tvar childSelectors = this.getDirectChildSelectors(parentSelector.id);\n\t\t\t\tchildSelectors.forEach(checkRecursion);\n\t\t\t\tvisitedSelectors.pop();\n\t\t\t}\n\t\t}.bind(this);\n\n\t\tcheckRecursion(topSelector);\n\n\t}.bind(this));\n\n\treturn RecursionFound;\n};"
  },
  {
    "path": "server/static/scripts/Sitemap.js",
    "content": "var Sitemap = function (sitemapObj) {\n\tthis.initData(sitemapObj);\n};\n\nSitemap.prototype = {\n\n\tinitData: function (sitemapObj) {\n\t\tfor (var key in sitemapObj) {\n\t\t\tthis[key] = sitemapObj[key];\n\t\t}\n\n\t\tvar selectors = this.selectors;\n\t\tthis.selectors = new SelectorList(this.selectors);\n\t},\n\n\t/**\n\t * Returns all selectors or recursively find and return all child selectors of a parent selector.\n\t * @param parentSelectorId\n\t * @returns {Array}\n\t */\n\tgetAllSelectors: function (parentSelectorId) {\n\n\t\treturn this.selectors.getAllSelectors(parentSelectorId);\n\t},\n\n\t/**\n\t * Returns only selectors that are directly under a parent\n\t * @param parentSelectorId\n\t * @returns {Array}\n\t */\n\tgetDirectChildSelectors: function (parentSelectorId) {\n\t\treturn this.selectors.getDirectChildSelectors(parentSelectorId);\n\t},\n\n\t/**\n\t * Returns all selector id parameters\n\t * @returns {Array}\n\t */\n\tgetSelectorIds: function () {\n\t\tvar ids = ['_root'];\n\t\tthis.selectors.forEach(function(selector){\n\t\t\tids.push(selector.id);\n\t\t});\n\t\treturn ids;\n\t},\n\n\t/**\n\t * Returns only selector ids which can have child selectors\n\t * @returns {Array}\n\t */\n\tgetPossibleParentSelectorIds: function () {\n\t\tvar ids = ['_root'];\n\t\tthis.selectors.forEach(function(selector){\n\t\t\tif(selector.canHaveChildSelectors()){\n\t\t\t\tids.push(selector.id);\n\t\t\t}\n\t\t}.bind(this));\n\t\treturn ids;\n\t},\n\n\tgetStartUrls: function() {\n\n\t\tvar startUrls = this.startUrl;\n\t\t// single start url\n\t\tif(this.startUrl.push === undefined) {\n\t\t\tstartUrls = [startUrls];\n\t\t}\n\n\t\tvar urls = [];\n\t\tstartUrls.forEach(function(startUrl) {\n\n\t\t\t// zero padding helper\n\t\t\tvar lpad = function(str, length) {\n\t\t\t\twhile (str.length < length)\n\t\t\t\t\tstr = \"0\" + str;\n\t\t\t\treturn str;\n\t\t\t};\n\n\t\t\tvar re = /^(.*?)\\[(\\d+)\\-(\\d+)(:(\\d+))?\\](.*)$/;\n\t\t\tvar matches = startUrl.match(re);\n\t\t\tif(matches) {\n\t\t\t\tvar startStr = matches[2];\n\t\t\t\tvar endStr = matches[3];\n\t\t\t\tvar start = parseInt(startStr);\n\t\t\t\tvar end = parseInt(endStr);\n\t\t\t\tvar incremental = 1;\n\t\t\t\tconsole.log(matches[5]);\n\t\t\t\tif(matches[5] !== undefined) {\n\t\t\t\t\tincremental = parseInt(matches[5]);\n\t\t\t\t}\n\t\t\t\tfor (var i = start; i <= end; i+=incremental) {\n\n\t\t\t\t\t// with zero padding\n\t\t\t\t\tif(startStr.length === endStr.length) {\n\t\t\t\t\t\turls.push(matches[1]+lpad(i.toString(), startStr.length)+matches[6]);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\turls.push(matches[1]+i+matches[6]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn urls;\n\t\t\t}\n\t\t\telse {\n\t\t\t\turls.push(startUrl);\n\t\t\t}\n\t\t});\n\n\t\treturn urls;\n\t},\n\t// 替换selector对象\n\tupdateSelector: function (selector, selectorData) {\n\t\t// selector为空新建对象\n\t\tif(selector === undefined) {\n\t\t\tselector = new Selector(selectorData);\n\t\t}\n\t\t// id改变\n\t\tif (selector.id !== undefined && selector.id !== selectorData.id) {\n\t\t\t// 遍历选择器集合\n\t\t\tthis.selectors.forEach(function (currentSelector) {\n\t\t\t\tcurrentSelector.renameParentSelector(selector.id, selectorData.id);\n\t\t\t});\n\n\t\t\t// update cyclic selector\n\t\t\tvar pos = selectorData.parentSelectors.indexOf(selector.id);\n\t\t\tif (pos !== -1) {\n\t\t\t\tselectorData.parentSelectors.splice(pos, 1, selectorData.id);\n\t\t\t}\n\t\t}\n\t\t// 根据该选择器类型更新选择器属性\n\t\tselector.updateData(selectorData);\n\t\t// 不存在该id 新增\n\t\tif (this.getSelectorIds().indexOf(selector.id) === -1) {\n\t\t\tthis.selectors.push(selector);\n\t\t}\n\t},\n\tdeleteSelector: function (selectorToDelete) {\n\n\t\tthis.selectors.forEach(function(selector) {\n\t\t\tif(selector.hasParentSelector(selectorToDelete.id)) {\n\t\t\t\tselector.removeParentSelector(selectorToDelete.id);\n\t\t\t\tif(selector.parentSelectors.length === 0) {\n\t\t\t\t\tthis.deleteSelector(selector);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this));\n\n\t\tfor (var i in this.selectors) {\n\t\t\tif (this.selectors[i].id === selectorToDelete.id) {\n\t\t\t\tthis.selectors.splice(i, 1);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\tgetDataTableId: function () {\n\t\treturn this._id.replace(/\\./g, '_');\n\t},\n\t// 导出JSOn格式\n\texportSitemap: function () {\n\t\tvar sitemapObj = JSON.parse(JSON.stringify(this));\n\t\tdelete sitemapObj._rev;\n\t\treturn JSON.stringify(sitemapObj);\n\t},\n\timportSitemap: function (sitemapJSON) {\n\t\tvar sitemapObj = JSON.parse(sitemapJSON);\n\t\tthis.initData(sitemapObj);\n\t},\n\t// 预览数据\n\tgetDataColumns: function () {\n\t\tvar columns = [\n\t\t\t'web-scraper-start-url'\n\t\t];\n\t\tthis.selectors.forEach(function (selector) {\n\n\t\t\tcolumns = columns.concat(selector.getDataColumns());\n\t\t});\n\n\t\treturn columns;\n\t},\n\tgetDataExportCsvBlob: function (data) {\n\n\t\tvar columns = this.getDataColumns(),\n\t\t\tdelimiter = ',',\n\t\t\tnewline = \"\\n\",\n\t\t\tcsvData = ['\\ufeff']; // utf-8 bom char\n\n\t\t// header\n\t\tcsvData.push(columns.join(delimiter) + newline)\n\n\t\t// data\n\t\tdata.forEach(function (row) {\n\t\t\tvar rowData = [];\n\t\t\tcolumns.forEach(function (column) {\n\t\t\t\tvar cellData = row[column];\n\t\t\t\tif (cellData === undefined) {\n\t\t\t\t\tcellData = \"\";\n\t\t\t\t}\n\t\t\t\telse if (typeof cellData === 'object') {\n\t\t\t\t\tcellData = JSON.stringify(cellData);\n\t\t\t\t}\n\n\t\t\t\trowData.push('\"' + cellData.replace(/\"/g, '\"\"').trim() + '\"');\n\t\t\t});\n\t\t\tcsvData.push(rowData.join(delimiter) + newline);\n\t\t});\n\n\t\treturn new Blob(csvData, {type: 'text/csv'});\n\t},\n\tgetSelectorById: function (selectorId) {\n\t\treturn this.selectors.getSelectorById(selectorId);\n\t},\n\t/**\n\t * Create full clone of sitemap\n\t * @returns {Sitemap}\n\t */\n\tclone: function () {\n\t\tvar clonedJSON = JSON.parse(JSON.stringify(this));\n\t\tvar sitemap = new Sitemap(clonedJSON);\n\t\treturn sitemap;\n\t}\n};\n\n"
  },
  {
    "path": "server/static/scripts/Stats.js",
    "content": "var Stats = function (options) {\n\n\tif (options === undefined) {\n\t\toptions = {};\n\t}\n\n\tthis.extensionIsBeingUsedCheckIntervalTime = options.checkInterval || 30;\n\tthis.store = options.store;\n\tthis.config = options.config;\n\n\t// a dict of date=>timestamp values of the time when extension was started used\n\tthis.usageStartTimes = {};\n\n\tvar day = 1000 * 60 * 60 * 24;\n\tthis.randomFirstReportInMs = options.randomFirstReportInMs || 2 * day;\n\tthis.reportInMs = options.reportInMs || 3 * day;\n\tthis.potentialSubmitIntervalMs = options.potentialSubmitIntervalMs || 5*60e3;\n};\n\nvar statsReporterInterval;\n\nStats.prototype = {\n\n\tgetDate: function (time) {\n\n\t\tvar d;\n\t\tif (time === undefined) {\n\t\t\td = new Date();\n\t\t}\n\t\telse {\n\t\t\td = new Date(time);\n\t\t}\n\n\t\tvar month = (\"0\"+(d.getMonth()+1)).substr(-2);\n\t\tvar day = (\"0\"+d.getDate()).substr(-2);\n\n\t\treturn d.getFullYear() + '-' + month + '-' + day;\n\t},\n\n\tinitStats: function () {\n\n\t\treturn this.initIndexedDbConnection()\n\t\t\t.then(function () {\n\t\t\t\treturn this.getLastTimeStatsReported();\n\t\t\t}.bind(this))\n\t\t\t.then(function (lastTimeStatsReported) {\n\t\t\t\tthis.lastTimeStatsReported = lastTimeStatsReported;\n\t\t\t}.bind(this))\n\t\t\t.then(function () {\n\t\t\t\treturn this.getStatId();\n\t\t\t}.bind(this))\n\t\t\t.then(function (statId) {\n\t\t\t\tthis.statId = statId;\n\t\t\t}.bind(this))\n\t\t\t.then(function () {\n\t\t\t\treturn this.initDailyStats();\n\t\t\t}.bind(this));\n\t},\n\n\tinitIndexedDbConnection: function () {\n\n\t\tvar d = $.Deferred();\n\n\t\tvar request = window.indexedDB.open(\"WebScraperStats\", 1);\n\n\t\t// Create the schema\n\t\trequest.onupgradeneeded = function () {\n\t\t\tvar db = request.result;\n\t\t\tvar store = db.createObjectStore(\"Stats\", {keyPath: \"id\"});\n\t\t};\n\n\t\trequest.onerror = function (event) {\n\t\t\td.reject(\"Database error: \" + event.target.errorCode);\n\t\t};\n\t\trequest.onsuccess = function (event) {\n\t\t\tthis.indexedDb = event.target.result;\n\t\t\td.resolve();\n\t\t}.bind(this);\n\n\t\treturn d.promise();\n\t},\n\n\tindexedDbPut: function (key, value) {\n\n\t\tvar d = $.Deferred();\n\n\t\tvar tx = this.indexedDb.transaction(\"Stats\", \"readwrite\");\n\t\tvar store = tx.objectStore(\"Stats\");\n\t\tvar request = store.put({\n\t\t\tid: key,\n\t\t\tdata: value\n\t\t});\n\n\t\trequest.onerror = function (event) {\n\t\t\td.reject(\"Database put error: \" + event.target.errorCode);\n\t\t};\n\t\trequest.onsuccess = function (event) {\n\t\t\td.resolve();\n\t\t};\n\n\t\treturn d.promise();\n\t},\n\n\tindexedDbGet: function (key) {\n\n\t\tvar d = $.Deferred();\n\n\t\tvar tx = this.indexedDb.transaction(\"Stats\", \"readwrite\");\n\t\tvar store = tx.objectStore(\"Stats\");\n\t\tvar request = store.get(key);\n\n\t\trequest.onerror = function (event) {\n\t\t\td.reject(\"Database get error: \" + event.target.errorCode);\n\t\t};\n\t\trequest.onsuccess = function (event) {\n\t\t\tvar result = event.target.result;\n\t\t\tif (result !== undefined && result.data !== undefined) {\n\t\t\t\td.resolve(result.data);\n\t\t\t}\n\t\t\telse {\n\t\t\t\td.resolve({});\n\t\t\t}\n\t\t};\n\n\t\treturn d.promise();\n\t},\n\n\tindexedDbDelete: function (key) {\n\n\t\tvar d = $.Deferred();\n\n\t\tvar tx = this.indexedDb.transaction(\"Stats\", \"readwrite\");\n\t\tvar store = tx.objectStore(\"Stats\");\n\t\tvar request = store.delete(key);\n\n\t\trequest.onerror = function (event) {\n\t\t\td.reject(\"Database delete error: \" + event.target.errorCode);\n\t\t};\n\t\trequest.onsuccess = function (event) {\n\t\t\td.resolve();\n\t\t};\n\n\t\treturn d.promise();\n\t},\n\n\tinitDailyStats: function () {\n\t\t// var deferredResponse = $.Deferred();\n\n\t\treturn this.indexedDbGet('daily_stats').then(function (dailyStats) {\n\n\t\t\tthis.dailyStats = dailyStats;\n\n\t\t\t// init today's date\n\n\t\t\tvar date = this.getDate();\n\t\t\tthis.initDailyStatDate(date);\n\n\t\t}.bind(this)).then(this.updateDailyStats.bind(this));\n\t},\n\n\tinitDailyStatDate: function (date) {\n\t\tif (this.dailyStats[date] === undefined) {\n\t\t\tthis.dailyStats[date] = {\n\t\t\t\t\"statId\" : this.statId,\n\t\t\t\t\"date\": date,\n\t\t\t\t\"scrapingJobsRun\": 0,\n\t\t\t\t\"pagesScraped\": 0,\n\t\t\t\t\"sitemapsCreated\": 0,\n\t\t\t\t\"sitemapsDeleted\": 0,\n\t\t\t\t\"sitemapsImported\": 0,\n\t\t\t\t\"webScraperOpened\": false,\n\t\t\t\t\"webScraperUsageMinutes\": 0\n\t\t\t}\n\t\t}\n\t},\n\n\tgetDailyStats: function () {\n\n\t\tvar currentDate = this.getDate();\n\n\t\tvar dailyStats = this.dailyStats;\n\t\tvar dailyStatsArray = [];\n\t\tfor (var date in dailyStats) {\n\t\t\t// do not report current date because we are still updating\n\t\t\tif (date.match(/\\d+\\-\\d+\\-\\d+/) && date !== currentDate) {\n\t\t\t\tdailyStatsArray.push(dailyStats[date]);\n\t\t\t}\n\t\t}\n\t\treturn dailyStatsArray;\n\t},\n\n\tsetDailyStat: function (key, value) {\n\n\t\tvar date = this.getDate();\n\t\tthis.initDailyStatDate(date);\n\t\tthis.dailyStats[date][key] = value;\n\t\treturn this.updateDailyStats();\n\t},\n\n\tincrementDailyStat: function (key, increment) {\n\n\t\tif (increment === undefined) {\n\t\t\tincrement = 1;\n\t\t}\n\n\t\tvar date = this.getDate();\n\t\tthis.initDailyStatDate(date);\n\t\tif(!this.dailyStats[date][key]) {\n\t\t\tthis.dailyStats[date][key] = 0;\n\t\t}\n\t\tthis.dailyStats[date][key] += increment;\n\t\treturn this.updateDailyStats();\n\t},\n\n\tupdateExtensionIsBeingUsed: function () {\n\n\t\tvar date = this.getDate();\n\n\t\tvar unixTime = Math.round(Date.now() / 1000);\n\n\t\tif (this.usageStartTimes[date] === undefined) {\n\t\t\tthis.usageStartTimes[date] = {\n\t\t\t\t'timeStarted': unixTime,\n\t\t\t\t'lastUpdated': unixTime,\n\t\t\t\t'checkInterval': null\n\t\t\t};\n\t\t\tthis.startExtensionIsBeingUsedCheckInterval(date);\n\t\t}\n\t\telse {\n\t\t\tthis.usageStartTimes[date].lastUpdated = unixTime;\n\t\t}\n\t},\n\n\t// check every 30 seconds whether web scraper usage\n\tstartExtensionIsBeingUsedCheckInterval: function (date) {\n\n\t\t// wait for a moment when extension isn't being used\n\t\tthis.usageStartTimes[date].checkInterval = setInterval(function () {\n\t\t\tvar unixTime = Math.round(Date.now() / 1000);\n\t\t\t// debugger;\n\t\t\tif (this.usageStartTimes[date]['lastUpdated'] + 65 < unixTime) {\n\t\t\t\tconsole.log(\"extension usage ended\");\n\n\n\t\t\t\tvar usageDuration = Math.round((unixTime - this.usageStartTimes[date].timeStarted) / 60);\n\t\t\t\tthis.incrementDailyStat(\"webScraperUsageMinutes\", usageDuration);\n\n\t\t\t\tclearInterval(this.usageStartTimes[date].checkInterval);\n\t\t\t\tdelete this.usageStartTimes[date];\n\t\t\t}\n\t\t}.bind(this), this.extensionIsBeingUsedCheckIntervalTime * 1000)\n\t},\n\n\t/**\n\t * Store daly stats in db\n\t */\n\tupdateDailyStats: function () {\n\n\t\treturn this.indexedDbPut('daily_stats', this.dailyStats);\n\t},\n\n\tgetDatabaseStats: function () {\n\n\t\tvar $deferredResponse = $.Deferred();\n\t\tvar store = this.store;\n\t\tstore.getAllSitemaps(function (sitemaps) {\n\n\t\t\tsitemaps = sitemaps.map(function (sitemap) {\n\t\t\t\treturn new Sitemap(sitemap);\n\t\t\t});\n\n\t\t\tvar domainDict = [];\n\t\t\tvar deferredDatabaseSizes = [];\n\n\t\t\tvar couchDbUsed = this.config.storageType !== 'local';\n\n\t\t\tvar stats = {\n\t\t\t\t\"statId\": this.statId,\n\t\t\t\t\"couchDBUsed\": couchDbUsed,\n\t\t\t\t\"sitemapCount\": 0,\n\t\t\t\t\"selectorCountPerSitemap\": {\n\t\t\t\t\t\"1-1\": 0,\n\t\t\t\t\t\"2-5\": 0,\n\t\t\t\t\t\"6-10\": 0,\n\t\t\t\t\t\"11+\": 0\n\t\t\t\t},\n\t\t\t\t\"startUrlCountPerSitemap\": {\n\t\t\t\t\t\"1-1\": 0,\n\t\t\t\t\t\"2-5\": 0,\n\t\t\t\t\t\"6-10\": 0,\n\t\t\t\t\t\"11-50\": 0,\n\t\t\t\t\t\"51-200\": 0,\n\t\t\t\t\t\"201-500\": 0,\n\t\t\t\t\t\"501-1000\": 0,\n\t\t\t\t\t\"1001-5000\": 0,\n\t\t\t\t\t\"5001+\": 0\n\t\t\t\t},\n\t\t\t\t\"selectorUsageCount\": {\n\t\t\t\t\t\"SelectorElement\": 0,\n\t\t\t\t\t\"SelectorElementAttribute\": 0,\n\t\t\t\t\t\"SelectorElementClick\": 0,\n\t\t\t\t\t\"SelectorElementScroll\": 0,\n\t\t\t\t\t\"SelectorGroup\": 0,\n\t\t\t\t\t\"SelectorHTML\": 0,\n\t\t\t\t\t\"SelectorImage\": 0,\n\t\t\t\t\t\"SelectorLink\": 0,\n\t\t\t\t\t\"SelectorPopupLink\": 0,\n\t\t\t\t\t\"SelectorTable\": 0,\n\t\t\t\t\t\"SelectorText\": 0\n\t\t\t\t},\n\t\t\t\t\"datasetSizes\": {\n\t\t\t\t\t\"1-1\": 0,\n\t\t\t\t\t\"2-5\": 0,\n\t\t\t\t\t\"6-10\": 0,\n\t\t\t\t\t\"11-50\": 0,\n\t\t\t\t\t\"51-200\": 0,\n\t\t\t\t\t\"201-500\": 0,\n\t\t\t\t\t\"501-1000\": 0,\n\t\t\t\t\t\"1001-5000\": 0,\n\t\t\t\t\t\"5001-10000\": 0,\n\t\t\t\t\t\"10001+\": 0\n\t\t\t\t},\n\t\t\t\t\"startUrlDomains\": []\n\t\t\t};\n\n\n\t\t\tfunction increaseStatGroup(group, value) {\n\n\t\t\t\tvar statGroups = {\n\t\t\t\t\t\"selectorCountPerSitemap\": {\n\t\t\t\t\t\t\"1-1\": {min: 1, max: 1},\n\t\t\t\t\t\t\"2-5\": {min: 2, max: 5},\n\t\t\t\t\t\t\"6-10\": {min: 6, max: 10},\n\t\t\t\t\t\t\"11+\": {min: 1, max: 2147483647}\n\t\t\t\t\t},\n\t\t\t\t\t\"startUrlCountPerSitemap\": {\n\t\t\t\t\t\t\"1-1\": {min: 1, max: 1},\n\t\t\t\t\t\t\"2-5\": {min: 2, max: 5},\n\t\t\t\t\t\t\"6-10\": {min: 6, max: 10},\n\t\t\t\t\t\t\"11-50\": {min: 11, max: 50},\n\t\t\t\t\t\t\"51-200\": {min: 51, max: 200},\n\t\t\t\t\t\t\"201-500\": {min: 201, max: 500},\n\t\t\t\t\t\t\"501-1000\": {min: 501, max: 1000},\n\t\t\t\t\t\t\"1001-5000\": {min: 1000, max: 5000},\n\t\t\t\t\t\t\"5001+\": {min: 5001, max: 2147483647}\n\t\t\t\t\t},\n\t\t\t\t\t\"datasetSizes\": {\n\t\t\t\t\t\t\"1-1\": {min: 1, max: 1},\n\t\t\t\t\t\t\"2-5\": {min: 2, max: 5},\n\t\t\t\t\t\t\"6-10\": {min: 6, max: 10},\n\t\t\t\t\t\t\"11-50\": {min: 11, max: 50},\n\t\t\t\t\t\t\"51-200\": {min: 51, max: 200},\n\t\t\t\t\t\t\"201-500\": {min: 201, max: 500},\n\t\t\t\t\t\t\"501-1000\": {min: 501, max: 1000},\n\t\t\t\t\t\t\"1001-5000\": {min: 1000, max: 5000},\n\t\t\t\t\t\t\"5001-10000\": {min: 5001, max: 10000},\n\t\t\t\t\t\t\"10001+\": {min: 10001, max: 2147483647}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tfor (var statGroup in statGroups[group]) {\n\t\t\t\t\tvar limiter = statGroups[group][statGroup];\n\t\t\t\t\tif (value >= limiter.min && value <= limiter.max) {\n\t\t\t\t\t\tstats[group][statGroup]++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstats.sitemapCount = sitemaps.length;\n\n\t\t\tsitemaps.forEach(function (sitemap) {\n\n\t\t\t\t// selector counter\n\t\t\t\tvar selectorCount = sitemap.selectors.length;\n\t\t\t\tincreaseStatGroup(\"selectorCountPerSitemap\", selectorCount);\n\n\t\t\t\t// selector usage counter\n\t\t\t\tsitemap.selectors.forEach(function (selector) {\n\t\t\t\t\tstats.selectorUsageCount[selector.type]++;\n\t\t\t\t});\n\n\t\t\t\t// start url count\n\t\t\t\tvar startUrls = sitemap.getStartUrls();\n\t\t\t\tvar startUrlCount = startUrls.length;\n\t\t\t\tincreaseStatGroup(\"startUrlCountPerSitemap\", startUrlCount);\n\t\t\t\tvar matches = startUrls[0].match(/^https?\\:\\/\\/([^\\/?#]+)(?:[\\/?#]|$)/i);\n\t\t\t\tif (matches) {\n\t\t\t\t\tdomainDict[matches[1]] = true;\n\t\t\t\t}\n\n\t\t\t\t// gather database size\n\t\t\t\tdeferredDatabaseSizes.push(function () {\n\n\t\t\t\t\tvar $deferred = $.Deferred();\n\n\t\t\t\t\tstore.getSitemapData(sitemap, function (data) {\n\t\t\t\t\t\tvar documentCount = data.length;\n\t\t\t\t\t\t$deferred.resolve(documentCount);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn $deferred.promise();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tfor (var domain in domainDict) {\n\t\t\t\tstats.startUrlDomains.push(domain);\n\t\t\t}\n\n\t\t\t// gather database sizes\n\t\t\t$.whenCallSequentially(deferredDatabaseSizes).done(function (databaseSizes) {\n\n\t\t\t\tdatabaseSizes.forEach(function (databaseSize) {\n\t\t\t\t\tincreaseStatGroup(\"datasetSizes\", databaseSize);\n\t\t\t\t});\n\t\t\t\t$deferredResponse.resolve(stats);\n\t\t\t}).fail(function () {\n\n\t\t\t});\n\n\n\t\t}.bind(this));\n\n\t\treturn $deferredResponse.promise();\n\t},\n\n\tgetStats: function () {\n\n\t\treturn this.getDatabaseStats().then(function (databaseStats) {\n\t\t\tvar dailyStats = this.getDailyStats();\n\t\t\treturn {\n\t\t\t\tdatabaseStats: databaseStats,\n\t\t\t\tdailyStats: dailyStats\n\t\t\t};\n\t\t}.bind(this));\n\t},\n\n\tgetLastTimeStatsReported: function () {\n\n\t\treturn this.indexedDbGet(\"reporter\").then(function (doc) {\n\n\t\t\tif (doc.timeLastReported !== undefined) {\n\t\t\t\treturn doc.timeLastReported;\n\t\t\t}\n\n\t\t\t// first time fetching the time. generate a random moment when stats\n\t\t\t// were reported\n\t\t\tvar time = Date.now();\n\t\t\tvar timeLastReported = Math.round(time - Math.random() * this.randomFirstReportInMs);\n\n\t\t\t// store the random time in db\n\t\t\treturn this.setLastTimeStatsReported(timeLastReported).then(function () {\n\t\t\t\treturn time;\n\t\t\t});\n\t\t}.bind(this));\n\t},\n\n\tsetLastTimeStatsReported: function (time) {\n\n\t\tthis.lastTimeStatsReported = time;\n\n\t\t// store this in db\n\t\treturn this.indexedDbPut('reporter', {\n\t\t\ttimeLastReported: time\n\t\t});\n\t},\n\n\tgetStatId: function () {\n\n\t\treturn this.indexedDbGet(\"statId\").then(function (doc) {\n\n\t\t\t// already was in db\n\t\t\tif (doc.statId !== undefined) {\n\t\t\t\treturn doc.statId;\n\t\t\t}\n\n\t\t\t// first time fetching. generate a random string\n\t\t\tvar statId = \"\";\n\t\t\tvar possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n\t\t\tfor (var i = 1; i <= 60; i++) {\n\t\t\t\tstatId += possible.charAt(Math.floor(Math.random() * possible.length));\n\t\t\t}\n\n\t\t\t// store this in db\n\t\t\treturn this.indexedDbPut('statId', {\n\t\t\t\tstatId: statId\n\t\t\t}).then(function () {\n\t\t\t\treturn statId;\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\t},\n\n\tinitReporter: function () {\n\n\t\tvar day = 1000 * 60 * 60 * 24;\n\n\t\tthis.stopReporter();\n\n\t\t// start submission engine\n\t\tstatsReporterInterval = setInterval(function () {\n\n\t\t\t// check whether we need to report stats\n\t\t\tvar time = Date.now();\n\t\t\tif (this.lastTimeStatsReported + this.reportInMs >= time) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// now is the time to report stats\n\t\t\tthis.reportStats()\n\t\t\t\t.then(function () {\n\t\t\t\t\t// update stats have been reported\n\t\t\t\t\tvar lastTimeStatsReported = Date.now();\n\t\t\t\t\treturn this.setLastTimeStatsReported(lastTimeStatsReported);\n\t\t\t\t}.bind(this))\n\t\t\t\t.then(function () {\n\t\t\t\t\t// reset daily stats\n\t\t\t\t\tthis.resetDailyStats();\n\t\t\t\t}.bind(this))\n\n\t\t}.bind(this), this.potentialSubmitIntervalMs);\n\t},\n\n\tstopReporter: function () {\n\n\t\tclearInterval(statsReporterInterval);\n\t},\n\n\tresetDailyStats: function () {\n\n\t\tvar currentDate = this.getDate();\n\n\t\tvar dailyStats = this.dailyStats;\n\t\tfor (var date in dailyStats) {\n\t\t\t// do not report current date because we are still updating\n\t\t\tif (date.match(/\\d+\\-\\d+\\-\\d+/) && date !== currentDate) {\n\t\t\t\tdelete dailyStats[date];\n\t\t\t}\n\t\t}\n\n\t\treturn this.updateDailyStats();\n\t},\n\n\treportStats: function () {\n\n\t\tvar d = $.Deferred();\n\n\t\tthis.getStats().then(function (stats) {\n\t\t\t$.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: \"https://stats.webscraper.io/post-stats\",\n\t\t\t\tdata: JSON.stringify({\n\t\t\t\t\tdata: stats\n\t\t\t\t}),\n\t\t\t\tcontentType: \"application/json; charset=utf-8\",\n\t\t\t\tdataType: \"json\",\n\t\t\t\tsuccess: function (response) {\n\t\t\t\t\tconsole.log(response);\n\t\t\t\t\td.resolve();\n\t\t\t\t},\n\t\t\t\tfailure: function (err) {\n\t\t\t\t\tconsole.log(\"failed to report stats \" + err);\n\t\t\t\t\td.reject(err);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn d.promise();\n\t}\n};"
  },
  {
    "path": "server/static/scripts/Store.js",
    "content": "var Store = function (config) {\n    this.config = config;\n\n    // configure couchdb\n    this.sitemapDb = new PouchDB(this.config.sitemapDb);\n};\n\nvar StoreScrapeResultWriter = function(db) {\n   this.db = db;\n};\n\nStoreScrapeResultWriter.prototype = {\n    writeDocs: function(docs, callback) {\n\t\tif(docs.length === 0) {\n\t\t\tcallback();\n\t\t}\n\t\telse {\n\t\t\tthis.db.bulkDocs({docs:docs}, function(err, response) {\n\t\t\t\tif(err !== null) {\n\t\t\t\t\tconsole.log(\"Error while persisting scraped data to db\", err);\n\t\t\t\t}\n\t\t\t\tcallback();\n\t\t\t});\n\t\t}\n    }\n};\n\nStore.prototype = {\n\t\n\tsanitizeSitemapDataDbName: function(dbName) {\n\t\treturn 'sitemap-data-'+dbName.replace(/[^a-z0-9_\\$\\(\\)\\+\\-/]/gi, \"_\");\n\t},\n\tgetSitemapDataDbLocation: function(sitemapId) {\n\t\tvar dbName = this.sanitizeSitemapDataDbName(sitemapId);\n\t\treturn this.config.dataDb+dbName;\n\t},\n\tgetSitemapDataDb: function(sitemapId) {\n\t\t\n\t\tvar dbLocation = this.getSitemapDataDbLocation(sitemapId);\n        return new PouchDB(dbLocation);\n    },\n\t\n\t/**\n\t * creates or clears a sitemap db\n\t * @param {type} sitemapId\n\t * @returns {undefined}\n\t */\n    initSitemapDataDb: function(sitemapId, callback) {\n\t\tvar dbLocation = this.getSitemapDataDbLocation(sitemapId);\n\t\tvar store = this;\n\n\t\tPouchDB.destroy(dbLocation, function() {\n\t\t\tvar db = store.getSitemapDataDb(sitemapId);\n            var dbWriter = new StoreScrapeResultWriter(db);\n\t\t\tcallback(dbWriter);\n\t\t});\n\t},\n\n    createSitemap: function (sitemap, callback) {\n\n        var sitemapJson = JSON.parse(JSON.stringify(sitemap));\n\n        if(!sitemap._id) {\n            console.log(\"cannot save sitemap without an id\", sitemap);\n        }\n\n        this.sitemapDb.put(sitemapJson, function(sitemap, err, response) {\n            // @TODO handle err\n            sitemap._rev = response.rev;\n            callback(sitemap);\n        }.bind(this, sitemap));\n    },\n    saveSitemap: function (sitemap, callback) {\n        // @TODO remove\n        this.createSitemap(sitemap, callback);\n    },\n    deleteSitemap: function (sitemap, callback) {\n\n        sitemap = JSON.parse(JSON.stringify(sitemap));\n\n        this.sitemapDb.remove(sitemap, function(err, response){\n            // @TODO handle err\n\n\t\t\t// delete sitemap data db\n\t\t\tvar dbLocation = this.getSitemapDataDbLocation(sitemap._id);\n\t\t\tPouchDB.destroy(dbLocation, function() {\n\t\t\t\tcallback();\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n    },\n    getAllSitemaps: function (callback) {\n\n        this.sitemapDb.allDocs({include_docs: true}, function(err, response) {\n            var sitemaps = [];\n            for (var i in response.rows) {\n                var sitemap = response.rows[i].doc;\n                if (!chrome.extension) {\n                    sitemap = new Sitemap(sitemap);\n                }\n\n                sitemaps.push(sitemap);\n            }\n            callback(sitemaps);\n        });\n    },\n\n    getSitemapData: function (sitemap, callback) {\n\n        var db = this.getSitemapDataDb(sitemap._id);\n        db.allDocs({include_docs: true}, function(err, response) {\n            var responseData = [];\n            for (var i in response.rows) {\n                var doc = response.rows[i].doc;\n                responseData.push(doc);\n            }\n            callback(responseData);\n        });\n    },\n\t// @TODO make this call lighter\n    sitemapExists: function (sitemapId, callback) {\n        this.getAllSitemaps(function (sitemaps) {\n            var sitemapFound = false;\n            for (var i in sitemaps) {\n                if (sitemaps[i]._id === sitemapId) {\n                    sitemapFound = true;\n                }\n            }\n            callback(sitemapFound);\n        });\n    }\n};"
  },
  {
    "path": "server/static/scripts/StoreDevtools.js",
    "content": "/**\n * From devtools panel there is no possibility to execute XHR requests. So all requests to a remote CouchDb must be\n * handled through Background page. StoreDevtools is a simply a proxy store\n * @constructor\n */\nvar StoreDevtools = function () {\n\n};\n\nStoreDevtools.prototype = {\n\tcreateSitemap: function (sitemap, callback) {\n\n\t\tvar request = {\n\t\t\tcreateSitemap: true,\n\t\t\tsitemap: JSON.parse(JSON.stringify(sitemap))\n\t\t};\n\n\t\t// chrome.runtime.sendMessage(request, function (callbackFn, originalSitemap, newSitemap) {\n\t\t// \toriginalSitemap._rev = newSitemap._rev;\n\t\t// \tcallbackFn(originalSitemap);\n\t\t// }.bind(this, callback, sitemap));\n\t},\n\tsaveSitemap: function (sitemap, callback) {\n\t\tthis.createSitemap(sitemap, callback);\n\t},\n\tdeleteSitemap: function (sitemap, callback) {\n\n\t\tvar request = {\n\t\t\tdeleteSitemap: true,\n\t\t\tsitemap: JSON.parse(JSON.stringify(sitemap))\n\t\t};\n\t\t// chrome.runtime.sendMessage(request, function (response) {\n\t\t// \tcallback();\n\t\t// });\n\t},\n\tgetAllSitemaps: function (callback) {\n\n\t\tvar request = {\n\t\t\tgetAllSitemaps: true\n\t\t};\n\n\t\t// chrome.runtime.sendMessage(request, function (response) {\n        //\n\t\t// \tvar sitemaps = [];\n        //\n\t\t// \tfor (var i in response) {\n\t\t// \t\tsitemaps.push(new Sitemap(response[i]));\n\t\t// \t}\n\t\t// \tcallback(sitemaps);\n\t\t// });\n\t},\n\tgetSitemapData: function (sitemap, callback) {\n\t\tvar request = {\n\t\t\tgetSitemapData: true,\n\t\t\tsitemap: JSON.parse(JSON.stringify(sitemap))\n\t\t};\n\n\t\t// chrome.runtime.sendMessage(request, function (response) {\n\t\t// \tcallback(response);\n\t\t// });\n\t},\n\tsitemapExists: function (sitemapId, callback) {\n\n\t\tvar request = {\n\t\t\tsitemapExists: true,\n\t\t\tsitemapId: sitemapId\n\t\t};\n\n\t\t// chrome.runtime.sendMessage(request, function (response) {\n\t\t// \tcallback(response);\n\t\t// });\n\t}\n};"
  },
  {
    "path": "server/static/scripts/UniqueElementList.js",
    "content": "/**\n * Only Elements unique will be added to this array\n * @constructor\n */\nUniqueElementList = function(clickElementUniquenessType) {\n\tthis.clickElementUniquenessType = clickElementUniquenessType;\n\tthis.addedElements = {};\n};\n\nUniqueElementList.prototype = new Array;\n\nUniqueElementList.prototype.push = function(element) {\n\n\tif(this.isAdded(element)) {\n\t\treturn false;\n\t}\n\telse {\n\t\tvar elementUniqueId = this.getElementUniqueId(element);\n\t\tthis.addedElements[elementUniqueId] = true;\n\t\tvar cloned = $(element).clone(true)[0];\n\n\t\t// fix clone isn't cloning the state of <select> elements\n\t\tvar selects = $(element).find(\"select\");\n\t\t$(selects).each(function(i) {\n\t\t\tvar select = this;\n\t\t\t$(cloned).find(\"select\").eq(i).val($(select).val());\n\t\t});\n\n\t\tArray.prototype.push.call(this, cloned);\n\t\treturn true;\n\t}\n};\n\nUniqueElementList.prototype.getElementUniqueId = function(element) {\n\n\tif(this.clickElementUniquenessType === 'uniqueText') {\n\t\tvar elementText = $(element).text().trim();\n\t\treturn elementText;\n\t}\n\telse if(this.clickElementUniquenessType === 'uniqueHTMLText') {\n\n\t\tvar elementHTML =  $(\"<div class='-web-scraper-should-not-be-visible'>\").append($(element).eq(0).clone()).html();\n\t\treturn elementHTML;\n\t}\n\telse if(this.clickElementUniquenessType === 'uniqueHTML') {\n\n\t\t// get element without text\n\t\tvar $element = $(element).eq(0).clone();\n\n\t\tvar removeText = function($element) {\n\t\t\t$element.contents()\n\t\t\t\t.filter(function() {\n\t\t\t\t\tif(this.nodeType !== 3) {\n\t\t\t\t\t\tremoveText($(this));\n\t\t\t\t\t}\n\t\t\t\t\treturn this.nodeType == 3; //Node.TEXT_NODE\n\t\t\t\t}).remove();\n\t\t};\n\t\tremoveText($element);\n\n\t\tvar elementHTML =  $(\"<div class='-web-scraper-should-not-be-visible'>\").append($element).html();\n\t\treturn elementHTML;\n\t}\n\telse if(this.clickElementUniquenessType === 'uniqueCSSSelector') {\n\t\tvar cs = new CssSelector({\n\t\t\tenableSmartTableSelector: false,\n\t\t\tparent: $(\"body\")[0],\n\t\t\tenableResultStripping:false\n\t\t});\n\t\tvar CSSSelector = cs.getCssSelector([element]);\n\t\treturn CSSSelector;\n\t}\n\telse {\n\t\tthrow \"Invalid clickElementUniquenessType \"+this.clickElementUniquenessType;\n\t}\n};\n\nUniqueElementList.prototype.isAdded = function(element) {\n\n\tvar elementUniqueId = this.getElementUniqueId(element);\n\tvar isAdded = elementUniqueId in this.addedElements;\n\treturn isAdded;\n};\n"
  },
  {
    "path": "server/static/spider/end.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link rel=\"stylesheet\" href=\"/static/lib/bootstrap-3.3.7/css/bootstrap.css?v=7e05f05c7a7471367f1ce441eb2a7e65\">\n    <link rel=\"stylesheet\" href=\"/static/lib/jquery.bootstrapvalidator/bootstrapValidator.css?v=36d768f1d41ece463efa6c980a1943ef\">\n    <link rel=\"stylesheet\" href=\"/static/css/content_script.css?v=6a263ce6308d33afb0ce3aa48db65c03\">\n    <link href=\"/static/favicon.ico?v=0914c70810cc0be6f370651104d73aa8\" type=\"image/x-icon\" rel=\"shortcut icon\">\n    <script src=\"/static/lib/jquery-2.1.4.min.js?v=26aae2f13dc332df6e6f01e6657a03a0\"></script>\n    <script src=\"/static/lib/pouchdb-nightly.min.js?v=976dac5e7df3437ee5b744bb284a00f8\"></script>\n    <script src=\"/static/lib/bootstrap-3.3.7/js/bootstrap.js?v=fb81549ee2896513a1ed5714b1b1a0f0\"></script>\n    <script src=\"/static/lib/jquery.bootstrapvalidator/bootstrapValidator.js?v=806dd3c8ea2cec8f5468fee749440b76\"></script>\n    <script src=\"/static/lib/d3.v3.js?v=7b37428b3278ad908cb0d70c811b8a2f\" charset=\"UTF-8\"></script>\n    <script src=\"/static/lib/ICanHaz.js?v=636b4fb18f6e30e08927f16d4553a1f6\"></script>\n    <script src=\"/static/lib/base64.js?v=a7125a64994339841ce7b9904e78031b\"></script>\n    <link rel=\"stylesheet\" href=\"/static/css/work-style.css?v=e2d179a998a315411ce5c09521282f61\">\n    <script src=\"/static/lib/jquery.whencallsequentially.js?v=20ec80c2444aac704eda5c3a76aeacf0\"></script>\n    <script src=\"/static/scripts/ContentScript.js?v=f48bf62facfa9aec12e83aa36f9a7ece\"></script>\n    <script src=\"/static/scripts/Config.js?v=f3ed56d6889f598af48082e2d4d89706\"></script>\n    <script src=\"/static/scripts/Selector.js?v=cc989eef548ce3c24183f06bbe875fee\"></script>\n    <script src=\"/static/scripts/SelectorList.js?v=81f622d37e7fb71dfa45001f86b09c28\"></script>\n    <script src=\"/static/scripts/Selector/SelectorDetail.js?v=4dd18fef34d1b20102f6b6abad945d60\"></script>\n    <script src=\"/static/scripts/Selector/SelectorElement.js?v=fb25788cd7ead4146b00a0043f77aa88\"></script>\n    <script src=\"/static/scripts/Selector/SelectorLink.js?v=2bbaeb1b0c5ee45d807edf907c49013a\"></script>\n    <script src=\"/static/scripts/Selector/SelectorPopupLink.js?v=64330929f5e966f13aef693600e5afe7\"></script>\n    <script src=\"/static/scripts/Selector/SelectorGroup.js?v=7876f2d9c2331ce8f0ae0f5b14c843e5\"></script>\n    <script src=\"/static/scripts/Selector/SelectorText.js?v=88faa2ddb3ed07aad280bac85eba8c70\"></script>\n    <script src=\"/static/scripts/Selector/SelectorImage.js?v=afa6260a9f6bb3fe85d7bc279dd1de5f\"></script>\n    <script src=\"/static/scripts/Selector/SelectorHTML.js?v=5326546628e18d59a68a3886815d5aee\"></script>\n    <script src=\"/static/scripts/Selector/SelectorElementAttribute.js?v=f601d8c80492cad7f3dc095d47d14c5e\"></script>\n    <script src=\"/static/scripts/Selector/SelectorTable.js?v=2cc2783c68a2e9af6f1ac1c396a44604\"></script>\n    <script src=\"/static/scripts/Selector/SelectorElementScroll.js?v=d1d84b3b3375ed4721a3f84d8d63ec16\"></script>\n    <script src=\"/static/scripts/Selector/SelectorElementClick.js?v=65d3ed2098993a1230458c80d10b1a69\"></script>\n    <script src=\"/static/scripts/Sitemap.js?v=8e39948e20ae6437894996c13c958e04\"></script>\n    <script src=\"/static/scripts/SelectorGraph.js?v=ef759ccc611bed6dc31d3c2c1985da88\"></script>\n    <script src=\"/static/scripts/SelectorGraphv2.js?v=298343ad022955ae13f6bba4fb6818fe\"></script>\n    <script src=\"/static/scripts/Store.js?v=c0306e1e4bba59a0c2acc9f66ec3d79c\"></script>\n    <script src=\"/static/scripts/StoreDevtools.js?v=b3b2d74a512134879abe1b0c856c3a2e\"></script>\n    <script src=\"/static/scripts/Controller.js?v=cf1bb210876342bf75389370c2835883\"></script>\n</head>\n\n<body>\n    <nav class=\"navbar navbar-default navbar-static-top\">\n    <div class=\"container\">\n    <div class=\"navbar-header\">\n    <a class=\"navbar-brand\" href=\"/\">可视化采集平台</a>\n    </div>\n    <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n    <ul class=\"nav navbar-nav\">\n    <li><a class=\"cursor-pointer\" href=\"/\">采集任务</a></li>\n    <li><a class=\"cursor-pointer\" href=\"/add/config\">新增任务</a></li>\n    <li><a class=\"cursor-pointer\" href=\"/data\">查看数据</a></li>\n    <li><a class=\"cursor-pointer\" href=\"/read\">读取配置</a></li>\n    </ul>\n    <ul class=\"nav navbar-nav navbar-right\">\n    <li><a href=\"/help\">Help</a></li>\n    </ul>\n    </div>\n    </div>\n    </nav>\n    <div class=\"container-fluid\">\n        <div class=\"row\">\n            <ol class=\"breadcrumb\">\n                <li><a href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                <li><a href=\"{{ reverse_url('config') }}\">请求配置</a></li>\n                <li class=\"active\">参数配置</li>\n            </ol>\n            <!-- iframe主体 -->\n            <iframe name=\"collect\" src=\"https://zhongshan.china.cn/search/fisnfv.shtml\"></iframe>\n        </div>\n    </div>\n    <!-- 配置栏 -->\n    <div class=\"sidebar\"></div>\n    <script>\n//        window.CONFIG_DATA = JSON.parse('{% raw config_data %}');\n        $('iframe').css({\"width\": '100%', \"height\": \"580px\"});\n        $(function (){\n            var store = new StoreDevtools();\n            new SitemapController({\n                store: store,\n                templateDir: 'views/'\n            });\n        })\n    </script>\n</body>"
  },
  {
    "path": "server/static/spider/main.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <link rel=\"stylesheet\" href=\"/static/lib/bootstrap-3.3.7/css/bootstrap.css\">\n    <link rel=\"stylesheet\" href=\"/static/lib/jquery.bootstrapvalidator/bootstrapValidator.css\">\n    <link rel=\"stylesheet\" href=\"/static/css/devtools_scraper_panel.css\">\n    <link rel=\"stylesheet\" href=\"/static/css/content_script.css\">\n    <script src=\"/static/lib/jquery-2.1.4.min.js\"></script>\n    <script src=\"/static/lib/pouchdb-nightly.min.js\"></script>\n    <script src=\"/static/lib/bootstrap-3.3.7/js/bootstrap.js\"></script>\n    <script src=\"/static/lib/jquery.bootstrapvalidator/bootstrapValidator.js\"></script>\n    <script src=\"/static/lib/d3.v3.js\" charset=\"UTF-8\"></script>\n    <script src=\"/static/lib/ICanHaz.js\"></script>\n\n\t<script src=\"/static/scripts/BackgroundScript.js\"></script>\n    <script src=\"/static/scripts/ContentScript.js\"></script>\n    <script src=\"/static/scripts/ContentSelector.js\"></script>\n    <script src=\"/static/lib/css-selector/lib/CssSelector.js\"></script>\n\t<script src=\"/static/scripts/Config.js\"></script>\n\t<script src=\"/static/scripts/Selector.js\"></script>\n\t<script src=\"/static/scripts/SelectorList.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElement.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorLink.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorPopupLink.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorGroup.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorText.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorImage.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorHTML.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElementAttribute.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorTable.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElementScroll.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElementClick.js\"></script>\n\t<script src=\"/static/scripts/Sitemap.js\"></script>\n\t<script src=\"/static/scripts/SelectorGraph.js\"></script>\n\t<script src=\"/static/scripts/SelectorGraphv2.js\"></script>\n\t<script src=\"/static/scripts/Store.js\"></script>\n\t<script src=\"/static/scripts/StoreDevtools.js\"></script>\n\t<script src=\"/static/scripts/Controller.js\"></script>\n</head>\n\n<body>\n<div class=\"sidebar\"></div>\n<script>\n\t$(function (){\n\t\tvar store = new StoreDevtools();\n\t\tnew SitemapController({\n\t\t\tstore: store,\n\t\t\ttemplateDir: 'views/'\n\t\t})\n\t})\n</script>\n</body>"
  },
  {
    "path": "server/static/spider/start.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n <head id=\"Head1\">\n  <title>\n   联系方式，电话 - 上海山优环保科技有限开发公司\n  </title>\n  <meta content=\"上海山优环保科技有限开发公司，奉贤区四团镇安泰路605号一栋46室，钟文华\" name=\"keywords\"/>\n  <meta content=\"上海山优环保科技有限开发公司电话86--/18721793085，奉贤区四团镇安泰路605号一栋46室，为您提供不锈钢 油烟罩 厨房餐饮相关产品和服务，查找更详细上海山优环保科技有限开发公司联系方式请点击进入。专业站点成就专业网商,现在马上注册搜了网会员,满足您所有的买卖需求！\" name=\"description\"/>\n  <link href=\"https://m.51sole.com/shop/kungeina0315/companycontact.htm\" media=\"only screen and (max-width: 640px)\" rel=\"alternate\"/>\n  <meta content=\"format=xhtml;url=https://m.51sole.com/shop/kungeina0315/companycontact.htm\" name=\"mobile-agent\"/>\n  <meta content=\"format=html5;url=https://m.51sole.com/shop/kungeina0315/companycontact.htm\" name=\"mobile-agent\"/>\n  <meta content=\"no-transform \" http-equiv=\"Cache-Control\"/>\n  <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\"/>\n  <link href=\"http://style.51sole.com/css/mergecss/common.css\" rel=\"stylesheet\" type=\"text/css\"/>\n  <script type=\"text/javascript\">\n   var mobile_url = \"https://m.51sole.com/shop/kungeina0315/companycontact.htm\";\n  </script>\n  <script src=\"http://style.51sole.com/js/gomobile.js?v=20151218\" type=\"text/javascript\">\n  </script>\n  <script src=\"http://style.51sole.com/js/jquery-1.9.1.min.js\" type=\"text/javascript\">\n  </script>\n  <script src=\"http://style.51sole.com/js/mergejs/common.js\" type=\"text/javascript\">\n  </script>\n  <!--判断是否是IE-->\n  <script language=\"javascript\" type=\"text/javascript\">\n   function getOs() {\n            var OsObject = \"\";\n            if (navigator.userAgent.indexOf(\"MSIE\") > 0) {\n                return \"MSIE\";\n            }\n            if (isFirefox = navigator.userAgent.indexOf(\"Firefox\") > 0) {\n                return \"Firefox\";\n            }\n            if (isSafari = navigator.userAgent.indexOf(\"Safari\") > 0) {\n                return \"Safari\";\n            }\n            if (isCamino = navigator.userAgent.indexOf(\"Camino\") > 0) {\n                return \"Camino\";\n            }\n            if (isMozilla = navigator.userAgent.indexOf(\"Gecko/\") > 0) {\n                return \"Gecko\";\n            }\n\n        }\n  </script>\n  <script type=\"text/javascript\">\n   function closediv() {\n            document.getElementById(\"close1\").style.display = \"none\";\n        }\n        function yangzm() {\n            SetCookie(\"imgyzm\");\n            if (document.getElementById(\"imgyangzm\").innerHTML == \"\") {\n                var cook = GetCookie(\"imgyzm\");\n                document.getElementById(\"imgyangzm\").innerHTML = \"<img id=\\\"imgVerify\\\" src=\\\"VerifyCode.aspx?cook=\" + cook + \"\\\" width=\\\"72\\\" height=\\\"23\\\" alt=\\\"图片\\\"  />\";\n                document.getElementById(\"huanyzm\").style.display = \"\";\n            }\n        }\n\n        function shuayangzm() {\n            SetCookie(\"imgyzm\");\n            var cook = GetCookie(\"imgyzm\");\n            document.getElementById(\"imgVerify\").src = \"VerifyCode.aspx?cook=\" + cook + \"&tt=\" + new Date();\n        }\n\n        function SetCookie(name) {\n            var Days = 7;\n            var exp = new Date();\n            exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);\n            document.cookie = name + \"=\" + escape(Math.random()) + \";expires=\" + exp.toGMTString();\n        }\n\n        function GetCookie(name) {\n            var arr = document.cookie.match(new RegExp(\"(^| )\" + name + \"=([^;]*)(;|$)\"));\n            if (arr != null)\n                return unescape(arr[2]);\n            return null;\n        }\n  </script>\n  <link href=\"http://style.51sole.com/template/css/2.css\" rel=\"stylesheet\" type=\"text/css\"/>\n  <link href=\"http://style.51sole.com/css/index_login_top.css\" rel=\"stylesheet\" type=\"text/css\"/>\n  <script type=\"text/javascript\">\n   function navigation() {\n            document.getElementById(\"LI2\").className = \"sel\";\n        }\n        function changeBodyBG() {\n            document.body.style.background = bodybackground;\n        }\n        function clear1(obj) {\n            if (obj == \"输入产品关键字\") {\n                document.getElementById(\"keyword\").value = \"\";\n            }\n        }\n        function maxWHT(img) {\n            var vWidth = img.width;\n            var vHeight = img.height;\n            if (vWidth > vHeight) {\n                img.width = 100;\n                img.height = vHeight / vWidth * 100;\n                img.style.marginTop = (100 - img.height) / 2;\n            } else if (vWidth < vHeight) {\n                img.height = 100;\n                img.width = vWidth / vHeight * 100;\n                img.style.marginTop = 0;\n            } else {\n                img.width = 100;\n                img.height = 100;\n                img.style.marginTop = 0;\n            }\n        }\n        function setSel(obj) {\n            if (obj.id != \"LI2\") {\n                obj.className = \"sel\";\n            }\n        }\n        function cancelsel(obj) {\n            if (obj.id != \"LI2\") {\n                obj.className = \"\";\n            }\n        }\n\n        function onBluse(obj) {\n            if (obj.value == \"\") {\n                obj.value = \"输入产品关键字\";\n            }\n        }\n        function changundertone() {\n            document.getElementById(\"container\").style.background = undertone;\n        }\n\n        function checkinput() {\n            if (document.getElementById(\"txtTitle\").value == \"\") {\n                alert(\"请您输入标题！\");\n                document.getElementById(\"txtTitle\").focus();\n                return false;\n            }\n            if (document.getElementById(\"txtContent\").value == \"\") {\n                alert(\"请您输入咨询内容！\");\n                document.getElementById(\"txtContent\").focus();\n                return false;\n            }\n            if (document.getElementById(\"txtPersonName\").value == \"\") {\n                alert(\"请您输入姓名！\");\n                document.getElementById(\"txtPersonName\").focus();\n                return false;\n            }\n            if (document.getElementById(\"txtTel\").value == \"\") {\n                alert(\"请您输入电话！\");\n                document.getElementById(\"txtTel\").focus();\n                return false;\n            }\n            //if (document.getElementById(\"txtValidator_new_3_1\").value == \"\" || document.getElementById(\"txtValidator_new_3_1\").value == \"点此获取验证码\") {\n            //    alert(\"请您输入验证码！\");\n            //    document.getElementById(\"txtValidator_new_3_1\").focus();\n            //    return false;\n            //}\n\n            return true;\n        }\n\n\n        function SubmitData() {\n            if (!checkinput()) {\n                return;\n            }\n            ajax({\n                url: 'ContactHandler.ashx',\n                data: {\n                    op: \"submit\", title: document.getElementById(\"txtTitle\").value, personname: document.getElementById(\"txtPersonName\").value,\n                    username: \"kungeina0315\", tel: document.getElementById(\"txtTel\").value, content: document.getElementById(\"txtContent\").value,\n                    accountid: \"3143108\"\n                },\n                success: function (obj) {\n                    var json = eval(\"(\" + obj + \")\");\n                    if (json.result === \"false\") {\n                        alert(json.Message);\n                    } else {\n                        alert(json.Message);\n                        window.location.href = \"http://\" + \"kungeina0315\" + \".51sole.com/companycontact.htm\"\n                    }\n                }\n            });\n        }\n\n        function ajax(opts) {\n            //一.设置默认参数\n            var defaults = {\n                method: 'POST',\n                url: '',\n                data: '',\n                async: true,\n                cache: true,\n                contentType: 'application/x-www-form-urlencoded',\n                success: function () { },\n                error: function () { }\n            };\n\n            //二.用户参数覆盖默认参数    \n            for (var key in opts) {\n                defaults[key] = opts[key];\n            }\n\n            //三.对数据进行处理\n            if (typeof defaults.data === 'object') {    //处理 data\n                var str = '';\n                var value = '';\n                for (var key in defaults.data) {\n                    value = defaults.data[key];\n                    if (defaults.data[key].indexOf('&') !== -1) value = defaults.data[key].replace(/&/g, escape('&'));   //对参数中有&进行兼容处理\n                    if (key.indexOf('&') !== -1) key = key.replace(/&/g, escape('&'));   //对参数中有&进行兼容处理\n                    str += key + '=' + value + '&';\n                }\n                defaults.data = str.substring(0, str.length - 1);\n            }\n\n            defaults.method = defaults.method.toUpperCase();    //处理 method\n\n            defaults.cache = defaults.cache ? '' : '&' + new Date().getTime();//处理 cache\n\n            if (defaults.method === 'GET' && (defaults.data || defaults.cache)) defaults.url += '?' + defaults.data + defaults.cache;    //处理 url    \n\n            //四.开始编写ajax\n            //1.创建ajax对象\n            var oXhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');\n            //2.和服务器建立联系，告诉服务器你要取什么文件\n            oXhr.open(defaults.method, defaults.url, defaults.async);\n            //3.发送请求\n            if (defaults.method === 'GET')\n                oXhr.send(null);\n            else {\n                oXhr.setRequestHeader(\"Content-type\", defaults.contentType);\n                oXhr.send(defaults.data);\n            }\n            //4.等待服务器回应\n            oXhr.onreadystatechange = function () {\n                if (oXhr.readyState === 4) {\n                    if (oXhr.status === 200)\n                        defaults.success.call(oXhr, oXhr.responseText);\n                    else {\n                        defaults.error();\n                    }\n                }\n            };\n        }\n\n        var flag = false;\n        var flag1 = false;\n        var flag2 = false;\n        var flag3 = false;\n        function Block() {\n            var div = document.getElementById(\"pop2\");\n            //var div1=document.getElementById(\"pop1\");\n            var div2 = document.getElementById(\"pop3\");\n            //div1.style.display=\"none\";\n            div2.style.display = \"none\";\n            if (!flag) {\n                div.style.display = \"block\";\n                flag = true;\n                flag1 = false;\n                flag2 = false;\n                flag3 = false;\n            }\n            else {\n                div.style.display = \"none\";\n                flag = false;\n\n\n            }\n        }\n        function Block1() {\n            var div = document.getElementById(\"pop1\");\n            //var div1=document.getElementById(\"pop2\");\n            var div2 = document.getElementById(\"pop3\");\n            var div3 = document.getElementById(\"pop4\");\n            //div1.style.display=\"none\";\n            div2.style.display = \"none\";\n            div3.style.display = \"none\";\n            if (!flag1) {\n                div.style.display = \"block\";\n                flag1 = true;\n                flag = false;\n                flag2 = false;\n                flag3 = false;\n            }\n            else {\n                div.style.display = \"none\";\n                flag1 = false;\n            }\n        }\n\n        function Block2() {\n            var div = document.getElementById(\"pop1\");\n            //var div1=document.getElementById(\"pop2\");\n            var div2 = document.getElementById(\"pop3\");\n            var div3 = document.getElementById(\"pop4\");\n            div.style.display = \"none\";\n            div3.style.display = \"none\";\n            //div1.style.display=\"none\";\n            if (!flag2) {\n                div2.style.display = \"block\";\n                flag2 = true;\n                flag1 = false;\n                flag = false;\n                flag3 = false;\n            }\n            else {\n                div2.style.display = \"none\";\n                flag2 = false;\n            }\n        }\n        function Block3() {\n            var div0 = document.getElementById(\"pop1\");\n            var div2 = document.getElementById(\"pop3\");\n            var div = document.getElementById(\"pop4\");\n            div0.style.display = \"none\";\n            div2.style.display = \"none\";\n            if (!flag3) {\n                div.style.display = \"block\";\n                flag3 = true;\n                flag2 = false;\n                flag1 = false;\n                flag = false;\n            }\n            else {\n                div.style.display = \"none\";\n                flag3 = false;\n            }\n        }\n\n        function None(id) {\n            document.getElementById(id).style.display = \"none\";\n        }\n  </script>\n  <script type=\"text/javascript\">\n   var bodybackground = \"\";\n        var undertone = \"#ffffff\"\n  </script>\n  <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n   <script language=\"javaScript\">\n    function search() {\n            var userName = 'kungeina0315';\n            var _IsRightDo = 'False';\n            search1(userName, _IsRightDo);\n        }\n   </script>\n   <script type=\"text/javascript\">\n    var xmlhttp;\n        function loginout() {\n\n            xmlhttp = null;\n            if (window.XMLHttpRequest) {// code for Firefox, Opera, IE7, etc.\n                xmlhttp = new XMLHttpRequest();\n            }\n            else if (window.ActiveXObject) {// code for IE6, IE5\n                xmlhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n            }\n            if (xmlhttp != null) {\n\n                xmlhttp.onreadystatechange = state_Change;\n                xmlhttp.open(\"GET\", \"loginout.ashx\", true);\n                xmlhttp.send(null);\n            }\n            else {\n                alert(\"Your browser does not support XMLHTTP.\");\n            }\n        }\n        function state_Change() {\n            if (xmlhttp.readyState == 4) {// 4 = \"loaded\"\n                if (xmlhttp.status == 200) {// 200 = \"OK\"\n                    window.location = window.location;\n                }\n                else {\n                    alert(\"error\");\n                }\n            }\n        }\n   </script>\n   <meta content=\"MSHTML 6.00.3790.3064\" name=\"GENERATOR\">\n   </meta>\n  </meta>\n  <meta content=\"never\" name=\"referrer\"/>\n </head>\n <body>\n  <div id=\"login_top\">\n   <div class=\"topbar\" id=\"forFlashAD1\">\n    <div class=\"mainservice\">\n     <ul>\n      <li>\n       <a class=\"top_pro_c\" href=\"http://ywt.51sole.com/\" rel=\"nofollow\" title=\"一网通\">\n        一网通\n       </a>\n      </li>\n      <li>\n       <a class=\"top_pro_c\" href=\"http://user.51sole.com\" title=\"会员中心\">\n        会员中心\n       </a>\n      </li>\n      <li>\n       <a class=\"top_pro_c\" href=\"javascript:Block1()\" target=\"_self\" title=\"搜了服务\">\n        搜了服务\n       </a>\n      </li>\n      <li>\n       <a class=\"top_pro_c\" href=\"http://www.51sole.com/sitemap.htm\" style=\"padding-left: 5px\" title=\"网站导航\">\n        网站导航\n       </a>\n      </li>\n     </ul>\n    </div>\n    <div class=\"allservice\" id=\"popctrl\">\n     <a class=\"home\" href=\"http://www.51sole.com/\">\n     </a>\n     您好，欢迎来到搜了网\n     <a class=\"nobg\" href=\"http://user.51sole.com\" rel=\"nofollow\">\n      [请登录]\n     </a>\n     <a class=\"nobg\" href=\"http://reg.51sole.com/?From=http%3a%2f%2fkungeina0315.51sole.com%2fCompanyContact.aspx%3fUserName%3dkungeina0315\" rel=\"nofollow\">\n      [免费注册]\n     </a>\n    </div>\n    <script type=\"text/javascript\">\n     message1();\n    </script>\n    <div class=\"cl\">\n    </div>\n    <div class=\"toppop\" id=\"pop1\" style=\"display: none;\">\n     <ul>\n      <li>\n       <a href=\"http://e.51sole.com/\" title=\"行业目录\">\n        行业目录\n       </a>\n      </li>\n      <li>\n       <a href=\"http://www.51sole.com/company/\" title=\"企业库\">\n        企业库\n       </a>\n      </li>\n      <li>\n       <a href=\"http://news.51sole.com/\" title=\"资讯\">\n        资讯\n       </a>\n      </li>\n      <li>\n       <a href=\"http://exh.51sole.com/\" title=\"展会\">\n        展会\n       </a>\n      </li>\n     </ul>\n    </div>\n    <div class=\"toppop1\" id=\"pop3\" style=\"display: none;\">\n    </div>\n    <div class=\"toppop\" id=\"pop4\" style=\"display: none;\">\n    </div>\n   </div>\n  </div>\n  <!--头部搜了网链接 end-->\n  <a href=\"#\" id=\"a_HomePage\" onclick=\"javascript:this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.51sole.com/');return false;\">\n  </a>\n  <div id=\"middlelayout\">\n   <div id=\"namelogo\">\n    <h1 style=\"margin: 0px; padding: 0px;\">\n     <p class=\"chinesename mL0 noData_gsm \" style=\"font-weight: normal; font-size: 24px; color: #f60; font-family: 微软雅黑; font-style: normal\">\n      上海山优环保科技有限开发公司\n     </p>\n    </h1>\n    <h2 class=\"zyhtTxt left0\">\n     主营产品：不锈钢 油烟罩 厨房餐饮\n    </h2>\n   </div>\n   <div id=\"menulist\">\n    <ul class=\"columnlist\">\n     <li id=\"homepage\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/\">\n       首页\n      </a>\n     </li>\n     <li id=\"LI1\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companyabout.htm\">\n       公司介绍\n      </a>\n     </li>\n     <li id=\"product\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companyproduct.htm\">\n       产品展厅\n      </a>\n     </li>\n     <li id=\"photos\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companyphotos.htm\">\n       公司相册\n      </a>\n     </li>\n     <li id=\"sell\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companysupply.htm\">\n       最新供应\n      </a>\n     </li>\n     <li id=\"aboutuscomp\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companypurchase.htm\">\n       求购信息\n      </a>\n     </li>\n     <li id=\"paper\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companyhonours.htm\">\n       资质证书\n      </a>\n     </li>\n     <li id=\"complink\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companynews.htm\">\n       新闻资讯\n      </a>\n     </li>\n     <li id=\"LI2\" onmouseout=\"cancelsel(this)\" onmouseover=\"setSel(this)\">\n      <a href=\"http://kungeina0315.51sole.com/companycontact.htm\">\n       联系我们\n      </a>\n     </li>\n    </ul>\n   </div>\n   <div id=\"theme_pic\" style=\"width: 960px; background: none;\">\n    <a href=\"http://www.51sole.com/activity/catalog/\">\n     <img alt=\"\" border=\"0\" src=\"http://web.img.51sole.com/upfiles/20170605101246.jpg\"/>\n    </a>\n   </div>\n  </div>\n  <div id=\"content1\">\n   <div id=\"productnav\">\n    <h3>\n     产品系列\n    </h3>\n    <div class=\"navdiv\">\n     <ul>\n      <li>\n       <a class=\"tw_c\" href=\"http://kungeina0315.51sole.com/productseries_6037357.htm\" title=\"不锈钢\">\n        不锈钢\n       </a>\n      </li>\n      <li>\n       <a class=\"tw_c\" href=\"http://kungeina0315.51sole.com/productseries_6037358.htm\" title=\"厨房餐饮\">\n        厨房餐饮\n       </a>\n      </li>\n      <li>\n       <a class=\"tw_c\" href=\"http://kungeina0315.51sole.com/productseries_6037760.htm\" title=\"油烟罩\">\n        油烟罩\n       </a>\n      </li>\n     </ul>\n     <ul>\n      <div style=\"clear:both\">\n      </div>\n      <div style=\"float:right; margin-top:6px; margin-right:6px; height:14px; line-height:14px; padding:0 10px; background:url(Template/Images/list_xlicon.gif) no-repeat right\">\n       <a href=\"http://kungeina0315.51sole.com/companyproduct.htm\">\n        <b>\n         更多\n        </b>\n       </a>\n      </div>\n      <div style=\"clear:both\">\n      </div>\n     </ul>\n    </div>\n   </div>\n   <div style=\"margin-bottom: 8px;\">\n    <script src=\"http://1.51sole.cn/hn3a1ec798f5cdf13bdb4c3edef0ed38e350acde0a.js\" type=\"text/javascript\">\n    </script>\n   </div>\n   <div class=\"search\">\n    <ul>\n     <li class=\"search_tit\">\n      站内搜索\n     </li>\n     <li class=\"search_cont\">\n      <span>\n       <input class=\"search_input\" id=\"keyword\" name=\"keyword\" onblur=\"onBluse(this);\" onclick=\"clear1(this.value)\" type=\"text\" value=\"输入产品关键字\"/>\n      </span>\n      <span>\n       <input class=\"seek\" onclick=\"    search(); return false;\" type=\"submit\" value=\"\"/>\n      </span>\n     </li>\n    </ul>\n   </div>\n   <div id=\"msgbox\">\n   </div>\n   <div id=\"maps\">\n    <a class=\"attacha\" href=\"http://kungeina0315.51sole.com/companymap.htm\" style=\"display: block; width: 126px; height: 26px\">\n     企业电子地图\n    </a>\n   </div>\n   <div id=\"video\">\n    <a class=\"attacha\" href=\"http://kungeina0315.51sole.com/companyvideo.htm\" style=\"display: block; width: 126px; height: 26px\">\n     企业视频展示\n    </a>\n   </div>\n   <div id=\"words\">\n    <a class=\"attacha\" href=\"http://kungeina0315.51sole.com/companycontact.htm\" style=\"display: block; width: 126px; height: 26px\">\n     在线给我留言\n    </a>\n   </div>\n   <div style=\"margin-bottom: 8px;\">\n    <script src=\"http://1.51sole.cn/hn3a1ec798f5cdf13bdb4c3edef0ed38e350acde0a.js\" type=\"text/javascript\">\n    </script>\n   </div>\n   <div id=\"navcontact\">\n    <h3>\n     联系方式\n    </h3>\n    <ul>\n     <li>\n      <b>\n       上海山优环保科技有限开发公司\n      </b>\n     </li>\n     <li>\n      <i>\n       地址：\n      </i>\n      <span>\n       上海南汇区奉贤区四团镇安泰路605号一栋46室\n      </span>\n     </li>\n     <li>\n      <i>\n       联系人：\n      </i>\n      <span>\n       钟文华\n      </span>\n     </li>\n     <li>\n      <i>\n       电话：\n      </i>\n      <span>\n       -\n      </span>\n     </li>\n     <li>\n      <i>\n       手机：\n      </i>\n      <span>\n       18721793085\n      </span>\n     </li>\n     <li>\n      <i>\n       QQ：\n      </i>\n      <span>\n       <a href=\"tencent://message/?uin=1512206950&amp;Site=有事Q我&amp;Menu=yes\" rel=\"nofollow\">\n        1512206950\n       </a>\n      </span>\n     </li>\n    </ul>\n    <div class=\"more\">\n     <img alt=\"\" src=\"//kungeina0315.51sole.com/Template/images/arrow_more.gif\"/>\n     <a href=\"http://kungeina0315.51sole.com/companyabout.htm\">\n      详细信息\n     </a>\n    </div>\n   </div>\n  </div>\n  <div id=\"content2\">\n   <div id=\"sitewhere\">\n    您现在的位置：\n    <a href=\"http://www.51sole.com/\">\n     首页\n    </a>\n    &gt;\n    <a href=\"http://kungeina0315.51sole.com/\">\n     上海山优环保科技有限开发公司\n    </a>\n    &gt;\n    <strong>\n     联系我们\n    </strong>\n   </div>\n   <div style=\"width: 760px; margin: 10px 0\">\n    <script src=\"http://1.51sole.cn/zf3a1dc393ffccf73ddb4c3edef0ed38e350acde0a.js\" type=\"text/javascript\">\n    </script>\n   </div>\n   <div id=\"contact\">\n    <h3>\n     <span class=\"left\">\n     </span>\n     <span class=\"stitle\">\n      联系我们\n     </span>\n     <span class=\"right\">\n     </span>\n    </h3>\n    <ul>\n     <li>\n      公　　司：　上海山优环保科技有限开发公司\n     </li>\n     <li>\n      地　　址：　上海南汇区奉贤区四团镇安泰路605号一栋46室\n     </li>\n     <li>\n      邮　　编：　200000\n     </li>\n     <li>\n      电　　话：　-\n     </li>\n     <li>\n      手　　机：　18721793085\n     </li>\n     <li>\n      邮　　箱：\n     </li>\n     <li>\n      联系人　：　钟文华\n     </li>\n     <li>\n      ＱＱ　　：\n      <a href=\"tencent://message/?uin=1512206950&amp;Menu=yes\">\n       1512206950\n      </a>\n     </li>\n     <li>\n      公司网站：\n      <a href=\"http://kungeina0315.51sole.com\">\n       http://kungeina0315.51sole.com\n      </a>\n      <br/>\n     </li>\n    </ul>\n   </div>\n   <div id=\"sendto\">\n    <h3>\n     <span class=\"left\">\n     </span>\n     <span class=\"stitle\">\n      发送联系信\n     </span>\n     <span class=\"right\">\n     </span>\n    </h3>\n    <form action=\"/companycontact.htm\" id=\"form1\" method=\"post\" name=\"form1\" style=\"font-family: '宋体';\">\n     <div>\n      <input id=\"__VIEWSTATE\" name=\"__VIEWSTATE\" type=\"hidden\" value=\"/wEPDwULLTEyMDAyNzE1MDNkZA==\"/>\n     </div>\n     <ul style=\"padding-bottom: 0px;\">\n      <li>\n       联 系 人：钟文华\n      </li>\n      <li>\n       标　　题：\n       <input id=\"txtTitle\" name=\"txtTitle\" style=\"width:420px;\" type=\"text\"/>\n      </li>\n      <li>\n       <div style=\"float: left;\">\n        咨询内容：\n       </div>\n       <textarea cols=\"20\" id=\"txtContent\" name=\"txtContent\" rows=\"8\" style=\"width:420px;margin-left:0\"></textarea>\n      </li>\n     </ul>\n     <ul style=\"padding-top: 0px;\">\n      <li>\n       您的姓名：\n       <input id=\"txtPersonName\" name=\"txtPersonName\" style=\"width:168px;\" type=\"text\"/>\n       您的电话：\n       <input id=\"txtTel\" name=\"txtTel\" style=\"width:168px;\" type=\"text\"/>\n      </li>\n      <li style=\"height: 23px; display: none;\">\n       验证码：\n       <input id=\"txtValidator_new_3_1\" name=\"txtValidator_new_3_1\" onfocus=\"yangzm();if(this.value == '点此获取验证码'){this.value='';this.className='input_show1'}\" style=\"width: 140px;\" type=\"text\" value=\"点此获取验证码\"/>\n       <span id=\"imgyangzm\">\n       </span>\n       <span id=\"huanyzm\" style=\"display: none\">\n        如果看不清\n        <a onclick=\"javascript:shuayangzm();\" style=\"cursor: pointer;\">\n         <span style=\"color: #1166AD;\">\n          换一张\n         </span>\n        </a>\n       </span>\n      </li>\n     </ul>\n     <input class=\"sendbut\" onclick=\"SubmitData()\" type=\"button\" value=\"发 送\"/>\n    </form>\n   </div>\n   <div style=\"margin: 10px 0\">\n    <script type=\"text/javascript\">\n     /*商铺底部广告位*/\n                    var cpro_id = \"u1438594\"; baiduA();\n    </script>\n   </div>\n  </div>\n  <div style=\"clear:both; width:960px; margin:5px auto;overflow:hidden\">\n   <script src=\"http://1.51sole.cn/yr3a1ece96feccfe3adb4c3edef0ed38e350acde0a.js\" type=\"text/javascript\">\n   </script>\n  </div>\n  <div id=\"DIV1\">\n   <div id=\"footer\">\n    <div class=\"botwidth\">\n     <!--底部搜了网链接-->\n     <!--底部搜了网链接 end-->\n     <div class=\"botmenu\">\n      <a href=\"http://www.51sole.com/nanhui/\" title=\"南汇区企业名录\">\n       南汇区黄页网\n      </a>\n      |\n      <a href=\"http://www.51sole.com/nanhui-zhongcanguan/\" title=\"南汇区中餐馆公司\">\n       南汇区中餐馆企业名录\n      </a>\n      |\n      <a href=\"http://kungeina0315.51sole.com/companyproduct.htm\">\n       产品展厅\n      </a>\n      |\n      <a href=\"http://kungeina0315.51sole.com/companysupply.htm\">\n       最新供应\n      </a>\n      <!--|&nbsp;<a href=\"http://kungeina0315.51sole.com/companyhonours.htm\">资质证书</a>-->\n      |\n      <a href=\"http://kungeina0315.51sole.com/companynews.htm\">\n       新闻资讯\n      </a>\n      |\n      <a href=\"http://kungeina0315.51sole.com/newcompro.htm\">\n       产品地图\n      </a>\n      |\n      <a href=\"http://www.51sole.com/promisesp/promisesp.htm\" rel=\"nofollow\">\n       免责声明\n      </a>\n      |\n      <a href=\"http://feedback.51sole.com/\" rel=\"nofollow\">\n       <font color=\"red\">\n        删除/修改信息\n       </font>\n      </a>\n     </div>\n    </div>\n    <div id=\"legoobt\">\n     <a href=\"http://www.51sole.com/company/detail_11234943.html\">\n      上海山优环保科技有限开发公司\n     </a>\n     技术支持：\n     <a href=\"http://www.51sole.com/\">\n      搜了网\n     </a>\n    </div>\n   </div>\n  </div>\n  <script language=\"javascript\">\n   changeBodyBG();\n            //changundertone();\n            navigation();\n  </script>\n  <!--对联广告  -->\n  <script language=\"JavaScript\" src=\"//kungeina0315.51sole.com/ascx/coupletadutf-8.aspx?UserName=kungeina0315\" type=\"text/javascript\">\n  </script>\n  <!--搜了客服  -->\n  <script charset=\"UTF-8\" src=\"//kungeina0315.51sole.com/ascx/onlineservice.ashx?aid=3143108&amp;scg=1\" type=\"text/javascript\">\n  </script>\n  <script type=\"text/javascript\">\n   function w(vd) {\n                var ob = document.getElementById(vd);\n                if (ob.style.display == \"block\" || ob.style.display == \"\") {\n                    ob.style.display = \"none\";\n                    var ob2 = document.getElementById('s' + vd);\n                    ob2.style.backgroundImage = \"url(http://style.51sole.com/template/images/ico080426_open.gif)\";\n                }\n                else {\n                    ob.style.display = \"block\";\n                    var ob2 = document.getElementById('s' + vd);\n                    ob2.style.backgroundImage = \"url(http://style.51sole.com/template/images/ico080426_close.gif)\";\n                }\n            }\n  </script>\n  <script type=\"text/javascript\">\n   var tid = \"3143108\";\n            var tun = \"kungeina0315\";\n            outputSta();\n  </script>\n  <script>\n   var baiduImagePlus = {\n                noLogo: true,\n                unionId: 'u2372570',\n                formList: [{ formId: 10 }, { formId: 2 }]\n            };\n  </script>\n  <script src=\"http://cpro.baidustatic.com/cpro/ui/i.js\">\n  </script>\n  <script type=\"text/javascript\">\n   var tj_id = 0, tj_type = 1, _userID=3143108;\n  </script>\n  <script src=\"http://style.51sole.com/shop/js/tj.js?v=20161031\" type=\"text/javascript\">\n  </script>\n  <div class=\"51la\" style=\"display: none;\">\n   <script type=\"text/javascript\">\n    baiduB();\n   </script>\n  </div>\n  <script src=\"http://localhost:9999/static/lib/jquery-2.1.4.min.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/scripts/ContentSelector.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/lib/css-selector/lib/CssSelector.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/scripts/ElementQuery.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/scripts/DataExtractor.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/lib/sugar-1.4.1.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/lib/jquery.whencallsequentially.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/lib/jquery.mloading.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/scripts/UniqueElementList.js\">\n  </script>\n  <script src=\"http://localhost:9999/static/lib/ajaxhook.js\">\n  </script>\n  <link href=\"http://localhost:9999/static/lib/bootstrap-3.3.7/css/bootstrap.css\" rel=\"stylesheet\"/>\n  <link href=\"http://localhost:9999/static/css/content_script.css\" rel=\"stylesheet\"/>\n  <link href=\"http://localhost:9999/static/css/jquery.mloading.css\" rel=\"stylesheet\"/>\n  <script>\n   $('*').bind('click.custom', function(event){\n            event.preventDefault();\n            if (/sitemap-select/.test($(event.currentTarget).attr('class'))){\n                return false;\n            }\n            if (event.target.nodeName.toLowerCase() == 'a'){\n                // 深拷贝\n                $(\"body\").mLoading(\"show\");\n                var params = JSON.parse(JSON.stringify(parent.CONFIG_DATA))\n                params.url = event.currentTarget.href;\n                params.header = JSON.stringify(params.header)\n                params.cookie = JSON.stringify(params.cookie)\n                params.form = JSON.stringify(params.form)\n                $.ajax({\n                    url: \"http://localhost:9999/add/next\",\n                    type: \"post\",\n                    data: params\n                }).done(function (data){\n                    location.reload();\n                }).fail(function (data){\n                    console.log(data);\n                }).always(function (){\n                    $(\"body\").mLoading(\"hide\");\n                })\n            }\n            return false;\n        });\n  </script>\n  <script>\n   hookAjax({\n            open: function(arg){\n                return arg[1] == 'http://localhost:9999/add/next' ?  false : true;\n            } \n        });\n  </script>\n </body>\n</html>\n"
  },
  {
    "path": "server/static/spider/test.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"/static/css/base/bootstrap.min.css?v=6af1885cfeca34a0aacae8e8d4922ea2\" rel=\"stylesheet\">\n    <script src=\"/static/js/base/jquery-2.1.4.min.js?v=26aae2f13dc332df6e6f01e6657a03a0\"></script>\n    <script src=\"/static/js/base/bootstrap.min.js?v=04c84852e9937b142ac73c285b895b85\"></script>\n    <link href=\"/static/favicon.ico?v=0914c70810cc0be6f370651104d73aa8\" type=\"image/x-icon\" rel=\"shortcut icon\">\n    <link href=\"/static/css/base.css?v=78a02d47baba7cef2cebe3f27d15c0e8\" rel=\"stylesheet\">\n        <script src=\"/static/js/work.js\"></script>\n    <link href=\"/static/css/work-style.css\" rel=\"stylesheet\">\n</head>\n\n<body>\n    <nav class=\"navbar navbar-default navbar-static-top\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\">\n                    <span class=\"sr-only\">Toggle navigation</span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">Tornado-Scrapy</a>\n            </div>\n\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                <ul class=\"nav navbar-nav\">\n                    <li><a class=\"cursor-pointer\" href=\"/\">采集任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"/add/config\">新增任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"/data\">采集数据</a></li>\n                </ul>\n                <ul class=\"nav navbar-nav navbar-right\">\n                    <li><a id=\"arachnado-connection-monitor\"></a></li>\n                    <li id=\"arachnado-process-stats\"></li>\n                    <li><a href=\"{{ reverse_url('help') }}\">Help</a></li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n    <div class=\"container\">\n        <div class=\"row\">\n            <ol class=\"breadcrumb\">\n                <li><a href=\"/\">采集任务</a></li>\n                <li><a href=\"/add/config\">请求配置</a></li>\n                <li class=\"active\">参数配置</li>\n            </ol>\n            <!-- iframe主体 -->\n            <iframe name=\"collect\" src=\"/static/spider/start.html\"></iframe>\n        </div>\n    </div>\n    <!-- 配置栏 -->\n    <div class=\"sidebar\">\n        <!-- 自由拖动 -->\n        <div class=\"expander\"></div>\n        <!-- 面包屑导航 -->\n        <ol class=\"breadcrumb\">\n            <li><a href=\"#\">_root</a></li>\n        </ol>\n        <table class=\"table table-bordered table-condensed\">\n            <thead>\n                <tr>\n                    <th>名称</th>\n                    <th>选择器</th>\n                    <th>类型</th>\n                    <th>是否选择列</th>\n                    <th>父容器</th>\n                    <th>选项</th>\n                </tr>\n            </thead>\n            <tbody id=\"save-sel\">\n            </tbody>\n        </table>\n        <button type=\"button\" class=\"btn btn-info btn-xs\" onclick=\"iframe_mouse_event()\">新增选择器</button>\n    </div>\n    <!-- 浮动框 -->\n    <div class=\"float-frame\">\n        <div class=\"show-element\">\n            <div>\n                <span id=\"path\"></span>\n                <button class=\"glyphicon glyphicon-arrow-right button\" id=\"button-position\"></button>\n            </div>\n            <div class=\"attribute\" id=\"attr\">\n                <span>content: </span>\n                <span></span>\n            </div>\n        </div>\n    </div>\n    <!-- 弹窗 -->\n    <div class=\"select-view\">\n        <div class=\"row-float row\">\n            <button type=\"button\" class=\"btn-custom btn-close\">\n                <span class=\"glyphicon glyphicon-off\"></span>\n            </button>\n        </div>\n        <div class=\"row-float\">\n            <form class=\"form-horizontal\">\n                <fieldset>\n                    <div class=\"form-group\">\n                        <label for=\"select-name\" class=\"col-lg-2 control-label\">字段名称</label>\n                        <div class=\"col-lg-10\">\n                            <input type=\"text\" class=\"form-control\" value=\"\" id=\"select-name\" data-container=\"body\" data-toggle=\"popover\" data-content=\"名称不为空\" data-placement=\"bottom\" data-trigger=\"manual\" data-off=\"\">\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"select-form\" class=\"col-lg-2 control-label\">attr</label>\n                        <div class=\"col-lg-10\">\n                            <select class=\"form-control\" id=\"select-form\"></select>\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"select-value\" class=\"col-lg-2 control-label\">value</label>\n                        <div class=\"col-lg-10\">\n                            <p id=\"select-value\"></p>\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"select-input\" class=\"col-lg-2 control-label\">css选择器</label>\n                        <div class=\"col-lg-10\">\n                            <input type=\"text\" class=\"form-control\" value=\"\" id=\"select-input\">\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"multiple\" class=\"col-lg-2 control-label\">列表多选</label>\n                        <div class=\"col-lg-10\">\n                            <input type=\"checkbox\" id=\"multiple\">\n                        </div>\n                    </div>\n                </fieldset>\n            </form>\n        </div>\n        <div class=\"row-float\">\n            <button type=\"button\" class=\"btn-done\" onclick=\"save_select()\"><span class=\"glyphicon glyphicon-ok\"></span>确定</button>\n        </div>\n    </div>\n</body>"
  },
  {
    "path": "server/static/spider/work.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link rel=\"stylesheet\" href=\"/static/lib/bootstrap-3.3.7/css/bootstrap.css\">\n    <link rel=\"stylesheet\" href=\"/static/lib/jquery.bootstrapvalidator/bootstrapValidator.css\">\n    <!--<link rel=\"stylesheet\" href=\"/static/css/devtools_scraper_panel.css\">-->\n    <link rel=\"stylesheet\" href=\"/static/css/content_script.css\">\n    <link href=\"/static/favicon.ico\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <!--<script src=\"/static/lib/jquery-2.1.4.min.js\"></script>-->\n    <script src=\"/static/lib/jquery-2.0.3.js\"></script>\n    <script src=\"/static/lib/pouchdb-nightly.min.js\"></script>\n    <script src=\"/static/lib/bootstrap-3.3.7/js/bootstrap.js\"></script>\n    <script src=\"/static/lib/jquery.bootstrapvalidator/bootstrapValidator.js\"></script>\n    <script src=\"/static/lib/d3.v3.js\" charset=\"UTF-8\"></script>\n    <script src=\"/static/lib/ICanHaz.js\"></script>\n    <script src=\"/static/lib/base64.js\"></script>\n    <script src=\"/static/lib/sugar-1.4.1.js\"></script>\n\n    <link rel=\"stylesheet\" href=\"/static/css/work-style.css\">\n    <!--<script src=\"/static/js/work.js\"></script>-->\n\n    <script src=\"/static/lib/jquery.whencallsequentially.js\"></script>\n    <script src=\"/static/lib/css-selector/lib/CssSelector.js\"></script>\n    <script src=\"/static/scripts/ElementQuery.js\"></script>\n    <script src=\"/static/scripts/ContentScript.js\"></script>\n    <script src=\"/static/scripts/ContentSelector.js\"></script>\n    <script src=\"/static/scripts/DataExtractor.js\"></script>\n\t<script src=\"/static/scripts/Config.js\"></script>\n\t<script src=\"/static/scripts/Selector.js\"></script>\n\t<script src=\"/static/scripts/SelectorList.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElement.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorLink.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorPopupLink.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorGroup.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorText.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorImage.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorHTML.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElementAttribute.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorTable.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElementScroll.js\"></script>\n\t<script src=\"/static/scripts/Selector/SelectorElementClick.js\"></script>\n\t<script src=\"/static/scripts/Sitemap.js\"></script>\n\t<script src=\"/static/scripts/SelectorGraph.js\"></script>\n\t<script src=\"/static/scripts/SelectorGraphv2.js\"></script>\n\t<script src=\"/static/scripts/Store.js\"></script>\n\t<script src=\"/static/scripts/StoreDevtools.js\"></script>\n\t<script src=\"/static/scripts/Controller.js\"></script>\n</head>\n\n<body>\n    <nav class=\"navbar navbar-default navbar-static-top\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\">\n                    <span class=\"sr-only\">Toggle navigation</span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">Tornado-Scrapy</a>\n            </div>\n\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                <ul class=\"nav navbar-nav\">\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('config') }}\">新增任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('data') }}\">采集数据</a></li>\n                </ul>\n                <ul class=\"nav navbar-nav navbar-right\">\n                    <li><a id=\"arachnado-connection-monitor\"></a></li>\n                    <li id=\"arachnado-process-stats\"></li>\n                    <li><a href=\"{{ reverse_url('help') }}\">Help</a></li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n    <div class=\"container-fluid\">\n        <div class=\"row\">\n            <ol class=\"breadcrumb\">\n                <li><a href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                <li><a href=\"{{ reverse_url('config') }}\">请求配置</a></li>\n                <li class=\"active\">参数配置</li>\n            </ol>\n            <!-- iframe主体 -->\n            <iframe name=\"collect\" src=\"/static/spider/start.html\"></iframe>\n        </div>\n    </div>\n    <!-- 配置栏 -->\n    <div class=\"sidebar\">\n        <!-- 自由拖动 -->\n        <!--<div class=\"expander\"></div>-->\n    </div>\n    <!-- 浮动框 -->\n    <!--<div class=\"float-frame\">-->\n        <!--<div class=\"show-element\">-->\n            <!--<div>-->\n                <!--<span id=\"path\"></span>-->\n                <!--<button class=\"glyphicon glyphicon-arrow-right button\" id=\"button-position\"></button>-->\n            <!--</div>-->\n            <!--<div class=\"attribute\" id=\"attr\">-->\n                <!--<span>content: </span>-->\n                <!--<span></span>-->\n            <!--</div>-->\n        <!--</div>-->\n    <!--</div>-->\n    <!-- 弹窗 -->\n    <!--<div class=\"select-view\"></div>-->\n    <script>\n        window.CONFIG_DATA = JSON.parse('{% raw config_data %}');\n    </script>\n    <script>\n        $(function (){\n            var store = new StoreDevtools();\n            new SitemapController({\n                store: store,\n                templateDir: 'views/'\n            });\n            $('iframe').css({\"width\": '100%', \"height\": \"580px\"});\n        })\n    </script>\n</body>"
  },
  {
    "path": "server/static/views/DataPreview.html",
    "content": "<div class=\"modal fade data-preview-modal\" tabindex=\"-1\">\n\t<div class=\"modal-dialog\">\n\t\t<div class=\"modal-content\">\n\t\t\t<div class=\"modal-header\">\n\t\t\t\t<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>\n\t\t\t\t<h4 class=\"modal-title\">数据预览</h4>\n\t\t\t</div>\n\t\t\t<div class=\"modal-body\">\n\t\t\t\t<table class=\"table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t{{#columns}}\n\t\t\t\t\t\t<th>{{.}}</th>\n\t\t\t\t\t\t{{/columns}}\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>"
  },
  {
    "path": "server/static/views/SelectorEdit.html",
    "content": "<form class=\"form-horizontal\" role=\"form\" id=\"edit-selector\">\n\n\t<div class=\"form-group\">\n\t\t<label for=\"selectorId\" class=\"col-lg-1 control-label\">字段名称</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"id\" id=\"selectorId\" placeholder=\"字段名称\" value=\"{{selector.id}}\">\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group\">\n\t\t<label for=\"type\" class=\"col-lg-1 control-label\">字段类型</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<select class=\"form-control\" id=\"type\" name=\"type\">\n\t\t\t\t{{#selectorTypes}}\n\t\t\t\t<option value=\"{{type}}\">{{title}}</option>\n\t\t\t\t{{/selectorTypes}}\n\t\t\t</select>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group\">\n\t\t<label for=\"selector\" class=\"col-lg-1 control-label\">选择器</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<div class=\"input-group\">\n\t\t\t\t  <span class=\"input-group-btn\">\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"select-selector\" type=\"button\">点击选择</button>\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"preview-selector\" type=\"button\" data-toggle=\"button\">显示元素</button>\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"preview-selector-data\" type=\"button\">数据预览</button>\n\t\t\t\t  </span>\n\t\t\t\t<input type=\"text\" class=\"form-control selector-value\" id=\"selector\" name=\"selector\" value=\"{{selector.selector}}\">\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-clickElementSelector\">\n\t\t<label for=\"clickElementSelector\" class=\"col-lg-1 control-label\">详情页选择器</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<div class=\"input-group\">\n\t\t\t\t  <span class=\"input-group-btn\">\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"select-selector\" type=\"button\">点击选择</button>\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"preview-click-element-selector\" type=\"button\" data-toggle=\"button\">显示元素</button>\n\t\t\t\t  </span>\n\t\t\t\t<input type=\"text\" class=\"form-control selector-value\" id=\"clickElementSelector\" name=\"clickElementSelector\" value=\"{{selector.clickElementSelector}}\">\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- tableHeaderSelector -->\n\t<div class=\"form-group feature feature-tableHeaderRowSelector\">\n\t\t<label for=\"tableHeaderRowSelector\" class=\"col-lg-1 control-label\">标题行选择器</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<div class=\"input-group\">\n\t\t\t\t  <span class=\"input-group-btn\">\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"select-table-header-row-selector\" type=\"button\">点击选择</button>\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"preview-table-row-selector\" type=\"button\" data-toggle=\"button\">显示元素</button>\n\t\t\t\t  </span>\n\t\t\t\t<input type=\"text\" class=\"form-control selector-value\" id=\"tableHeaderRowSelector\" name=\"tableHeaderRowSelector\" value=\"{{selector.tableHeaderRowSelector}}\">\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- tableRowSelector -->\n\t<div class=\"form-group feature feature-tableDataRowSelector\">\n\t\t<label for=\"tableDataRowSelector\" class=\"col-lg-1 control-label\">数据行选择器</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<div class=\"input-group\">\n\t\t\t\t  <span class=\"input-group-btn\">\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"select-table-data-row-selector\" type=\"button\">点击选择</button>\n\t\t\t\t\t<button class=\"btn btn-default\" action=\"preview-table-row-selector\" type=\"button\" data-toggle=\"button\">显示元素</button>\n\t\t\t\t  </span>\n\t\t\t\t<input type=\"text\" class=\"form-control selector-value\" id=\"tableDataRowSelector\" name=\"tableDataRowSelector\" value=\"{{selector.tableDataRowSelector}}\">\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- ClickType -->\n\t<div class=\"form-group feature feature-clickType\">\n\t\t<label for=\"clickType\" class=\"col-lg-1 control-label\">点击类型</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<select class=\"form-control\" id=\"clickType\" name=\"clickType\">\n\t\t\t\t<option value=\"clickOnce\">翻页 (ajax请求暂时不支持)</option>\n\t\t\t\t<option value=\"clickMore\">加载更多 (ajax请求暂时不支持)</option>\n\t\t\t</select>\n\t\t</div>\n\t</div>\n\n\t<!-- clickElementUniquenessType -->\n\t<div class=\"form-group feature feature-clickElementUniquenessType\">\n\t\t<label for=\"clickElementUniquenessType\" class=\"col-lg-1 control-label\">点击元素(唯一)</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<select class=\"form-control\" id=\"clickElementUniquenessType\" name=\"clickElementUniquenessType\">\n\t\t\t\t<option value=\"uniqueText\">文本</option>\n\t\t\t\t<option value=\"uniqueHTMLText\">HTML+文本</option>\n\t\t\t\t<option value=\"uniqueHTML\">HTML</option>\n\t\t\t\t<option value=\"uniqueCSSSelector\">CSS 选择器</option>\n\t\t\t</select>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-multiple\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<div class=\"checkbox\">\n\t\t\t\t<label>\n\t\t\t\t\t<input type=\"checkbox\" name=\"multiple\" {{#selector.multiple}}checked=\"checked\"{{/selector.multiple}}> 多元素\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- discardInitialElements -->\n\t<div class=\"form-group feature feature-discardInitialElements\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<div class=\"checkbox\">\n\t\t\t\t<label>\n\t\t\t\t\t<input type=\"checkbox\" name=\"discardInitialElements\" {{#selector.discardInitialElements}}checked=\"checked\"{{/selector.discardInitialElements}}>\n\t\t\t\t\t不保留点击元素\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- downloadImage -->\n\t<div class=\"form-group feature feature-downloadImage\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<div class=\"checkbox\">\n\t\t\t\t<label>\n\t\t\t\t\t<input type=\"checkbox\" name=\"downloadImage\" {{#selector.downloadImage}}checked=\"checked\"{{/selector.downloadImage}}> 下载图片\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-next-page\">\n\t\t<label for=\"pageUrl\" class=\"col-lg-1 control-label\">翻页url</label>\n            <div class=\"col-lg-6\">\n\t\t\t  \t<input type=\"text\" class=\"form-control\" name=\"pageUrl\" id=\"pageUrl\" placeholder=\"翻页url\" value=\"{{selector.pageUrl}}\">\n\t\t\t</div>\n\t\t\t<div class=\"col-lg-2\">\n\t\t\t  \t<input type=\"text\" class=\"form-control\" name=\"startNum\" id=\"startNum\" placeholder=\"起始页数\" value=\"{{selector.startNum}}\">\n\t\t\t</div>\n\t\t\t<div class=\"col-lg-2\">\n\t\t\t  \t<input type=\"text\" class=\"form-control\" name=\"endNum\" id=\"endNum\" placeholder=\"终止页数\" value=\"{{selector.endNum}}\">\n\t\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-regex\">\n\t\t<label for=\"regex\" class=\"col-lg-1 control-label\">正则过滤</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"regex\" id=\"regex\" placeholder=\"正则过滤\" value=\"{{selector.regex}}\">\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-extractAttribute\">\n\t\t<label for=\"extractAttribute\" class=\"col-lg-1 control-label\">属性名称</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"extractAttribute\" id=\"extractAttribute\" placeholder=\"属性名称\" value=\"{{selector.extractAttribute}}\">\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-delay\">\n\t\t<label for=\"delay\" class=\"col-lg-1 control-label\">采集间隔(毫秒)</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"delay\" id=\"delay\" placeholder=\"间隔\" value=\"{{selector.delay}}\">\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group\">\n\t\t<label for=\"parentSelectors\" class=\"col-lg-1 control-label\">父容器</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<select multiple class=\"form-control\" id=\"parentSelectors\" name=\"parentSelectors\">\n\t\t\t\t{{#selectorIds}}\n\t\t\t\t<option value=\"{{.}}\">{{.}}</option>\n\t\t\t\t{{/selectorIds}}\n\t\t\t</select>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group feature feature-columns\">\n\t\t<label class=\"col-lg-1 control-label\">表格列属性</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<table class=\"table table-bordered table-condensed\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>列名</th>\n\t\t\t\t\t\t<th>自定义key</th>\n\t\t\t\t\t\t<th>包括自定义key</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t{{#selector.columns}}\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td><input class=\"column-header\" type=\"hidden\" name=\"column[header][]\" value=\"{{header}}\">{{header}}</td>\n\t\t\t\t\t\t<td><input class=\"column-name form-control\" type=\"text\" name=\"column[name][]\" value=\"{{name}}\"></td>\n\t\t\t\t\t\t<td><input class=\"column-extract\" type=\"checkbox\" name=\"column[extract][]\" {{#extract}}checked=\"checked\"{{/extract}}></td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t{{/selector.columns}}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<button class=\"btn btn-primary\" action=\"save-selector\">保存选择器</button>\n            <button action=\"cancel-selector-editing\" class=\"btn btn-default\">取消</button>\n\t\t</div>\n\t</div>\n\n\t<div class=\"form-group\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\n\t\t</div>\n\t</div>\n</form>"
  },
  {
    "path": "server/static/views/SelectorEditTableColumn.html",
    "content": "<tr>\n\t<td><input class=\"column-header\" type=\"hidden\" name=\"column[header][]\" value=\"{{header}}\">{{header}}</td>\n\t<td><input class=\"column-name form-control\" type=\"text\" name=\"column[name][]\" value=\"{{name}}\"></td>\n\t<td><input class=\"column-extract\" type=\"checkbox\" name=\"column[extract][]\" {{#extract}}checked=\"checked\"{{/extract}}></td>\n</tr>"
  },
  {
    "path": "server/static/views/SelectorList.html",
    "content": "<div id=\"selector-tree\">\n\t<ol class=\"breadcrumb\">\n\t\t{{#parentSelectors}}\n\t\t<li><a>{{id}}</a></li>\n\t\t{{/parentSelectors}}\n\t</ol>\n\t<table class=\"table table-bordered table-condensed table-hover\">\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>名称</th>\n\t\t\t<th>选择器</th>\n\t\t\t<th>类型</th>\n\t\t\t<th>是否列表</th>\n\t\t\t<th>父选择器</th>\n\t\t\t<th>选项</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tbody></tbody>\n\t</table>\n\t<button action=\"add-selector\" type=\"button\" class=\"btn btn-primary btn-xs\">添加新选择器</button>\n</div>"
  },
  {
    "path": "server/static/views/SelectorListItem.html",
    "content": "<tr>\n\t<td>{{id}}</td>\n\t<td>{{selector}}</td>\n\t<td>{{type}}</td>\n\t<td>{{multiple}}</td>\n\t<td>{{parentSelectors}}</td>\n\t<td>\n\t\t<button action=\"preview-selector\" type=\"button\" class=\"btn btn-primary btn-xs\">显示元素</button>\n\t\t<button action=\"data-preview-selector\" type=\"button\" class=\"btn btn-primary btn-xs\">数据预览</button>\n\t\t<button action=\"edit-selector\" type=\"button\" class=\"btn btn-primary btn-xs\">修改</button>\n\t\t<button action=\"delete-selector\" type=\"button\" class=\"btn btn-primary btn-xs\">删除</button>\n\t</td>\n</tr>"
  },
  {
    "path": "server/static/views/SitemapBrowseData.html",
    "content": "<div id=\"sitemap-data\">\n\t<table class=\"table table-bordered table-condensed table-hover\">\n\t\t<thead>\n\t\t<tr>\n\t\t\t{{#columns}}\n\t\t\t<th>{{.}}</th>\n\t\t\t{{/columns}}\n\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t</tbody>\n\t</table>\n</div>"
  },
  {
    "path": "server/static/views/SitemapCreate.html",
    "content": "<form class=\"form-horizontal\" role=\"form\" id=\"create-sitemap\">\n\t<div class=\"form-group\">\n\t\t<label for=\"_id\" class=\"col-lg-1 control-label\">Sitemap name</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"_id\" id=\"_id\" placeholder=\"Sitemap name\">\n\t\t</div>\n\t</div>\n\t<div class=\"form-group start-url-block\">\n\t\t<label class=\"col-lg-1 control-label\">Start URL</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<div class=\"input-group\">\n\t\t\t\t<input type=\"text\" class=\"form-control input-start-url\" name=\"startUrl[]\" placeholder=\"URL\">\n\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t<button class=\"btn btn-default remove-start-url\" type=\"button\">-</button>\n\t\t\t\t\t<button class=\"btn btn-default add-extra-start-url\" type=\"button\">+</button>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<button type=\"submit\" class=\"btn btn-default\" id=\"submit-create-sitemap\">Create Sitemap</button>\n\t\t</div>\n\t</div>\n</form>"
  },
  {
    "path": "server/static/views/SitemapEditMetadata.html",
    "content": "<div id=\"edit-sitemap\">\n\t<form class=\"form-horizontal\" role=\"form\" id=\"edit-sitemap-metadata-form\">\n\t\t<div class=\"form-group\">\n\t\t\t<label for=\"edit_sitemap_id\" class=\"col-lg-1 control-label\">网站名称</label>\n\n\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" name=\"_id\" id=\"edit_sitemap_id\" placeholder=\"Sitemap name\" value=\"{{_id}}\">\n\t\t\t</div>\n\t\t</div>\n\t\t{{#startUrl.push}}\n\t\t\t{{#startUrl}}\n\t\t\t\t<div class=\"form-group start-url-block\">\n\t\t\t\t\t<label class=\"col-lg-1 control-label\">起始url</label>\n\t\t\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t\t\t<div class=\"input-group\">\n\t\t\t\t\t\t\t<input type=\"text\" class=\"form-control input-start-url\" name=\"startUrl[]\" placeholder=\"URL\" value=\"{{.}}\">\n\t\t\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t\t\t<button class=\"btn btn-default remove-start-url\" type=\"button\">-</button>\n\t\t\t\t\t\t\t<button class=\"btn btn-default add-extra-start-url\" type=\"button\">+</button>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{{/startUrl}}\n\t\t{{/startUrl.push}}\n\t\t{{^startUrl.push}}\n\t\t\t<div class=\"form-group start-url-block\">\n\t\t\t\t<label class=\"col-lg-1 control-label\">起始url</label>\n\t\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t\t<div class=\"input-group\">\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control input-start-url\" name=\"startUrl[]\" placeholder=\"URL\" value=\"{{startUrl}}\">\n\t\t\t\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t\t\t\t<button class=\"btn btn-default remove-start-url\" type=\"button\">-</button>\n\t\t\t\t\t\t\t\t<button class=\"btn btn-default add-extra-start-url\" type=\"button\">+</button>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t{{/startUrl.push}}\n\t\t<div class=\"form-group\">\n\t\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\" id=\"submit-edit-sitemap\">保存</button>\n\t\t\t</div>\n\t\t</div>\n\t</form>\n</div>"
  },
  {
    "path": "server/static/views/SitemapExport.html",
    "content": "<form class=\"form-horizontal\" role=\"form\">\n\t<div class=\"form-group\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<textarea rows=\"7\" class=\"form-control\">{{sitemapJSON}}</textarea>\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n        <div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<button action=\"sitemap-next-button\" type=\"button\" class=\"btn btn-primary btn-xs\">开始任务</button>\n\t\t\t<button action=\"sitemap-save-button\" type=\"button\" class=\"btn btn-primary btn-xs\">保存数据</button>\n\t\t</div>\n\t</div>\n</form>"
  },
  {
    "path": "server/static/views/SitemapExportDataCSV.html",
    "content": "<p>\n\tExport {{_id}} data as CSV. <br /> Waiting for the download button to appear. >\n\t<span class=\"download-button\" href=\"#\"><a>Download now!</a></span>\n</p>"
  },
  {
    "path": "server/static/views/SitemapImport.html",
    "content": "<form class=\"form-horizontal\" role=\"form\">\n\t<div class=\"form-group\">\n\t\t<label for=\"sitemapJSON\" class=\"col-lg-1 control-label\">Sitemap JSON</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<textarea rows=\"7\" class=\"form-control\" name=\"sitemapJSON\" id=\"sitemapJSON\"></textarea>\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n\t\t<label for=\"edit_sitemap_id\" class=\"col-lg-1 control-label\">Rename Sitemap (optional)</label>\n\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"_id\" id=\"edit_sitemap_id\" placeholder=\"Sitemap name\" value=\"{{_id}}\">\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<button class=\"btn btn-default\" id=\"submit-import-sitemap\">Import Sitemap</button>\n\t\t</div>\n\t</div>\n</form>"
  },
  {
    "path": "server/static/views/SitemapList.html",
    "content": "<div id=\"sitemaps\">\n\t<table class=\"table table-bordered table-condensed table-hover\">\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>ID</th>\n\t\t\t<th>Start URL</th>\n\t\t\t<th style=\"width:120px\">actions</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t</tbody>\n\t</table>\n</div>"
  },
  {
    "path": "server/static/views/SitemapListItem.html",
    "content": "<tr>\n\t<td class=\"id\">{{_id}}</td>\n\t<td>\n\t\t{{#startUrl.push}}\n\t\t\t{{#startUrl}}\n\t\t\t\t{{.}},\n\t\t\t{{/startUrl}}\n\t\t{{/startUrl.push}}\n\t\t{{^startUrl.push}}\n\t\t\t{{startUrl}}\n\t\t{{/startUrl.push}}\n\t</td>\n\t<td>\n\t\t<button action=\"browse-sitemap-data\" type=\"button\" class=\"btn btn-primary btn-xs\">Browse</button>\n\t\t<!--<button action=\"csv-download-sitemap-data\" type=\"button\" class=\"btn btn-primary btn-xs\">CSV</button>-->\n\t\t<button action=\"delete-sitemap\" type=\"button\" class=\"btn btn-primary btn-xs\">Delete</button>\n\t</td>\n</tr>"
  },
  {
    "path": "server/static/views/SitemapSave.html",
    "content": "<form class=\"form-horizontal\" role=\"form\">\n\t<div class=\"form-group\">\n\t\t<label for=\"requestInterval\" class=\"col-lg-1 control-label\">请求间隔 (秒)</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"requestInterval\" id=\"requestInterval\" placeholder=\"请求间隔\">\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n\t\t<label for=\"pageLoadDelay\" class=\"col-lg-1 control-label\">翻页请求间隔 (秒)</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<input type=\"text\" class=\"form-control\" name=\"pageLoadDelay\" id=\"pageLoadDelay\" placeholder=\"翻页间隔\">\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n\t\t<label for=\"sitemapConfigSave\" class=\"col-lg-1 control-label\">任务配置</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<textarea rows=\"7\" class=\"form-control\" name=\"sitemapConfigSave\" id=\"sitemapConfigSave\">{{sitemapConfig}}</textarea>\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n\t\t<label for=\"sitemapFieldsSave\" class=\"col-lg-1 control-label\">字段选择器</label>\n\t\t<div class=\"col-lg-10\">\n\t\t\t<textarea rows=\"7\" class=\"form-control\" name=\"sitemapFieldsSave\" id=\"sitemapFieldsSave\">{{sitemapJSON}}</textarea>\n\t\t</div>\n\t</div>\n\t<div class=\"form-group\">\n        <div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t<button action=\"sitemap-save-button\" type=\"button\" class=\"btn btn-primary btn-xs\">保存数据</button>\n\t\t</div>\n\t</div>\n\t<div class=\"alert alert-success col-lg-10 col-lg-offset-1 hide scraping-in-progress\" role=\"alert\">\n\t\t配置数据保存成功.\n\t</div>\n</form>"
  },
  {
    "path": "server/static/views/SitemapScrapeConfig.html",
    "content": "<div id=\"scrape-sitemap-config\">\n\t<form class=\"form-horizontal\" role=\"form\" id=\"submit-scrape-sitemap-form\">\n\t\t<div class=\"form-group\">\n\t\t\t<label for=\"requestInterval\" class=\"col-lg-1 control-label\">请求间隔 (秒)</label>\n\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" name=\"requestInterval\" id=\"requestInterval\" placeholder=\"请求间隔\">\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"form-group\">\n\t\t\t<label for=\"pageLoadDelay\" class=\"col-lg-1 control-label\">翻页请求间隔 (秒)</label>\n\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t<input type=\"text\" class=\"form-control\" name=\"pageLoadDelay\" id=\"pageLoadDelay\" placeholder=\"翻页间隔\">\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"form-group\">\n\t\t\t<label for=\"sitemapConfig\" class=\"col-lg-1 control-label\">任务配置</label>\n\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t<textarea rows=\"7\" class=\"form-control\" name=\"sitemapConfig\" id=\"sitemapConfig\">{{sitemapConfig}}</textarea>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"form-group\">\n\t\t\t<label for=\"sitemapFields\" class=\"col-lg-1 control-label\">字段选择器</label>\n\t\t\t<div class=\"col-lg-10\">\n\t\t\t\t<textarea rows=\"7\" class=\"form-control\" name=\"sitemapFields\" id=\"sitemapFields\">{{sitemapJSON}}</textarea>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"form-group\">\n\t\t\t<div class=\"col-lg-offset-1 col-lg-10\">\n\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\" id=\"submit-scrape-sitemap\">开始任务</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"alert alert-success col-lg-10 col-lg-offset-1 hide scraping-in-progress\" role=\"alert\">\n\t\t\t程序已开始<br>请在\"采集任务\"中查看任务状态, 或在\"采集数据\"中查看数据.\n\t\t</div>\n\t</form>\n</div>"
  },
  {
    "path": "server/static/views/SitemapSelectorGraph.html",
    "content": "<div id=\"selector-graph\"></div>"
  },
  {
    "path": "server/static/views/SitemapStartUrlField.html",
    "content": "<div class=\"form-group start-url-block\">\n\t<label class=\"col-lg-1 control-label\">Start URL</label>\n\n\t<div class=\"col-lg-10\">\n\t\t<div class=\"input-group\">\n\t\t\t<input type=\"text\" class=\"form-control input-start-url\" name=\"startUrl[]\" placeholder=\"URL\">\n\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t<button class=\"btn btn-default remove-start-url\" type=\"button\">-</button>\n\t\t\t\t\t<button class=\"btn btn-default add-extra-start-url\" type=\"button\">+</button>\n\t\t\t\t</span>\n\t\t</div>\n\t</div>\n</div>"
  },
  {
    "path": "server/static/views/Viewport.html",
    "content": "<div class=\"visible-xs\" >\n\t<i style=\"border: solid black;border-width: 0 3px 3px 0;display: inline-block;padding: 3px;transform: rotate(-135deg);position:fixed;top:10px;right:39px\"></i>\n\t<div style=\"text-align:center; padding: 30px 10px 0 10px\">\n\t\t<p>Move developer tools to the bottom of your browser to start using Web Scraper.</p>\n\t</div>\n</div>\n\n<div class=\"hidden-xs\">\n<!-- Navigation -->\n<nav class=\"navbar navbar-default\" role=\"navigation\">\n\n\t<div class=\"collapse navbar-collapse navbar-ex1-collapse\">\n\t\t<ul class=\"nav navbar-nav\">\n\t\t\t<li>\n\t\t\t\t<a id=\"sitemap-nav-button\" class=\"dropdown-toggle disabled\" data-toggle=\"dropdown\">选择器\n\t\t\t\t\t<span id=\"navbar-active-sitemap-id\"></span>\n\t\t\t\t\t<b class=\"caret\"></b>\n\t\t\t\t</a>\n\t\t\t\t<ul class=\"dropdown-menu\">\n\t\t\t\t\t<li><a id=\"sitemap-selector-list-nav-button\">选择器</a></li>\n\t\t\t\t\t<li><a id=\"sitemap-selector-graph-nav-button\">选择器树形图</a></li>\n\t\t\t\t\t<li><a id=\"sitemap-scrape-nav-button\">下一步</a></li>\n\t\t\t\t\t<!--<li><a id=\"sitemap-browse-nav-button\">可视化</a></li>-->\n\t\t\t\t\t<li><a id=\"sitemap-export-nav-button\">保存选择器</a></li>\n\t\t\t\t\t<!--<li><a id=\"sitemap-export-data-csv-nav-button\">导出CSV</a></li>-->\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t</ul>\n\t</div>\n\n</nav>\n\n<div id=\"messages\"></div>\n<div id=\"viewport\"></div>\n</div>\n"
  },
  {
    "path": "server/templates/base.html",
    "content": "<nav class=\"navbar navbar-default navbar-static-top\">\n    <div class=\"container\">\n        <div class=\"navbar-header\">\n            <a class=\"navbar-brand\" href=\"/\">可视化采集平台</a>\n        </div>\n\n        <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n            <ul class=\"nav navbar-nav\">\n                <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('config') }}\">新增任务</a></li>\n                <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('data') }}\">查看数据</a></li>\n                <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('read') }}\">读取配置</a></li>\n            </ul>\n            <ul class=\"nav navbar-nav navbar-right\">\n                <li><a href=\"{{ reverse_url('help') }}\">Help</a></li>\n            </ul>\n        </div>\n    </div>\n</nav>"
  },
  {
    "path": "server/templates/config.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('js/config.js') }}\"></script>\n    <link href=\"{{ static_url('css/config-style.css') }}\" rel=\"stylesheet\">\n</head>\n\n<body>\n    <!-- 表单警告框 -->\n    <div id=\"head_warn\" class=\"alert alert-danger\" role=\"alert\" style=\"display:none\">\n        <strong>警告！</strong>head表单中存在空值。</div>\n    <div id=\"form_warn\" class=\"alert alert-danger\" role=\"alert\" style=\"display:none\">\n        <strong>警告！</strong>form表单中存在空值。</div>\n    <div id=\"cookie_warn\" class=\"alert alert-danger\" role=\"alert\" style=\"display:none\">\n        <strong>警告！</strong>cookie表单中存在空值。</div>\n    <!-- 导航栏 -->\n    {% include \"base.html\" %}\n    <div class=\"container\">\n        <div class=\"row\">\n            <ol class=\"breadcrumb\">\n                <li><a href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                <li class=\"active\">请求配置</li>\n            </ol>\n            <div class=\"panel panel-primary\">\n                <div class=\"panel-heading\">\n                    <h4 class=\"panel-title\">\n                        <a data-toggle=\"collapse\" href=\"#task-list\">请求参数配置</a></h4>\n                </div>\n                <div id=\"task-list\" class=\"panel-collapse collapse in\">\n                    <div class=\"panel-body\">\n                        <!-- 配置名称 -->\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\">请输入配置名称</span>\n                            <input type=\"text\" class=\"form-control\" id=\"conf_name\" placeholder=\"配置名称\">\n                            <p style=\"color: #F66495; display: none\" id=\"name_warn\">配置名称为空</p></div>\n                        <br>\n                        <!-- URL -->\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\">请输入URL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>\n                            <select class=\"form-control\" id=\"mode\">\n                                <option value=\"get\">GET请求</option>\n                                <option value=\"post\">POST请求</option></select>\n                            <input type=\"text\" class=\"form-control\" id=\"url\" placeholder=\"例：https://www.baidu.com/\">\n                            <p style=\"color: #F66495; display: none\" id=\"url_warn\">url不合法</p></div>\n                        <br>\n                        <!-- 参数 -->\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\">请求参数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>\n                            <ul class=\"nav nav-tabs\">\n                                <li class=\"active\" id=\"header\">\n                                    <a href=\"#\" onclick=\"selectHeader()\">headers参数</a></li>\n                                <li id=\"cookie\">\n                                    <a href=\"#\" onclick=\"selectCookie()\">cookies参数</a></li>\n                                <li id=\"form\">\n                                    <a href=\"#\" onclick=\"selectForm()\" style=\"visibility:hidden\">form-data参数</a></li>\n                            </ul>\n                            <!-- header参数 -->\n                            <div id=\"header-table\" style=\"display:inline\" class=\"row col-xs-8 col-sm-8 col-md-8\">\n                                <table id=\"table_header\" class=\"table table-hover\">\n                                    <thead>\n                                        <tr>\n                                            <th>Header Key</th>\n                                            <th>Header Value</th></tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr id=\"header_1\">\n                                            <td>\n                                                <input type=\"text\" class=\"form-control\" placeholder=\"New key\"></td>\n                                            <td>\n                                                <input type=\"text\" class=\"form-control\" placeholder=\"New Value\"></td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                                <!-- 新增参数 -->\n                                <div class=\"row container-fluid\">\n                                    <button type=\"button\" class=\"btn btn-default pull-left\" onclick=\"addHeaderRow()\">\n                                        <span class=\"glyphicon glyphicon-plus\"></span>\n                                    </button>\n                                </div>\n                            </div>\n                            <!-- cookie参数 -->\n                            <div id=\"cookie-table\" style=\"display:none\" class=\"row col-xs-8 col-sm-8 col-md-8\">\n                                <table id=\"table_cookie\" class=\"table table-hover\">\n                                    <thead>\n                                        <tr>\n                                            <th>Cookie Key</th>\n                                            <th>Cookie Value</th></tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr id=\"cookie_1\">\n                                            <td>\n                                                <input type=\"text\" class=\"form-control\" placeholder=\"New key\"></td>\n                                            <td>\n                                                <input type=\"text\" class=\"form-control\" placeholder=\"New Value\"></td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                                <!-- 新增参数 -->\n                                <div class=\"row container-fluid\">\n                                    <button type=\"button\" class=\"btn btn-default pull-left\" onclick=\"addCookieRow()\">\n                                        <span class=\"glyphicon glyphicon-plus\"></span>\n                                    </button>\n                                </div>\n                            </div>\n                            <!-- post请求 form参数 -->\n                            <div id=\"form-table\" style=\"display:none\" class=\"row col-xs-8 col-sm-8 col-md-8\">\n                                <table id=\"table_form\" class=\"table table-hover\">\n                                    <thead>\n                                        <tr>\n                                            <th>Form Key</th>\n                                            <th>Form Value</th></tr>\n                                    </thead>\n                                    <tbody>\n                                        <tr id=\"form_1\">\n                                            <td>\n                                                <input type=\"text\" class=\"form-control\" placeholder=\"New key\"></td>\n                                            <td>\n                                                <input type=\"text\" class=\"form-control\" placeholder=\"New Value\"></td>\n                                        </tr>\n                                    </tbody>\n                                </table>\n                                <!-- 新增参数 -->\n                                <div class=\"row container-fluid\">\n                                    <button type=\"button\" class=\"btn btn-default pull-left\" onclick=\"addFormRow()\">\n                                        <span class=\"glyphicon glyphicon-plus\"></span>\n                                    </button>\n                                </div>\n                            </div>\n                        </div>\n                        <br>\n                        <!-- 代理IP -->\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\">\n                                <input type=\"checkbox\" id=\"proxy\"></span>\n                            <p class=\"form-control\">是否启用代理IP</p></div>\n                        <br>\n                        <!-- 动态加载 -->\n                        <div class=\"input-group\">\n                            <span class=\"input-group-addon\">\n                                <input type=\"checkbox\" id=\"dynamic\"></span>\n                            <p class=\"form-control\">是否启用动态加载JS</p></div>\n                    </div>\n                    <!-- 模态框模板_无状态 -->\n                    <div class=\"modal fade\" id=\"modal_model\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n                        <div class=\"modal-dialog\">\n                            <div class=\"modal-content\">\n                                <div class=\"modal-header\">\n                                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>\n                                    <!-- 写入标题 -->\n                                    <h4 class=\"modal-title\" id=\"myModalLabel\"></h4>\n                                </div>\n                                <!-- 写入内容 -->\n                                <div class=\"modal-body\" id=\"modal_model_body\"></div>\n                                <div class=\"modal-footer\">\n                                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">关闭</button>\n                                    <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">确定</button></div>\n                            </div>\n                        </div>\n                    </div>\n                    <!-- 模态框_确认 -->\n                    <input type=\"hidden\" id=\"common_confirm_btn\" class=\"btn btn-primary btn-lg\" data-toggle=\"modal\" data-target=\"#common_confirm_model\">\n                    <div id=\"common_confirm_model\" class=\"modal\">\n                        <div class=\"modal-dialog modal-sm\">\n                            <div class=\"modal-content\">\n                                <div class=\"modal-header\">\n                                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\n                                        <span aria-hidden=\"true\">&times;</span>\n                                        <span class=\"sr-only\">Close</span></button>\n                                    <h5 class=\"modal-title\">\n                                        <i class=\"fa fa-exclamation-circle\"></i>\n                                        <span class=\"title\"></span>\n                                    </h5>\n                                </div>\n                                <div class=\"modal-body small\">\n                                    <p>\n                                        <span class=\"message\"></span>\n                                    </p>\n                                </div>\n                                <div class=\"modal-footer\">\n                                    <button type=\"button\" class=\"btn btn-primary ok\" data-dismiss=\"modal\">确认</button>\n                                    <button type=\"button\" class=\"btn btn-default cancel\" data-dismiss=\"modal\">取消</button></div>\n                            </div>\n                        </div>\n                    </div>\n                    <!-- 保存配置模态框 -->\n                    <div class=\"modal fade\" id=\"myModal\" data-backdrop=\"false\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n                        <div class=\"modal-dialog\">\n                            <div class=\"modal-content\">\n                                <div class=\"bg-primary modal-header\">\n                                    <!-- 关闭 -->\n                                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-hidden=\"true\">&times;</button>\n                                    <h4>请求配置</h4>\n                                </div>\n                                <div class=\"modal-body\">\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">配置名称:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"modal_name\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">请求方式:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"modal_method\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">URL:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"modal_url\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">启用代理IP:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"model_proxy\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">动态加载JS:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"model_dynamic\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">header参数:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"modal_header\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">cookie参数:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"modal_cookie\"></p>\n                                        </div>\n                                    </div>\n                                    <hr>\n                                    <div class=\"row\">\n                                        <label class=\"col-xs-5 col-sm-5 col-md-5\">form参数:</label>\n                                        <div class=\"col-xs-5 col-sm-5 col-md-5\">\n                                            <p id=\"modal_form\"></p>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"modal-footer\">\n                                    <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\">取消</button>\n                                    <button type=\"button\" class=\"btn btn-primary\" onclick=\"sendReqData()\">确定</button>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <!-- 显示结果页 -->\n            <div class=\"row\">\n                <div class=\"btn-group container-fluid\">\n                    <button type=\"button\" class=\"btn btn-default\" onclick=\"saveConfigForm()\">下一步</button>\n            </div>\n        </div>\n    </div>\n</body>\n\n</html>"
  },
  {
    "path": "server/templates/data.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/bootstrap-treeview.min.css')}}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/bootstrap-table.min.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-treeview.min.js')}}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table-zh-CN.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/tableExport.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table-export.min.js') }}\"></script>\n    <script src=\"{{ static_url('js/data.js') }}\"></script>\n</head>\n<body>\n    {% include \"base.html\" %}\n    <div class=\"container-fluid\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t<div id=\"collection_tree\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-8\">\n\t\t\t\t<table id=\"collection_data\"></table>\n\t\t\t</div>\n\t\t</div>\n    </div>\n    <script>\n        var tree = {% raw collection_names %};\n        $('#collection_tree').treeview({\n\t\t\tdata: tree,\n\t\t\tshowTags: true,\n\t\t\tshowBorder: false,\n            color: \"#428bca\",\n\t\t\tonNodeSelected: function(event, node) {\n\t\t\t    initColumns(node.text);\n            }\n\t\t});\n\n    </script>\n</body>\n</html>"
  },
  {
    "path": "server/templates/error_status/404.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n</head>\n<body>\n    <nav class=\"navbar navbar-default navbar-static-top\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\">\n                    <span class=\"sr-only\">Toggle navigation</span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">Tornado-Scrapy</a>\n            </div>\n\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                <ul class=\"nav navbar-nav\">\n                    <li><a class=\"cursor-pointer\" href=\"/\">采集任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"/add/config\">新增任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"/data\">采集数据</a></li>\n                </ul>\n                <ul class=\"nav navbar-nav navbar-right\">\n                    <li><a href=\"#\">Help</a></li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n    <div class=\"container\">\n        <h1>404</h1>\n        <h3>Page Not Found</h3>\n        <div>\n            Sorry, but the page you are looking for has note been found. Try checking the URL for error, then hit the refresh button on your browser or try found something else in our app.\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "server/templates/error_status/500.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n</head>\n<body>\n    <nav class=\"navbar navbar-default navbar-static-top\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#bs-example-navbar-collapse-1\">\n                    <span class=\"sr-only\">Toggle navigation</span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n                <a class=\"navbar-brand\" href=\"/\">Tornado-Scrapy</a>\n            </div>\n\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                <ul class=\"nav navbar-nav\">\n                    <li><a class=\"cursor-pointer\" href=\"/\">采集任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"/add/config\">新增任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"/data\">采集数据</a></li>\n                </ul>\n                <ul class=\"nav navbar-nav navbar-right\">\n                    <li><a href=\"#\">Help</a></li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n    <div class=\"container\">\n        <h1>500</h1>\n        <h3>HTTP-Internal Server Error</h3>\n        <div>\n            We've been notified about this issue and we'll take a look at it shortly.\n        </div>\n    </div>\n</body>\n</html>"
  },
  {
    "path": "server/templates/help.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('css/wiz_style/bootstrap-tmp.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/wiz_style/wiz_tmp_editor_style.css') }}\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" charset=\"utf-8\" name=\"wiz_tmp_editor_style\" href=\"{{ static_url('css/wiz_style/github2.css') }}\">\n    <link rel=\"stylesheet\" charset=\"utf-8\" name=\"wiz_tmp_editor_style\" href=\"{{ static_url('css/wiz_style/wizToc.css') }}\">\n</head>\n<body>\n    {% include \"base.html\" %}\n    <div class=\"markdown-body\" contenteditable=\"false\">\n    <p>\n    </p>\n    <div class=\"wiz_toc_layer\">\n        <a class=\"wiz_toc h1\" href=\"#懒得看的点这里, 直接到示例\">懒得看的点这里, 直接到示例</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#任务管理\">任务管理</a>\n        <br>\n        <a class=\"wiz_toc h2\" href=\"#界面说明\">界面说明</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#新增任务\">新增任务</a>\n        <br>\n        <a class=\"wiz_toc h2\" href=\"#1.请求参数配置\">1.请求参数配置</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#配置名称\">配置名称</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#请求方式\">请求方式</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#入口url\">入口url</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#请求参数\">请求参数</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#代理ip\">代理ip</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#动态解析\">动态解析</a>\n        <br>\n        <a class=\"wiz_toc h2\" href=\"#2.选择器配置\">2.选择器配置</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#选择器界面\">选择器界面</a>\n        <br>\n        <a class=\"wiz_toc h4\" href=\"#主界面\">主界面</a>\n        <br>\n        <a class=\"wiz_toc h4\" href=\"#增、改\">增、改</a>\n        <br>\n        <a class=\"wiz_toc h4\" href=\"#查\">查</a>\n        <br>\n        <a class=\"wiz_toc h4\" href=\"#预览\">预览</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#字段选择器属性\">字段选择器属性</a>\n        <br>\n        <a class=\"wiz_toc h4\" href=\"#字段使用条件\">字段使用条件</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#元素集选择器的存在意义\">元素集选择器的存在意义</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#选择器树形图\">选择器树形图</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#下一步/保存选择器\">下一步/保存选择器</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#查看/下载数据\">查看/下载数据</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#读取配置\">读取配置</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#采集示例\">采集示例</a>\n        <br>\n        <a class=\"wiz_toc h2\" href=\"#\" 多元素 \"选择器=\" \" +=\" \" 翻页(1)\"=\"\">\"多元素\"选择器 + 翻页(1)</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#请求配置\">请求配置</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#参数配置\">参数配置</a>\n        <br>\n        <a class=\"wiz_toc h2\" href=\"#元素集选择器+翻页(2)+详情\">元素集选择器+翻页(2)+详情</a>\n        <br>\n        <a class=\"wiz_toc h3\" href=\"#参数配置\">参数配置</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#可能存在的问题\">可能存在的问题</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#动态解析\">动态解析</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#网页页模板不同\">网页页模板不同</a>\n        <br>\n        <a class=\"wiz_toc h1\" href=\"#选择器无法选中\">选择器无法选中</a></div>\n    <a href=\"#wizToc\"></a>\n    <p>\n    </p>\n    <h1 id=\"懒得看的点这里, 直接到示例\">懒得看的点这里, 直接到示例</h1>\n    <p>\n        <a href=\"#采集示例\">采集示例</a></p>\n    <h1 id=\"任务管理\">任务管理</h1>\n    <h2 id=\"界面说明\">界面说明</h2>\n    <p>\n        <strong>主界面:</strong>\n        <br>\n        <img src=\"/static/images/90eb120e-33b8-48fb-a665-4048a77839b9.png\" alt=\"\" title=\"\"></p>\n    <p>该模块管理爬虫的运行状态, 可以暂停、停止和恢复爬虫的运行.</p>\n    <p>\n        <strong>详情界面:</strong>\n        <br>\n        <img src=\"/static/images/7028c459-888e-40ae-b412-e268540d4150.png\" alt=\"\" title=\"\"></p>\n    <p>如图, 点击任务, 进入详情页, \"爬虫统计\"为scrapy爬虫框架的日志信息; \"请求队列\"为将要爬取的url; 上方有\"暂停\"、\"恢复\"和\"停止\"爬虫任务按钮.</p>\n    <p>主界面为管理爬虫任务状态的模块, 前后端实时同步, 前端实时接收爬虫任务日志, 后端实时响应爬虫任务状态的改变.</p>\n    <h1 id=\"新增任务\">新增任务</h1>\n    <p>\n        <img src=\"/static/images/0815f886-5de3-412b-8d21-b20a642af05a.png\" alt=\"\" title=\"\"></p>\n    <p>配置request请求参数和入口url, 同为后续爬虫的请求参数.</p>\n    <h2 id=\"1.请求参数配置\">1.请求参数配置</h2>\n    <h3 id=\"配置名称\">配置名称</h3>\n    <p>任务ID的标识, 在数据查询时用来查找数据集合, 保存配置时用来选择请求参数和字段选择器, 唯一值, 不可重复, 不能为\n        <code>config</code>字符串.</p>\n    <h3 id=\"请求方式\">请求方式</h3>\n    <p>本平台选常用的两种请求, post和get.</p>\n    <h3 id=\"入口url\">入口url</h3>\n    <p>爬取页面的入口页面, 选择采集参数和后续页面会在该页面进行扩展</p>\n    <h3 id=\"请求参数\">请求参数</h3>\n    <p>请求参数分为三种:\n        <br>\n        <strong>1.请求头header参数</strong>\n        <br>爬虫常用的header参数有</p>\n    <div class=\"wiz-table-container\" style=\"position: relative; padding: 0px;\">\n        <div class=\"wiz-table-body\">\n            <table>\n                <thead>\n                    <tr>\n                        <th>Header</th>\n                        <th>解释</th>\n                        <th>示例</th></tr>\n                </thead>\n                <tbody>\n                    <tr>\n                        <td>Accept</td>\n                        <td>指定客户端能够接收的内容类型</td>\n                        <td>Accept: text/plain, text/html</td></tr>\n                    <tr>\n                        <td>Accept-Charset</td>\n                        <td>浏览器可以接受的字符编码集。</td>\n                        <td>Accept-Charset: iso-8859-5</td></tr>\n                    <tr>\n                        <td>Accept-Encoding</td>\n                        <td>指定浏览器可以支持的web服务器返回内容压缩编码类型。</td>\n                        <td>Accept-Encoding: compress, gzip</td></tr>\n                    <tr>\n                        <td>Accept-Language</td>\n                        <td>浏览器可接受的语言</td>\n                        <td>Accept-Language: en,zh</td></tr>\n                    <tr>\n                        <td>Accept-Ranges</td>\n                        <td>可以请求网页实体的一个或者多个子范围字段</td>\n                        <td>Accept-Ranges: bytes</td></tr>\n                    <tr>\n                        <td>Content-Length</td>\n                        <td>请求的内容长度</td>\n                        <td>Content-Length: 348</td></tr>\n                    <tr>\n                        <td>Content-Type</td>\n                        <td>请求的与实体对应的MIME信息</td>\n                        <td>Content-Type: application/x-www-form-urlencoded</td></tr>\n                    <tr>\n                        <td>Date</td>\n                        <td>请求发送的日期和时间</td>\n                        <td>Date: Tue, 15 Nov 2010 08:12:31 GMT</td></tr>\n                    <tr>\n                        <td>Proxy-Authorization</td>\n                        <td>连接到代理的授权证书</td>\n                        <td>Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==</td></tr>\n                    <tr>\n                        <td>Referer</td>\n                        <td>先前网页的地址，当前请求网页紧随其后,即来路</td>\n                        <td>Referer:\n                            <a href=\"https://www.baidu.com/\">https://www.baidu.com/</a></td>\n                    </tr>\n                    <tr>\n                        <td>User-Agent</td>\n                        <td>User-Agent的内容包含发出请求的用户信息</td>\n                        <td>User-Agent: Mozilla/5.0 (Linux; X11)</td></tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n    <p>\n        <strong>2.cookie参数</strong>\n        <br>有些网站需要验证cookie参数</p>\n    <p>\n        <strong>3.form-data参数</strong>\n        <br>选择post请求时, 提交的参数信息</p>\n    <p>\n        <img src=\"/static/images/acfce330-9ea4-4ce6-92fc-569707e8076c.png\" alt=\"\" title=\"\">\n        <br>如图为header参数</p>\n    <h3 id=\"代理ip\">代理ip</h3>\n    <p>针对防爬虫网站设计, 动态代理ip, 有效时间\n        <code>2018-05-10 14:44:00</code>前</p>\n    <h3 id=\"动态解析\">动态解析</h3>\n    <p>越来越多的网站选用js渲染页面, 针对非模板页面加载网站</p>\n    <p>示例url:\n        <code>http://shop.99114.com/47907188/ch6</code></p>\n    <p>静态爬虫获取页面内容：\n        <br>\n        <img src=\"/static/images/15155175263081.png\" alt=\"\" title=\"\"></p>\n    <p>动态爬虫获取页面内容：\n        <br>\n        <img src=\"/static/images/2.png\" alt=\"\" title=\"\"></p>\n    <p>动态爬虫实际获取页面内容：\n        <br>\n        <img src=\"/static/images/3.png\" alt=\"\" title=\"\"></p>\n    <p>在动态爬虫获取页面的前端展现上, 已竭力实现实际获取内容, 但仍不可避免造成爬取内容和展现内容不符.</p>\n    <h2 id=\"2.选择器配置\">2.选择器配置</h2>\n    <p>\n        <img src=\"/static/images/3da3e10c-80de-4597-9823-88a07ddb78b3.png\" alt=\"\" title=\"\"></p>\n    <p>选择器配置界面分为两部分, 上方的\n        <strong>采集页面</strong>和下方的\n        <strong>选择器页面</strong>.\n        <br>上方的采集页面为请求配置完成后点击\"下一步\"所呈现出的页面内容.\n        <br>下方的选择器界面为选择将要采集的数据.</p>\n    <h3 id=\"选择器界面\">选择器界面</h3>\n    <h4 id=\"主界面\">主界面</h4>\n    <p>\n        <img src=\"/static/images/28e81b8d-a8bb-4fc1-85c9-f3839f14da4a.png\" alt=\"\" title=\"\">\n        <br>提供字段选择器的层级显示、增、删、改、查、预览功能</p>\n    <h4 id=\"增、改\">增、改</h4>\n    <p>\n        <img src=\"/static/images/1d258dd7-3462-465e-a6ee-eff449a794ee.png\" alt=\"\" title=\"\">\n        <br>添加/修改字段选择器, 共有7中类型的字段选择器\n        <a href=\"#字段选择器属性\">字段选择器属性</a></p>\n    <h4 id=\"查\">查</h4>\n    <p>\n        <img src=\"/static/images/28546708-1d60-416a-a874-a9cea4f7dce3.jpg\" alt=\"\" title=\"\">\n        <br>显示选择器选择在页面中选择的位置</p>\n    <h4 id=\"预览\">预览</h4>\n    <p>\n        <img src=\"/static/images/709f40e1-b083-4d60-98e9-877fdf53c7b2.png\" alt=\"\" title=\"\">\n        <br>显示选择器匹配的数据</p>\n    <p>选择器用来选定采集数据的位置和内容, 该界面可以用鼠标点击配置将要采集的数据, 查看采集数据的位置, 预览采集数据的内容, 根据采集数据不同, 将字段选择器分为以下7类.</p>\n    <h3 id=\"字段选择器属性\">字段选择器属性</h3>\n    <div class=\"wiz-table-container\" style=\"position: relative; padding: 0px;\">\n        <div class=\"wiz-table-body\">\n            <table>\n                <thead>\n                    <tr>\n                        <th>字段选择器</th>\n                        <th>名称</th>\n                        <th>多元素属性(multiple)</th>\n                        <th>可选子元素</th>\n                        <th>该类型页面唯一</th>\n                        <th>可查看选择器</th>\n                        <th>可预览数据</th>\n                        <th>是否采集</th></tr>\n                </thead>\n                <tbody>\n                    <tr>\n                        <td>SelectorDetail</td>\n                        <td>详情页选择器</td>\n                        <td>否</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>否</td></tr>\n                    <tr>\n                        <td>SelectorElement</td>\n                        <td>元素集选择器</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>否</td></tr>\n                    <tr>\n                        <td>SelectorElementAttribute</td>\n                        <td>元素属性选择器</td>\n                        <td>是</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td></tr>\n                    <tr>\n                        <td>SelectorHTML</td>\n                        <td>html选择器</td>\n                        <td>是</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td></tr>\n                    <tr>\n                        <td>SelectorImage</td>\n                        <td>图片选择器</td>\n                        <td>是</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td></tr>\n                    <tr>\n                        <td>SelectorLink</td>\n                        <td>翻页选择器</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>否</td></tr>\n                    <tr>\n                        <td>SelectorText</td>\n                        <td>文本选择器</td>\n                        <td>是</td>\n                        <td>否</td>\n                        <td>否</td>\n                        <td>是</td>\n                        <td>是</td>\n                        <td>是</td></tr>\n                </tbody>\n            </table>\n        </div>\n    </div>\n    <h4 id=\"字段使用条件\">字段使用条件</h4>\n    <blockquote>\n        <p>1.避免同级别multiple、非multiple属性的选择器并存</p>\n    </blockquote>\n    <p>所有采集的字段(SelectorElementAttribute、SelectorHTML、SelectorImage、SelectorText)有字段选中\"多元素属性\"时, 不可选择其他采集的字段, 会造成两个字段集合维度混乱(\"多元素属性\"的字段多对一非列表属性字段), 后端维度无法对应的字段值统一处理为空字符串.</p>\n    <p>如果有\"多元素属性\", 该父类下所有采集的字段选择器尽量全都是\"多元素属性\"；\n        <br>如果没有\"多元素属性\", 该父类下所有采集的字段选择器尽量都没有\"多元素属性\".\n        <br>\n        <img src=\"/static/images/47b3f912-b840-4062-bd6b-f0bfc14b43ab.png\" alt=\"\" title=\"\">\n        <br>\n        <img src=\"/static/images/1ae43476-59d4-40bd-a1ef-9705df3030a3.png\" alt=\"\" title=\"\">\n        <br>如图：标题、内容为可采集字段, 他们的多元素属性必须一致.\n        <br>\n        <img src=\"/static/images/600acd3f-432d-4784-9f41-654aabe628df.png\" alt=\"\" title=\"\">\n        <br>不一致时示例</p>\n    <blockquote>\n        <p>2.翻页选择器只能在入口页面设置且唯一</p>\n    </blockquote>\n    <p>SelectorLink(翻页选择器)在入口页面下只能存在一个.\n        <br>SelectorLink是递归采集函数.\n        <br>存在多个时导致系统效率降低, 稳健性下降.</p>\n    <blockquote>\n        <p>3.元素集选择器下可采集的字段多元素属性以元素集选择器为准</p>\n    </blockquote>\n    <p>SelectorElement(元素集选择器)的子类采集选择器(SelectorElementAttribute、SelectorHTML、SelectorImage、SelectorText)选择multiple(多元素属性)时, 会将子类数据集升维, 数据解析错误.</p>\n    <p>[详细解释见\n        <a href=\"#元素集选择器的存在意义\">元素集选择器的存在意义</a>]\n        <br>\n        <img src=\"/static/images/85d6f868-f03b-4c9e-b8c9-cd7ffc832029.png\" alt=\"\" title=\"\">\n        <br>如图：元素集下所有的可采集字段(红圈中)的multiple(多元素属性)以元素集是否选择multiple(多元素属性)为准.</p>\n    <p>前端表单按照字段选择器名称生成模板, 暂时未判断父类属性; 后端元素SelectorElement(元素集选择器)的子类采集选择器采集时将不会判断multiple(多元素属性).统一按照父类SelectorElement(元素集选择器)是否选择multiple(多元素属性)判断.</p>\n    <blockquote>\n        <p>4.详情页选择只能有一条链式选择器</p>\n    </blockquote>\n    <p>前端采集页面在iframe标签内, 详情页选择后无法返回, 同级别选择器只能存在一个, 不同层次的选择器存在详情页选择器则他们必在同一条链式选择器上.\n        <br>后端采集框架scrapy为异步回调, 选择器解析为链式回调, 同级别存在多个详情页选择器会导致数据混淆、丢失.\n        <br>\n        <img src=\"/static/images/c5173f94-9895-4709-81db-0df46599fdf5.png\" alt=\"\" title=\"\">\n        <br>如图：\"详情\", \"联系\"为两个详情选择器, 在同一条链式选择器上</p>\n    <h3 id=\"元素集选择器的存在意义\">元素集选择器的存在意义</h3>\n    <p>采集到所需的数据由两个因素决定：html文本和选择器， 其中html文本为页面中内容所在的html块, 选择器为指定采集的字段内容.</p>\n    <p>在使用到元素集选择器的大多数情况下html块多为列表形式存在, 选择器有多个.</p>\n    <p>\n        <strong>不使用元素集选择器时</strong>\n        <br>多个选择器按照\"多元素\"属性选择采集的数据, 页面本身可能存在内容块数据缺失, 造成多个选择器选择的数据列无法一一对应, 造成数据混淆、错位</p>\n    <p>示例：\n        <br>\n        <img src=\"/static/images/6cfe84f9-a938-49e7-ae1a-e16e67d25bbf.png\" alt=\"\" title=\"\">\n        <img src=\"/static/images/545c2037-3d39-4e72-bddf-a84b180cc693.png\" alt=\"\" title=\"\">\n        <br>\n        <img src=\"/static/images/7fbf683b-98d8-4c09-9315-acc601a07387.png\" alt=\"\" title=\"\">\n        <img src=\"/static/images/d0ca6d60-b3db-4514-bfb2-0c88fc862ea6.png\" alt=\"\" title=\"\"></p>\n    <p>\"多元素属性\"选择器优先遍历css选择器</p>\n    <p>新建两个\"多元素属性\"选择器, 第一个采集\"name\"字段, 第二个采集\"href\"字段, 当页面本身存在数据缺失时, 会使\"name\"和\"href\"数据无法一一对应.\"name_2\" =&gt; \"href_3\" 导致数据错位.</p>\n    <p>\n        <strong>使用元素集选择器时</strong>\n        <br>\n        <img src=\"/static/images/a7aff1d4-ad56-430f-a6de-aace92b2f56d.png\" alt=\"\" title=\"\">\n        <img src=\"/static/images/73d3b897-1656-4f2c-8e63-f75ec30e1d08.png\" alt=\"\" title=\"\"></p>\n    <p>元素集选择器优先遍历内容块, 然后遍历css选择器, 使得数据维度得到统一, 缺失值也不会影响结果值</p>\n    <p>元素集选择器优先遍历内容块, \"多元素属性\"的选择器会优先遍历选择器, 两个开始采集维度的不同, 会导致不同的结果.当采集字段中存在多个\"多元素属性\"的选择器且他们具有同一个父元素, 优先考虑将这些选择器置于元素集选择器中.</p>\n    <h3 id=\"选择器树形图\">选择器树形图</h3>\n    <p>\n        <img src=\"/static/images/85d6f868-f03b-4c9e-b8c9-cd7ffc832029.png\" alt=\"\" title=\"\">\n        <br>显示各个层级的选择器关系</p>\n    <h3 id=\"下一步/保存选择器\">下一步/保存选择器</h3>\n    <p>\n        <img src=\"/static/images/48ab3a69-30c6-4707-b302-de21c4584294.png\" alt=\"\" title=\"\">\n        <br>开始或者保存任务</p>\n    <h1 id=\"查看/下载数据\">查看/下载数据</h1>\n    <p>\n        <img src=\"/static/images/85ff994f-659a-42e3-a253-40bb730c2a64.png\" alt=\"\" title=\"\"></p>\n    <p>查看数据和下载已采集数据的页面</p>\n    <h1 id=\"读取配置\">读取配置</h1>\n    <p>\n        <img src=\"/static/images/4b396b3a-c14e-4412-b0ac-566c08ac6946.png\" alt=\"\" title=\"\"></p>\n    <p>开始或删除任务</p>\n    <h1 id=\"采集示例\">采集示例</h1>\n    <h2 id=\"&quot;多元素&quot;选择器 + 翻页(1)\">\"多元素\"选择器 + 翻页(1)</h2>\n    <p>\n        <code>http://www.51sole.com/s.aspx?q=PVC通风管</code></p>\n    <h3 id=\"请求配置\">请求配置</h3>\n    <p>\n        <img src=\"/static/images/c5c446a4-e1a5-403b-a5fc-3395af38237d.png\" alt=\"\" title=\"\"></p>\n    <h3 id=\"参数配置\">参数配置</h3>\n    <p>1.填写字段名称\n        <code>商品名称</code>(唯一), 如果重复, 选择器保存失败\n        <br>2.选择 选择器类型\n        <br>3.\"点击选择\"按钮开启选择器\n        <br>4-5.分别点击同一列表中同一采集内容(自动匹配通用选择器, 无法匹配时会提示; 如采集单个选择, 只用点击选择器一次即可)\n        <br>6.点击确定按钮获取\"css选择器\"内容, 确定左侧\"键盘事件\"共绑定了一个按键, S键: 当前选择器, P键: 当前选择元素的父元素, C键: 当前选择元素的子元素\n        <br>7.选择\"多元素属性\"\n        <br>8.保存选择器\n        <br>\n        <img src=\"/static/images/00a1e6e7-b30c-4754-8c57-6c89b2963296.png\" alt=\"\" title=\"\"></p>\n    <p>同上, 采集\n        <code>公司url</code>字段\n        <br>\n        <img src=\"/static/images/2da8e8e6-d454-4713-9631-975644a15c81.png\" alt=\"\" title=\"\"></p>\n    <p>点击下一页, 选择\n        <code>翻页选择器</code>\n        <br>\n        <img src=\"/static/images/3d7d1bfc-b673-40c2-9943-b4e537fc22a1.png\" alt=\"\" title=\"\"></p>\n    <p>整体如下：\n        <br>主页面选择器：\n        <br>\n        <img src=\"/static/images/5f5724f9-48dc-478b-93d2-b1fed42889d6.png\" alt=\"\" title=\"\">\n        <br>选择器层级：\n        <br>\n        <img src=\"/static/images/c1284037-d84f-42c5-861f-d63c017fc7de.png\" alt=\"\" title=\"\">\n        <br>点击\n        <code>下一步</code>\n        <code>开始任务</code>启动任务, 然后再主界面进行任务管理或者\n        <code>查看数据</code>里下载数据\n        <br>\n        <img src=\"/static/images/2137d59b-71b9-4f71-a5f8-8fb114eadfa6.png\" alt=\"\" title=\"\"></p>\n    <h2 id=\"元素集选择器+翻页(2)+详情\">元素集选择器+翻页(2)+详情</h2>\n    <p>\n        <code>https://zhongshan.china.cn/search/fisnfv.shtml</code></p>\n    <h3 id=\"参数配置\">参数配置</h3>\n    <p>1.选择\n        <code>元素集选择器</code>\n        <br>\n        <img src=\"/static/images/e9ba8329-9af2-46d3-82fe-904585d95132.png\" alt=\"\" title=\"\"></p>\n    <p>2.配置\n        <code>翻页选择器</code>(翻页选择器分两种, 点击选择和手动配置, 优先使用手动配置, 选择器有全局表单验证, 改起来太麻烦, 使用手动配置时, 随便填个值), 手动配置时, 翻页url中变动的参数 使用\n        <code>%s</code>代替.\n        <br>\n        <img src=\"/static/images/795c3e35-7b8c-4e2d-9bd9-4fbf87f619e7.png\" alt=\"\" title=\"\"></p>\n    <p>3.进入\n        <code>元素集选择器</code>内, 新建\n        <code>产品名称</code>,\n        <code>所在地</code>和\n        <code>公司名称</code>选择器(在元素集选择器中, 默认以第一个元素集为模板, 其他范围内\n        <code>点击选择</code>按钮无法生效)\n        <br>\n        <strong>注意</strong>：在元素集选择器中不要选择\"多元素\"属性, 元素集选择器中的子选择器, 维度以\n        <code>元素集选择器</code>为准.\n        <br>\n        <img src=\"/static/images/e0d90b15-0d89-41a3-92bd-3b6b3d703f2a.jpg\" alt=\"\" title=\"\"></p>\n    <p>4.配置\n        <code>详情选择器</code>, 选择将要进入的标签, 保存\n        <br>\n        <img src=\"/static/images/993f90b4-ee2c-4e02-9b1f-76549a343599.png\" alt=\"\" title=\"\"></p>\n    <p>5.进入\n        <code>详情选择器</code>, 在页面中点击详情链接</p>\n    <p>6.进入详情页之后, 再配置一个\n        <code>详情选择器</code>进入联系页\n        <br>\n        <img src=\"/static/images/45afe047-fb6d-47b7-83b8-43216c5f396e.png\" alt=\"\" title=\"\"></p>\n    <p>7.在联系页中, 选择\n        <code>联系人</code>\n        <code>电话</code>\n        <code>地址</code>字段采集器\n        <br>\n        <img src=\"/static/images/2e7f279e-0f2f-4b7c-bc2d-172f7ba8f75c.png\" alt=\"\" title=\"\"></p>\n    <p>8.打开\n        <code>选择器树形图</code>查看选择器层级\n        <br>\n        <img src=\"/static/images/2f1eb188-2045-4864-9d2d-94303f8f8092.png\" alt=\"\" title=\"\"></p>\n    <p>8.\n        <code>下一步</code>开始任务, 注意请求间隔, 太快容易被封\n        <br>\n        <img src=\"/static/images/e0b5824e-fa27-4b11-ba8c-2c9195e213fa.png\" alt=\"\" title=\"\"></p>\n    <p>被封\n        <br>\n        <img src=\"/static/images/4.png\" alt=\"\" title=\"\"></p>\n    <p>9.查看/下载数据\n        <br>\n        <img src=\"/static/images/294b2416-6e38-41d4-8989-5cb80904ed49.png\" alt=\"\" title=\"\"></p>\n    <h1 id=\"可能存在的问题\">可能存在的问题</h1>\n    <h1 id=\"动态解析\">动态解析</h1>\n    <p>动态解析网页太慢, 资源占用过高, 显示内容和爬取内容不同, 造成显示内容和爬取内容不同主要因为网站自带js的运行导致的, 如果取消爬取网站自带js, 可能会造成依赖css无法加载, 前端展示效果极差和网页布局和渲染效果缺失, 留待以后解决.</p>\n    <h1 id=\"网页页模板不同\">网页页模板不同</h1>\n    <p>\n        <code>http://kungeina0315.51sole.com/companycontact.htm</code>\n        <br>\n        <code>http://jing18028106510.51sole.com/companycontact.htm</code></p>\n    <p>\n        <img src=\"/static/images/72c2b627-6338-41a7-8670-661cc7bf5dda.png\" alt=\"\" title=\"\">\n        <img src=\"/static/images/699f21fd-0cae-4078-8c43-1f0823038d87.png\" alt=\"\" title=\"\"></p>\n    <p>场景：两个详情页模板, 由于字段个数不同, 使用css选择器时, 对不同的模板选择字段, 会造成字段缺失或者错位的情况。 这两个页面中, 由于第二个页面多了\"传真\"和\"微信\"这两个字段, 导致相同的css选择器在匹配第一个页面的同时, 匹配第二个页面时\"传真\"字段之后的css选择器选择的字段值错位.</p>\n    <p>处理：使用css选择器选择整个内容块, 然后使用正则表达式提取采集的内容</p>\n    <p>\n        <img src=\"/static/images/396e4817-df36-4f9d-81f0-90d63b2a41a3.png\" alt=\"\" title=\"\"></p>\n    <p>如图所示: 采集\"手机\"字段, 选择整个内容块, 然后使用正则表达式提取.</p>\n    <h1 id=\"选择器无法选中\">选择器无法选中</h1>\n    <p>\n        <img src=\"/static/images/1c0aeff2-0045-48f9-80d5-3b070b42e490.png\" alt=\"\" title=\"\">\n        <img src=\"/static/images/bb25525b-648f-4a10-a271-e8ca7751e24c.png\" alt=\"\" title=\"\">\n        <br>\n        <code>点击选择</code>按钮很难选中元素时, 可以先选择他的父元素或子元素, 然后使用键盘按钮C或P调整.\n        <br>\n        <code>点击选择</code>没有反应, 本平台将采集网页放在本域名内, 跨域导致有些资源加载异常, 使得采集脚本无法加载, 此时只能手动填写css选择器.</p>\n    <wiz_tmp_tag id=\"wiz-table-range-border\" contenteditable=\"false\" style=\"display: none;\">\n        <div id=\"wiz-table-col-line\" style=\"display: none;\"></div>\n        <div id=\"wiz-table-row-line\" style=\"display: none;\"></div>\n        <div id=\"wiz-table-range-border_start\" style=\"display: none;\">\n            <div id=\"wiz-table-range-border_start_top\"></div>\n            <div id=\"wiz-table-range-border_start_right\"></div>\n            <div id=\"wiz-table-range-border_start_bottom\"></div>\n            <div id=\"wiz-table-range-border_start_left\"></div>\n            <div id=\"wiz-table-range-border_start_dot\"></div>\n        </div>\n        <div id=\"wiz-table-range-border_range\" style=\"display: none;\">\n            <div id=\"wiz-table-range-border_range_top\"></div>\n            <div id=\"wiz-table-range-border_range_right\"></div>\n            <div id=\"wiz-table-range-border_range_bottom\"></div>\n            <div id=\"wiz-table-range-border_range_left\"></div>\n            <div id=\"wiz-table-range-border_range_dot\"></div>\n        </div>\n    </wiz_tmp_tag>\n</div>\n</body>\n</html>"
  },
  {
    "path": "server/templates/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n</head>\n\n<body>\n    <nav class=\"navbar navbar-default navbar-static-top\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <a class=\"navbar-brand\" href=\"/\">可视化采集平台</a>\n            </div>\n\n            <div class=\"collapse navbar-collapse\" id=\"bs-example-navbar-collapse-1\">\n                <ul class=\"nav navbar-nav\">\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('config') }}\">新增任务</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('data') }}\">查看数据</a></li>\n                    <li><a class=\"cursor-pointer\" href=\"{{ reverse_url('read') }}\">读取配置</a></li>\n                </ul>\n                <ul class=\"nav navbar-nav navbar-right\">\n                    <li><a id=\"monitor\"></a></li>\n                    <li id=\"process-stats\"></li>\n                    <li><a href=\"{{ reverse_url('help') }}\">Help</a></li>\n                </ul>\n            </div>\n        </div>\n    </nav>\n    <div class=\"container\">\n        <div id=\"root\"></div>\n    </div>\n\n    <script>\n        window.WS_SERVER_ADDRESS = JSON.parse('{% raw json_encode(reverse_url(\"ws\")) %}');\n        window.START_CRAWL_URL = JSON.parse('{% raw json_encode(reverse_url(\"start\")) %}');\n        window.STOP_CRAWL_URL = JSON.parse('{% raw json_encode(reverse_url(\"stop\")) %}');\n        window.PAUSE_CRAWL_URL = JSON.parse('{% raw json_encode(reverse_url(\"pause\")) %}');\n        window.RESUME_CRAWL_URL = JSON.parse('{% raw json_encode(reverse_url(\"resume\")) %}');\n        window.INITIAL_PROCESS_STATS = JSON.parse('{% raw initial_process_stats_json %}');\n        {% block initial_data %}\n            window.INITIAL_DATA = JSON.parse('{% raw initial_data_json %}');\n        {% end %}\n    </script>\n    <script src=\"{{ static_url('build/vendor.js') }}\"></script>\n    <script src=\"{{ static_url('build/common.js') }}\"></script>\n    <script src=\"{{ static_url('build/main.js') }}\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "server/templates/read.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/bootstrap-treeview.min.css')}}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/base.css') }}\" rel=\"stylesheet\">\n    <link href=\"{{ static_url('css/bootstrap-table.min.css') }}\" rel=\"stylesheet\">\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-treeview.min.js')}}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table-zh-CN.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/tableExport.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table-export.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-table-treegrid.js') }}\"></script>\n    <script src=\"{{ static_url('js/read.js') }}\"></script>\n</head>\n<body>\n    {% include \"base.html\" %}\n    <div class=\"container-fluid\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-xs-2\">\n\t\t\t\t<div id=\"config_tree\"></div>\n\t\t\t</div>\n\t\t\t<div class=\"col-xs-8\">\n                <div class=\"panel panel-default\">\n                    <div class=\"panel-heading\">\n                        <h4 class=\"panel-title\">\n                            <a data-toggle=\"collapse\" href=\"#collapseOne\">\n                                请求配置\n                            </a>\n                        </h4>\n                    </div>\n                    <div id=\"collapseOne\" class=\"panel-collapse collapse in\">\n                        <div class=\"panel-body\" id=\"config_form\">\n                        </div>\n                    </div>\n                </div>\n                <div class=\"panel panel-default\">\n                    <div class=\"panel-heading\">\n                        <h4 class=\"panel-title\">\n                            <a data-toggle=\"collapse\" href=\"#collapseTwo\">\n                                选择器配置\n                            </a>\n                        </h4>\n                    </div>\n                    <div id=\"collapseTwo\" class=\"panel-collapse collapse in\">\n                        <div class=\"panel-body\">\n                            <table id=\"collection_data\"></table>\n                        </div>\n                    </div>\n                </div>\n                <div id=\"button-group\">\n                    <button type=\"button\" class=\"btn btn-primary btn-sm\" id=\"start-task\">开始任务</button>\n                    <button type=\"button\" class=\"btn btn-primary btn-sm\" id=\"delete-task\">删除配置</button>\n                </div>\n                <div class=\"alert alert-success hide scraping-in-progress\" role=\"alert\">\n                    任务开始成功.\n                </div>\n\t\t\t</div>\n\t\t</div>\n    </div>\n    <script>\n        var tree = {% raw result %};\n        $('#config_tree').treeview({\n\t\t\tdata: tree,\n\t\t\tshowTags: true,\n\t\t\tshowBorder: false,\n            color: \"#428bca\",\n\t\t\tonNodeSelected: function(event, node) {\n\t\t\t    initColumns(node.text);\n            }\n\t\t});\n    </script>\n</body>\n</html>"
  },
  {
    "path": "server/templates/work.html",
    "content": "<!DOCTYPE html>\n<html>\n<head lang=\"en\">\n    <meta charset=\"UTF-8\">\n    <title>可视化采集平台</title>\n    <link rel=\"stylesheet\" href=\"{{ static_url('lib/bootstrap-3.3.7/css/bootstrap.css') }}\">\n    <link rel=\"stylesheet\" href=\"{{ static_url('lib/jquery.bootstrapvalidator/bootstrapValidator.css') }}\">\n    <link rel=\"stylesheet\" href=\"{{ static_url('css/content_script.css') }}\">\n    <link href=\"{{ static_url('favicon.ico') }}\" type=\"image/x-icon\" rel=\"shortcut icon\" >\n    <script src=\"{{ static_url('lib/jquery-2.1.4.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/pouchdb-nightly.min.js') }}\"></script>\n    <script src=\"{{ static_url('lib/bootstrap-3.3.7/js/bootstrap.js') }}\"></script>\n    <script src=\"{{ static_url('lib/jquery.bootstrapvalidator/bootstrapValidator.js') }}\"></script>\n    <script src=\"{{ static_url('lib/d3.v3.js') }}\" charset=\"UTF-8\"></script>\n    <script src=\"{{ static_url('lib/ICanHaz.js') }}\"></script>\n    <script src=\"{{ static_url('lib/base64.js') }}\"></script>\n    <link rel=\"stylesheet\" href=\"{{ static_url('css/work-style.css') }}\">\n\n    <script src=\"{{ static_url('lib/jquery.whencallsequentially.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/ContentScript.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Config.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/SelectorList.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorDetail.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorElement.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorLink.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorPopupLink.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorGroup.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorText.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorImage.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorHTML.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorElementAttribute.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorTable.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorElementScroll.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Selector/SelectorElementClick.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Sitemap.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/SelectorGraph.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/SelectorGraphv2.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Store.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/StoreDevtools.js') }}\"></script>\n    <script src=\"{{ static_url('scripts/Controller.js') }}\"></script>\n</head>\n\n<body>\n    {% include \"base.html\" %}\n    <div class=\"container-fluid\">\n        <div class=\"row\">\n            <ol class=\"breadcrumb\">\n                <li><a href=\"{{ reverse_url('index') }}\">采集任务</a></li>\n                <li><a href=\"{{ reverse_url('config') }}\">请求配置</a></li>\n                <li class=\"active\">参数配置</li>\n            </ol>\n            <!-- iframe主体 -->\n            <iframe name=\"collect\" src=\"{{ static_url('spider/start.html') }}\"></iframe>\n        </div>\n    </div>\n    <!-- 配置栏 -->\n    <div class=\"sidebar\"></div>\n    <script>\n        window.CONFIG_DATA = JSON.parse('{% raw config_data %}');\n        $('iframe').css({\"width\": '100%', \"height\": \"580px\"});\n        $(function (){\n            var store = new StoreDevtools();\n            new SitemapController({\n                store: store,\n                templateDir: 'views/'\n            });\n        })\n    </script>\n</body>"
  },
  {
    "path": "server.py",
    "content": "# !/usr/bin/python\n# -*- coding: utf-8 -*-\n\nimport logging\n\nimport tornado.platform.twisted\nfrom server import __version__\nfrom tornado.ioloop import IOLoop\n\nfrom server.config.opts import opts\n\n# 日志\nlogger = logging.getLogger('spider')\n\ndef setup_event_loop(use_twisted_reactor, debug=True):\n    \"\"\"启动event_loop\"\"\"\n    if use_twisted_reactor:\n        tornado.platform.twisted.TwistedIOLoop().install()\n        if debug:\n            print(\"Using Twisted reactor as a Tornado event loop\")\n    else:\n        tornado.platform.twisted.install()\n        IOLoop.instance().set_blocking_log_threshold(0.5)\n        if debug:\n            print(\"Using Tornado event loop as a Twisted reactor\")\n\ndef main(port, host, start_manhole, manhole_port, manhole_host, loglevel, opts):\n    \"\"\"主函数\"\"\"\n    from server.spider.handlers import get_application\n    from server.spider.crawler_process import MyselfCrawlerProcess\n    from server.spider import manhole\n    # 日志等级\n    settings = {'LOG_LEVEL': loglevel}\n    crawler_process = MyselfCrawlerProcess(settings)\n\n    app = get_application(crawler_process, opts)\n    app.listen(int(port), host)\n    logger.info(\"scrapy v%s is started on %s:%s\" % (__version__, host, port))\n\n    if start_manhole:\n        manhole.start(manhole_port, manhole_host, {'cp': crawler_process})\n        logger.info(\"Manhole server is started on %s:%s\" % (manhole_host, manhole_port))\n\n    crawler_process.start(stop_after_crawl=False)\n\n\nif __name__ == '__main__':\n    setup_event_loop(\n        use_twisted_reactor=False,\n        debug=False\n    )\n\n    main(\n        port=int(opts['spider']['port']),\n        host=opts['spider']['host'],\n        start_manhole=opts['spider.manhole']['enabled'],\n        manhole_port=int(opts['spider.manhole']['port']),\n        manhole_host=opts['spider.manhole']['host'],\n        loglevel=opts['spider']['loglevel'],\n        opts=opts,\n    )"
  }
]